@nocobase/plugin-workflow-manual 1.0.0-alpha.2 → 1.0.0-alpha.3

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.
Files changed (88) hide show
  1. package/dist/client/WorkflowTodo.d.ts +8 -0
  2. package/dist/client/WorkflowTodoBlockInitializer.d.ts +8 -0
  3. package/dist/client/index.d.ts +8 -0
  4. package/dist/client/index.js +9 -0
  5. package/dist/client/instruction/AssigneesSelect.d.ts +8 -0
  6. package/dist/client/instruction/FormBlockInitializer.d.ts +8 -0
  7. package/dist/client/instruction/FormBlockProvider.d.ts +8 -0
  8. package/dist/client/instruction/ModeConfig.d.ts +8 -0
  9. package/dist/client/instruction/SchemaConfig.d.ts +8 -0
  10. package/dist/client/instruction/createManualFormBlockUISchema.d.ts +8 -0
  11. package/dist/client/instruction/forms/create.d.ts +8 -0
  12. package/dist/client/instruction/forms/custom.d.ts +8 -0
  13. package/dist/client/instruction/forms/update.d.ts +8 -0
  14. package/dist/client/instruction/index.d.ts +8 -0
  15. package/dist/client/instruction/utils.d.ts +8 -0
  16. package/dist/externalVersion.js +18 -9
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.js +9 -0
  19. package/dist/locale/index.d.ts +8 -0
  20. package/dist/locale/index.js +9 -0
  21. package/dist/server/ManualInstruction.d.ts +8 -0
  22. package/dist/server/ManualInstruction.js +9 -0
  23. package/dist/server/Plugin.d.ts +8 -0
  24. package/dist/server/Plugin.js +9 -0
  25. package/dist/server/actions.d.ts +8 -0
  26. package/dist/server/actions.js +9 -0
  27. package/dist/server/collections/1-users_jobs.d.ts +8 -0
  28. package/dist/server/collections/1-users_jobs.js +9 -0
  29. package/dist/server/collections/2-jobs.d.ts +8 -0
  30. package/dist/server/collections/2-jobs.js +9 -0
  31. package/dist/server/collections/3-users.d.ts +8 -0
  32. package/dist/server/collections/3-users.js +9 -0
  33. package/dist/server/forms/create.d.ts +8 -0
  34. package/dist/server/forms/create.js +9 -0
  35. package/dist/server/forms/index.d.ts +8 -0
  36. package/dist/server/forms/index.js +9 -0
  37. package/dist/server/forms/update.d.ts +8 -0
  38. package/dist/server/forms/update.js +9 -0
  39. package/dist/server/index.d.ts +8 -0
  40. package/dist/server/index.js +9 -0
  41. package/dist/server/migrations/20240325213145-fix-schema.d.ts +8 -0
  42. package/dist/server/migrations/20240325213145-fix-schema.js +9 -0
  43. package/package.json +2 -2
  44. package/src/client/WorkflowTodo.tsx +0 -647
  45. package/src/client/WorkflowTodoBlockInitializer.tsx +0 -32
  46. package/src/client/__e2e__/assignees.test.ts +0 -0
  47. package/src/client/__e2e__/createRecordForm.test.ts +0 -2287
  48. package/src/client/__e2e__/customFormBlocks.test.ts +0 -1933
  49. package/src/client/__e2e__/datablocks.test.ts +0 -1208
  50. package/src/client/__e2e__/updateRecordForm.test.ts +0 -2338
  51. package/src/client/__e2e__/workflowTodo.test.ts +0 -242
  52. package/src/client/index.ts +0 -51
  53. package/src/client/instruction/AssigneesSelect.tsx +0 -39
  54. package/src/client/instruction/FormBlockInitializer.tsx +0 -79
  55. package/src/client/instruction/FormBlockProvider.tsx +0 -92
  56. package/src/client/instruction/ModeConfig.tsx +0 -85
  57. package/src/client/instruction/SchemaConfig.tsx +0 -659
  58. package/src/client/instruction/createManualFormBlockUISchema.ts +0 -5
  59. package/src/client/instruction/forms/create.tsx +0 -123
  60. package/src/client/instruction/forms/custom.tsx +0 -439
  61. package/src/client/instruction/forms/update.tsx +0 -167
  62. package/src/client/instruction/index.tsx +0 -160
  63. package/src/client/instruction/utils.ts +0 -19
  64. package/src/index.ts +0 -2
  65. package/src/locale/en-US.json +0 -30
  66. package/src/locale/index.ts +0 -14
  67. package/src/locale/ko_KR.json +0 -32
  68. package/src/locale/zh-CN.json +0 -32
  69. package/src/server/ManualInstruction.ts +0 -157
  70. package/src/server/Plugin.ts +0 -43
  71. package/src/server/__tests__/assignees.test.ts +0 -153
  72. package/src/server/__tests__/collections/categories.ts +0 -15
  73. package/src/server/__tests__/collections/comments.ts +0 -24
  74. package/src/server/__tests__/collections/posts.ts +0 -40
  75. package/src/server/__tests__/collections/replies.ts +0 -9
  76. package/src/server/__tests__/collections/tags.ts +0 -15
  77. package/src/server/__tests__/data-source.test.ts +0 -223
  78. package/src/server/__tests__/form.test.ts +0 -637
  79. package/src/server/__tests__/mode.test.ts +0 -561
  80. package/src/server/actions.ts +0 -103
  81. package/src/server/collections/1-users_jobs.ts +0 -52
  82. package/src/server/collections/2-jobs.ts +0 -19
  83. package/src/server/collections/3-users.ts +0 -17
  84. package/src/server/forms/create.ts +0 -30
  85. package/src/server/forms/index.ts +0 -13
  86. package/src/server/forms/update.ts +0 -30
  87. package/src/server/index.ts +0 -1
  88. package/src/server/migrations/20240325213145-fix-schema.ts +0 -82
@@ -1,2338 +0,0 @@
1
- import { faker } from '@faker-js/faker';
2
- import {
3
- CollectionTriggerNode,
4
- ManualNode,
5
- apiCreateWorkflow,
6
- apiDeleteWorkflow,
7
- apiFilterList,
8
- apiGetWorkflow,
9
- apiGetWorkflowNodeExecutions,
10
- apiUpdateWorkflowTrigger,
11
- appendJsonCollectionName,
12
- generalWithNoRelationalFields,
13
- apiGetDataSourceCount,
14
- } from '@nocobase/plugin-workflow-test/e2e';
15
- import { expect, test } from '@nocobase/test/e2e';
16
- import { dayjs } from '@nocobase/utils';
17
-
18
- test.describe('block configuration', () => {});
19
-
20
- test.describe('field configuration', () => {});
21
-
22
- test.describe('field data update', () => {
23
- test('Collection event to add a data trigger, update single-line text data', async ({
24
- page,
25
- mockPage,
26
- mockCollections,
27
- mockRecords,
28
- }) => {
29
- //数据表后缀标识
30
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
31
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
32
-
33
- // 创建触发器节点数据表
34
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
35
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
36
- const triggerNodeFieldName = 'orgname';
37
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
38
- await mockCollections(
39
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
40
- .collections,
41
- );
42
- // 创建Manual节点数据表
43
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
44
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
45
- const manualNodeFieldName = 'orgname';
46
- const manualNodeFieldDisplayName = '公司名称(单行文本)';
47
- await mockCollections(
48
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
49
- .collections,
50
- );
51
- const manualNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
52
- const manualNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20 }];
53
- const manualNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30 }];
54
- const manualNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40 }];
55
- const manualNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10 }];
56
- const manualNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20 }];
57
- const manualNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30 }];
58
- const manualNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40 }];
59
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
60
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
61
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
62
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
63
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
64
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
65
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
66
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
67
- //添加工作流
68
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
69
- const workflowData = {
70
- current: true,
71
- options: { deleteExecutionOnStatus: [] },
72
- title: workFlowName,
73
- type: 'collection',
74
- enabled: true,
75
- };
76
- const workflow = await apiCreateWorkflow(workflowData);
77
- const workflowObj = JSON.parse(JSON.stringify(workflow));
78
- const workflowId = workflowObj.id;
79
- //配置工作流触发器
80
- const triggerNodeData = {
81
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
82
- };
83
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
84
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
85
- //配置Manual节点
86
- await page.goto(`admin/workflow/workflows/${workflowId}`);
87
- await page.waitForLoadState('networkidle');
88
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
89
- await collectionTriggerNode.addNodeButton.click();
90
- await page.getByRole('button', { name: 'manual', exact: true }).click();
91
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
92
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
93
- const manualNode = new ManualNode(page, manualNodeName);
94
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
95
- await manualNode.nodeConfigure.click();
96
- await manualNode.assigneesDropDown.click();
97
- await page.getByRole('option', { name: 'Super Admin' }).click();
98
- await manualNode.configureUserInterfaceButton.click();
99
- await manualNode.addBlockButton.hover();
100
- await manualNode.updateRecordFormMenu.hover();
101
- const dataSourcesCount = await apiGetDataSourceCount();
102
- if (dataSourcesCount > 1) {
103
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
104
- }
105
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
106
- await page.mouse.move(300, 0, { steps: 100 });
107
- await page
108
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
109
- .hover();
110
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
111
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
112
- await page.getByText('Add condition', { exact: true }).click();
113
- await page.getByTestId('select-filter-field').click();
114
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
115
- await page.getByTestId('select-filter-operator').click();
116
- await page.getByRole('option', { name: 'exists', exact: true }).click();
117
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
118
- await page
119
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
120
- .hover();
121
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
122
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
123
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
124
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
125
- await page.getByRole('button', { name: 'OK', exact: true }).click();
126
- await page
127
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
128
- .hover();
129
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
130
- await page.mouse.move(300, 0, { steps: 100 });
131
- await page.mouse.click(300, 0);
132
- await manualNode.submitButton.click();
133
- await page.waitForLoadState('networkidle');
134
-
135
- // 2、测试步骤:添加数据触发工作流
136
- const triggerNodeCollectionRecordOne =
137
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
138
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
139
- { orgname: triggerNodeCollectionRecordOne },
140
- ]);
141
- await page.waitForTimeout(1000);
142
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
143
- const getWorkflow = await apiGetWorkflow(workflowId);
144
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
145
- const getWorkflowExecuted = getWorkflowObj.executed;
146
- expect(getWorkflowExecuted).toBe(1);
147
-
148
- const newPage = mockPage();
149
- await newPage.goto();
150
- await page.waitForLoadState('networkidle');
151
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
152
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
153
- await page.mouse.move(300, 0, { steps: 100 });
154
- await page.waitForTimeout(300);
155
- await page
156
- .locator(`//td[span[text()="${manualNodeName}"]]`)
157
- .locator('xpath=preceding-sibling::td[1]')
158
- .locator('text=View')
159
- .click();
160
- const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
161
- await page.getByRole('textbox').fill(manualNodeRecord);
162
- await page.getByRole('button', { name: 'Continue the process' }).click();
163
-
164
- await page.waitForTimeout(1000);
165
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
166
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
167
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
168
- return b.id - a.id;
169
- });
170
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
171
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
172
- const manualNodeJobStatus = manualNodeJob.status;
173
- expect(manualNodeJobStatus).toBe(1);
174
-
175
- const manualNodeJobResult = manualNodeJob.result;
176
- const hasOrgname = Object.values(manualNodeJobResult).some(
177
- (value) => (value as { orgname: string }).orgname === manualNodeRecord,
178
- );
179
- expect(hasOrgname).toBe(true);
180
-
181
- const filter = `pageSize=20&page=1&filter={"$and":[{"orgname":{"$eq":"${manualNodeRecord}"}}]}`;
182
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
183
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
184
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
185
-
186
- // 4、后置处理:删除工作流
187
- await apiDeleteWorkflow(workflowId);
188
- });
189
-
190
- test('Collection event to add a data trigger, update multi-line text data', async ({
191
- page,
192
- mockPage,
193
- mockCollections,
194
- mockRecords,
195
- }) => {
196
- //数据表后缀标识
197
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
198
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
199
-
200
- // 创建触发器节点数据表
201
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
202
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
203
- const triggerNodeFieldName = 'orgname';
204
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
205
- await mockCollections(
206
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
207
- .collections,
208
- );
209
- // 创建Manual节点数据表
210
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
211
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
212
- const manualNodeFieldName = 'address';
213
- const manualNodeFieldDisplayName = '公司地址(多行文本)';
214
- await mockCollections(
215
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
216
- .collections,
217
- );
218
- const manualNodeCollectioRecordOne = [{ address: '公司地址(多行文本)1', status_singleselect: '1', staffnum: 10 }];
219
- const manualNodeCollectioRecordTwo = [{ address: '公司地址(多行文本)2', status_singleselect: '2', staffnum: 20 }];
220
- const manualNodeCollectioRecordThree = [{ address: '公司地址(多行文本)3', status_singleselect: '3', staffnum: 30 }];
221
- const manualNodeCollectioRecordFour = [{ address: '公司地址(多行文本)4', status_singleselect: '4', staffnum: 40 }];
222
- const manualNodeCollectioRecordFive = [{ address: '公司地址(多行文本)5', status_singleselect: '5', staffnum: 10 }];
223
- const manualNodeCollectioRecordSix = [{ address: '公司地址(多行文本)6', status_singleselect: '6', staffnum: 20 }];
224
- const manualNodeCollectioRecordSeven = [{ address: '公司地址(多行文本)7', status_singleselect: '7', staffnum: 30 }];
225
- const manualNodeCollectioRecordEight = [{ address: '公司地址(多行文本)8', status_singleselect: '8', staffnum: 40 }];
226
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
227
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
228
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
229
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
230
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
231
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
232
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
233
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
234
- //添加工作流
235
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
236
- const workflowData = {
237
- current: true,
238
- options: { deleteExecutionOnStatus: [] },
239
- title: workFlowName,
240
- type: 'collection',
241
- enabled: true,
242
- };
243
- const workflow = await apiCreateWorkflow(workflowData);
244
- const workflowObj = JSON.parse(JSON.stringify(workflow));
245
- const workflowId = workflowObj.id;
246
- //配置工作流触发器
247
- const triggerNodeData = {
248
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
249
- };
250
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
251
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
252
- //配置Manual节点
253
- await page.goto(`admin/workflow/workflows/${workflowId}`);
254
- await page.waitForLoadState('networkidle');
255
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
256
- await collectionTriggerNode.addNodeButton.click();
257
- await page.getByRole('button', { name: 'manual', exact: true }).click();
258
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
259
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
260
- const manualNode = new ManualNode(page, manualNodeName);
261
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
262
- await manualNode.nodeConfigure.click();
263
- await manualNode.assigneesDropDown.click();
264
- await page.getByRole('option', { name: 'Super Admin' }).click();
265
- await manualNode.configureUserInterfaceButton.click();
266
- await manualNode.addBlockButton.hover();
267
- await manualNode.updateRecordFormMenu.hover();
268
- const dataSourcesCount = await apiGetDataSourceCount();
269
- if (dataSourcesCount > 1) {
270
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
271
- }
272
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
273
- await page.mouse.move(300, 0, { steps: 100 });
274
- await page
275
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
276
- .hover();
277
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
278
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
279
- await page.getByText('Add condition', { exact: true }).click();
280
- await page.getByTestId('select-filter-field').click();
281
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
282
- await page.getByTestId('select-filter-operator').click();
283
- await page.getByRole('option', { name: 'exists', exact: true }).click();
284
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
285
- await page
286
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
287
- .hover();
288
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
289
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
290
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
291
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
292
- await page.getByRole('button', { name: 'OK', exact: true }).click();
293
- await page
294
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
295
- .hover();
296
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
297
- await page.mouse.move(300, 0, { steps: 100 });
298
- await page.mouse.click(300, 0);
299
- await manualNode.submitButton.click();
300
- await page.waitForLoadState('networkidle');
301
-
302
- // 2、测试步骤:添加数据触发工作流
303
- const triggerNodeCollectionRecordOne =
304
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
305
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
306
- { orgname: triggerNodeCollectionRecordOne },
307
- ]);
308
- await page.waitForTimeout(1000);
309
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
310
- const getWorkflow = await apiGetWorkflow(workflowId);
311
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
312
- const getWorkflowExecuted = getWorkflowObj.executed;
313
- expect(getWorkflowExecuted).toBe(1);
314
-
315
- const newPage = mockPage();
316
- await newPage.goto();
317
- await page.waitForLoadState('networkidle');
318
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
319
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
320
- await page.mouse.move(300, 0, { steps: 100 });
321
- await page.waitForTimeout(300);
322
- await page
323
- .locator(`//td[span[text()="${manualNodeName}"]]`)
324
- .locator('xpath=preceding-sibling::td[1]')
325
- .locator('text=View')
326
- .click();
327
- const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
328
- await page.getByRole('textbox').fill(manualNodeRecord);
329
- await page.getByRole('button', { name: 'Continue the process' }).click();
330
-
331
- await page.waitForTimeout(1000);
332
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
333
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
334
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
335
- return b.id - a.id;
336
- });
337
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
338
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
339
- const manualNodeJobStatus = manualNodeJob.status;
340
- expect(manualNodeJobStatus).toBe(1);
341
-
342
- const manualNodeJobResult = manualNodeJob.result;
343
- const hasAddress = Object.values(manualNodeJobResult).some(
344
- (value) => (value as { address: string }).address === manualNodeRecord,
345
- );
346
- expect(hasAddress).toBe(true);
347
-
348
- const filter = `pageSize=20&page=1&filter={"$and":[{"address":{"$eq":"${manualNodeRecord}"}}]}`;
349
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
350
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
351
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
352
-
353
- // 4、后置处理:删除工作流
354
- await apiDeleteWorkflow(workflowId);
355
- });
356
-
357
- test('Collection event to add a data trigger, update mobile phone number data', async ({
358
- page,
359
- mockPage,
360
- mockCollections,
361
- mockRecords,
362
- }) => {
363
- //数据表后缀标识
364
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
365
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
366
-
367
- // 创建触发器节点数据表
368
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
369
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
370
- const triggerNodeFieldName = 'orgname';
371
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
372
- await mockCollections(
373
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
374
- .collections,
375
- );
376
- // 创建Manual节点数据表
377
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
378
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
379
- const manualNodeFieldName = 'phone';
380
- const manualNodeFieldDisplayName = '负责人电话(手机号码)';
381
- await mockCollections(
382
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
383
- .collections,
384
- );
385
- const manualNodeCollectioRecordOne = [{ phone: '负责人电话(手机号码)1', status_singleselect: '1', staffnum: 10 }];
386
- const manualNodeCollectioRecordTwo = [{ phone: '负责人电话(手机号码)2', status_singleselect: '2', staffnum: 20 }];
387
- const manualNodeCollectioRecordThree = [{ phone: '负责人电话(手机号码)3', status_singleselect: '3', staffnum: 30 }];
388
- const manualNodeCollectioRecordFour = [{ phone: '负责人电话(手机号码)4', status_singleselect: '4', staffnum: 40 }];
389
- const manualNodeCollectioRecordFive = [{ phone: '负责人电话(手机号码)5', status_singleselect: '5', staffnum: 10 }];
390
- const manualNodeCollectioRecordSix = [{ phone: '负责人电话(手机号码)6', status_singleselect: '6', staffnum: 20 }];
391
- const manualNodeCollectioRecordSeven = [{ phone: '负责人电话(手机号码)7', status_singleselect: '7', staffnum: 30 }];
392
- const manualNodeCollectioRecordEight = [{ phone: '负责人电话(手机号码)8', status_singleselect: '8', staffnum: 40 }];
393
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
394
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
395
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
396
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
397
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
398
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
399
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
400
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
401
- //添加工作流
402
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
403
- const workflowData = {
404
- current: true,
405
- options: { deleteExecutionOnStatus: [] },
406
- title: workFlowName,
407
- type: 'collection',
408
- enabled: true,
409
- };
410
- const workflow = await apiCreateWorkflow(workflowData);
411
- const workflowObj = JSON.parse(JSON.stringify(workflow));
412
- const workflowId = workflowObj.id;
413
- //配置工作流触发器
414
- const triggerNodeData = {
415
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
416
- };
417
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
418
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
419
- //配置Manual节点
420
- await page.goto(`admin/workflow/workflows/${workflowId}`);
421
- await page.waitForLoadState('networkidle');
422
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
423
- await collectionTriggerNode.addNodeButton.click();
424
- await page.getByRole('button', { name: 'manual', exact: true }).click();
425
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
426
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
427
- const manualNode = new ManualNode(page, manualNodeName);
428
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
429
- await manualNode.nodeConfigure.click();
430
- await manualNode.assigneesDropDown.click();
431
- await page.getByRole('option', { name: 'Super Admin' }).click();
432
- await manualNode.configureUserInterfaceButton.click();
433
- await manualNode.addBlockButton.hover();
434
- await manualNode.updateRecordFormMenu.hover();
435
- const dataSourcesCount = await apiGetDataSourceCount();
436
- if (dataSourcesCount > 1) {
437
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
438
- }
439
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
440
- await page.mouse.move(300, 0, { steps: 100 });
441
- await page
442
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
443
- .hover();
444
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
445
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
446
- await page.getByText('Add condition', { exact: true }).click();
447
- await page.getByTestId('select-filter-field').click();
448
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
449
- await page.getByTestId('select-filter-operator').click();
450
- await page.getByRole('option', { name: 'exists', exact: true }).click();
451
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
452
- await page
453
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
454
- .hover();
455
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
456
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
457
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
458
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
459
- await page.getByRole('button', { name: 'OK', exact: true }).click();
460
- await page
461
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
462
- .hover();
463
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
464
- await page.mouse.move(300, 0, { steps: 100 });
465
- await page.mouse.click(300, 0);
466
- await manualNode.submitButton.click();
467
- await page.waitForLoadState('networkidle');
468
-
469
- // 2、测试步骤:添加数据触发工作流
470
- const triggerNodeCollectionRecordOne =
471
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
472
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
473
- { orgname: triggerNodeCollectionRecordOne },
474
- ]);
475
- await page.waitForTimeout(1000);
476
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
477
- const getWorkflow = await apiGetWorkflow(workflowId);
478
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
479
- const getWorkflowExecuted = getWorkflowObj.executed;
480
- expect(getWorkflowExecuted).toBe(1);
481
-
482
- const newPage = mockPage();
483
- await newPage.goto();
484
- await page.waitForLoadState('networkidle');
485
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
486
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
487
- await page.mouse.move(300, 0, { steps: 100 });
488
- await page.waitForTimeout(300);
489
- await page
490
- .locator(`//td[span[text()="${manualNodeName}"]]`)
491
- .locator('xpath=preceding-sibling::td[1]')
492
- .locator('text=View')
493
- .click();
494
- const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
495
- await page.getByRole('textbox').fill(manualNodeRecord);
496
- await page.getByRole('button', { name: 'Continue the process' }).click();
497
-
498
- await page.waitForTimeout(1000);
499
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
500
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
501
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
502
- return b.id - a.id;
503
- });
504
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
505
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
506
- const manualNodeJobStatus = manualNodeJob.status;
507
- expect(manualNodeJobStatus).toBe(1);
508
-
509
- const manualNodeJobResult = manualNodeJob.result;
510
- const hasPhone = Object.values(manualNodeJobResult).some(
511
- (value) => (value as { phone: string }).phone === manualNodeRecord,
512
- );
513
- expect(hasPhone).toBe(true);
514
-
515
- const filter = `pageSize=20&page=1&filter={"$and":[{"phone":{"$eq":"${manualNodeRecord}"}}]}`;
516
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
517
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
518
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
519
-
520
- // 4、后置处理:删除工作流
521
- await apiDeleteWorkflow(workflowId);
522
- });
523
-
524
- test('Collection event to add a data trigger, update Email Data', async ({
525
- page,
526
- mockPage,
527
- mockCollections,
528
- mockRecords,
529
- }) => {
530
- //数据表后缀标识
531
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
532
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
533
-
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
- // 创建Manual节点数据表
544
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
545
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
546
- const manualNodeFieldName = 'email';
547
- const manualNodeFieldDisplayName = '电子邮箱(电子邮箱)';
548
- await mockCollections(
549
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
550
- .collections,
551
- );
552
- const manualNodeCollectioRecordOne = [{ email: '1@1.com', status_singleselect: '1', staffnum: 10 }];
553
- const manualNodeCollectioRecordTwo = [{ email: '2@2.com', status_singleselect: '2', staffnum: 20 }];
554
- const manualNodeCollectioRecordThree = [{ email: '3@3.com', status_singleselect: '3', staffnum: 30 }];
555
- const manualNodeCollectioRecordFour = [{ email: '4@4.com', status_singleselect: '4', staffnum: 40 }];
556
- const manualNodeCollectioRecordFive = [{ email: '5@5.com', status_singleselect: '5', staffnum: 10 }];
557
- const manualNodeCollectioRecordSix = [{ email: '6@6.com', status_singleselect: '6', staffnum: 20 }];
558
- const manualNodeCollectioRecordSeven = [{ email: '7@7.com', status_singleselect: '7', staffnum: 30 }];
559
- const manualNodeCollectioRecordEight = [{ email: '8@8.com', status_singleselect: '8', staffnum: 40 }];
560
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
561
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
562
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
563
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
564
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
565
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
566
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
567
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
568
- //添加工作流
569
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
570
- const workflowData = {
571
- current: true,
572
- options: { deleteExecutionOnStatus: [] },
573
- title: workFlowName,
574
- type: 'collection',
575
- enabled: true,
576
- };
577
- const workflow = await apiCreateWorkflow(workflowData);
578
- const workflowObj = JSON.parse(JSON.stringify(workflow));
579
- const workflowId = workflowObj.id;
580
- //配置工作流触发器
581
- const triggerNodeData = {
582
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
583
- };
584
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
585
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
586
- //配置Manual节点
587
- await page.goto(`admin/workflow/workflows/${workflowId}`);
588
- await page.waitForLoadState('networkidle');
589
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
590
- await collectionTriggerNode.addNodeButton.click();
591
- await page.getByRole('button', { name: 'manual', exact: true }).click();
592
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
593
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
594
- const manualNode = new ManualNode(page, manualNodeName);
595
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
596
- await manualNode.nodeConfigure.click();
597
- await manualNode.assigneesDropDown.click();
598
- await page.getByRole('option', { name: 'Super Admin' }).click();
599
- await manualNode.configureUserInterfaceButton.click();
600
- await manualNode.addBlockButton.hover();
601
- await manualNode.updateRecordFormMenu.hover();
602
- const dataSourcesCount = await apiGetDataSourceCount();
603
- if (dataSourcesCount > 1) {
604
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
605
- }
606
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
607
- await page.mouse.move(300, 0, { steps: 100 });
608
- await page
609
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
610
- .hover();
611
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
612
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
613
- await page.getByText('Add condition', { exact: true }).click();
614
- await page.getByTestId('select-filter-field').click();
615
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
616
- await page.getByTestId('select-filter-operator').click();
617
- await page.getByRole('option', { name: 'exists', exact: true }).click();
618
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
619
- await page
620
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
621
- .hover();
622
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
623
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
624
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
625
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
626
- await page.getByRole('button', { name: 'OK', exact: true }).click();
627
- await page
628
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
629
- .hover();
630
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
631
- await page.mouse.move(300, 0, { steps: 100 });
632
- await page.mouse.click(300, 0);
633
- await manualNode.submitButton.click();
634
- await page.waitForLoadState('networkidle');
635
-
636
- // 2、测试步骤:添加数据触发工作流
637
- const triggerNodeCollectionRecordOne =
638
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
639
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
640
- { orgname: triggerNodeCollectionRecordOne },
641
- ]);
642
- await page.waitForTimeout(1000);
643
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
644
- const getWorkflow = await apiGetWorkflow(workflowId);
645
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
646
- const getWorkflowExecuted = getWorkflowObj.executed;
647
- expect(getWorkflowExecuted).toBe(1);
648
-
649
- const newPage = mockPage();
650
- await newPage.goto();
651
- await page.waitForLoadState('networkidle');
652
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
653
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
654
- await page.mouse.move(300, 0, { steps: 100 });
655
- await page.waitForTimeout(300);
656
- await page
657
- .locator(`//td[span[text()="${manualNodeName}"]]`)
658
- .locator('xpath=preceding-sibling::td[1]')
659
- .locator('text=View')
660
- .click();
661
- const manualNodeRecord = faker.internet.email();
662
- await page.getByRole('textbox').fill(manualNodeRecord);
663
- await page.getByRole('button', { name: 'Continue the process' }).click();
664
-
665
- await page.waitForTimeout(1000);
666
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
667
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
668
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
669
- return b.id - a.id;
670
- });
671
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
672
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
673
- const manualNodeJobStatus = manualNodeJob.status;
674
- expect(manualNodeJobStatus).toBe(1);
675
-
676
- const manualNodeJobResult = manualNodeJob.result;
677
- const hasEmail = Object.values(manualNodeJobResult).some(
678
- (value) => (value as { email: string }).email === manualNodeRecord,
679
- );
680
- expect(hasEmail).toBe(true);
681
-
682
- const filter = `pageSize=20&page=1&filter={"$and":[{"email":{"$eq":"${manualNodeRecord}"}}]}`;
683
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
684
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
685
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
686
-
687
- // 4、后置处理:删除工作流
688
- await apiDeleteWorkflow(workflowId);
689
- });
690
-
691
- test('Collection event to add a data trigger, update integer data', async ({
692
- page,
693
- mockPage,
694
- mockCollections,
695
- mockRecords,
696
- }) => {
697
- //数据表后缀标识
698
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
699
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
700
-
701
- // 创建触发器节点数据表
702
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
703
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
704
- const triggerNodeFieldName = 'orgname';
705
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
706
- await mockCollections(
707
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
708
- .collections,
709
- );
710
- // 创建Manual节点数据表
711
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
712
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
713
- const manualNodeFieldName = 'staffnum';
714
- const manualNodeFieldDisplayName = '员工人数(整数)';
715
- await mockCollections(
716
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
717
- .collections,
718
- );
719
- const manualNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
720
- const manualNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20 }];
721
- const manualNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30 }];
722
- const manualNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40 }];
723
- const manualNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10 }];
724
- const manualNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20 }];
725
- const manualNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30 }];
726
- const manualNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40 }];
727
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
728
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
729
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
730
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
731
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
732
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
733
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
734
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
735
- //添加工作流
736
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
737
- const workflowData = {
738
- current: true,
739
- options: { deleteExecutionOnStatus: [] },
740
- title: workFlowName,
741
- type: 'collection',
742
- enabled: true,
743
- };
744
- const workflow = await apiCreateWorkflow(workflowData);
745
- const workflowObj = JSON.parse(JSON.stringify(workflow));
746
- const workflowId = workflowObj.id;
747
- //配置工作流触发器
748
- const triggerNodeData = {
749
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
750
- };
751
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
752
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
753
- //配置Manual节点
754
- await page.goto(`admin/workflow/workflows/${workflowId}`);
755
- await page.waitForLoadState('networkidle');
756
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
757
- await collectionTriggerNode.addNodeButton.click();
758
- await page.getByRole('button', { name: 'manual', exact: true }).click();
759
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
760
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
761
- const manualNode = new ManualNode(page, manualNodeName);
762
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
763
- await manualNode.nodeConfigure.click();
764
- await manualNode.assigneesDropDown.click();
765
- await page.getByRole('option', { name: 'Super Admin' }).click();
766
- await manualNode.configureUserInterfaceButton.click();
767
- await manualNode.addBlockButton.hover();
768
- await manualNode.updateRecordFormMenu.hover();
769
- const dataSourcesCount = await apiGetDataSourceCount();
770
- if (dataSourcesCount > 1) {
771
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
772
- }
773
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
774
- await page.mouse.move(300, 0, { steps: 100 });
775
- await page
776
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
777
- .hover();
778
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
779
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
780
- await page.getByText('Add condition', { exact: true }).click();
781
- await page.getByTestId('select-filter-field').click();
782
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
783
- await page.getByTestId('select-filter-operator').click();
784
- await page.getByRole('option', { name: 'exists', exact: true }).click();
785
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
786
- await page
787
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
788
- .hover();
789
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
790
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
791
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
792
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
793
- await page.getByRole('button', { name: 'OK', exact: true }).click();
794
- await page
795
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
796
- .hover();
797
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
798
- await page.mouse.move(300, 0, { steps: 100 });
799
- await page.mouse.click(300, 0);
800
- await manualNode.submitButton.click();
801
- await page.waitForLoadState('networkidle');
802
-
803
- // 2、测试步骤:添加数据触发工作流
804
- const triggerNodeCollectionRecordOne =
805
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
806
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
807
- { orgname: triggerNodeCollectionRecordOne },
808
- ]);
809
- await page.waitForTimeout(1000);
810
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
811
- const getWorkflow = await apiGetWorkflow(workflowId);
812
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
813
- const getWorkflowExecuted = getWorkflowObj.executed;
814
- expect(getWorkflowExecuted).toBe(1);
815
-
816
- const newPage = mockPage();
817
- await newPage.goto();
818
- await page.waitForLoadState('networkidle');
819
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
820
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
821
- await page.mouse.move(300, 0, { steps: 100 });
822
- await page.waitForTimeout(300);
823
- await page
824
- .locator(`//td[span[text()="${manualNodeName}"]]`)
825
- .locator('xpath=preceding-sibling::td[1]')
826
- .locator('text=View')
827
- .click();
828
- const manualNodeRecord = faker.number.int();
829
- await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
830
- await page.getByRole('button', { name: 'Continue the process' }).click();
831
-
832
- await page.waitForTimeout(1000);
833
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
834
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
835
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
836
- return b.id - a.id;
837
- });
838
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
839
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
840
- const manualNodeJobStatus = manualNodeJob.status;
841
- expect(manualNodeJobStatus).toBe(1);
842
-
843
- const manualNodeJobResult = manualNodeJob.result;
844
- const hasStaffnum = Object.values(manualNodeJobResult).some(
845
- (value) => (value as { staffnum: number }).staffnum == manualNodeRecord,
846
- );
847
- expect(hasStaffnum).toBe(true);
848
-
849
- const filter = `pageSize=20&page=1&filter={"$and":[{"staffnum":{"$eq":"${manualNodeRecord}"}}]}`;
850
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
851
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
852
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
853
-
854
- // 4、后置处理:删除工作流
855
- await apiDeleteWorkflow(workflowId);
856
- });
857
-
858
- test('Collection event to add a data trigger, update number data', async ({
859
- page,
860
- mockPage,
861
- mockCollections,
862
- mockRecords,
863
- }) => {
864
- //数据表后缀标识
865
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
866
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
867
-
868
- // 创建触发器节点数据表
869
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
870
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
871
- const triggerNodeFieldName = 'orgname';
872
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
873
- await mockCollections(
874
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
875
- .collections,
876
- );
877
- // 创建Manual节点数据表
878
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
879
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
880
- const manualNodeFieldName = 'regcapital';
881
- const manualNodeFieldDisplayName = '注册资本(数字)';
882
- await mockCollections(
883
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
884
- .collections,
885
- );
886
- const manualNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
887
- const manualNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20 }];
888
- const manualNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30 }];
889
- const manualNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40 }];
890
- const manualNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10 }];
891
- const manualNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20 }];
892
- const manualNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30 }];
893
- const manualNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40 }];
894
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
895
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
896
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
897
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
898
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
899
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
900
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
901
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
902
- //添加工作流
903
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
904
- const workflowData = {
905
- current: true,
906
- options: { deleteExecutionOnStatus: [] },
907
- title: workFlowName,
908
- type: 'collection',
909
- enabled: true,
910
- };
911
- const workflow = await apiCreateWorkflow(workflowData);
912
- const workflowObj = JSON.parse(JSON.stringify(workflow));
913
- const workflowId = workflowObj.id;
914
- //配置工作流触发器
915
- const triggerNodeData = {
916
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
917
- };
918
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
919
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
920
- //配置Manual节点
921
- await page.goto(`admin/workflow/workflows/${workflowId}`);
922
- await page.waitForLoadState('networkidle');
923
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
924
- await collectionTriggerNode.addNodeButton.click();
925
- await page.getByRole('button', { name: 'manual', exact: true }).click();
926
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
927
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
928
- const manualNode = new ManualNode(page, manualNodeName);
929
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
930
- await manualNode.nodeConfigure.click();
931
- await manualNode.assigneesDropDown.click();
932
- await page.getByRole('option', { name: 'Super Admin' }).click();
933
- await manualNode.configureUserInterfaceButton.click();
934
- await manualNode.addBlockButton.hover();
935
- await manualNode.updateRecordFormMenu.hover();
936
- const dataSourcesCount = await apiGetDataSourceCount();
937
- if (dataSourcesCount > 1) {
938
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
939
- }
940
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
941
- await page.mouse.move(300, 0, { steps: 100 });
942
- await page
943
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
944
- .hover();
945
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
946
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
947
- await page.getByText('Add condition', { exact: true }).click();
948
- await page.getByTestId('select-filter-field').click();
949
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
950
- await page.getByTestId('select-filter-operator').click();
951
- await page.getByRole('option', { name: 'exists', exact: true }).click();
952
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
953
- await page
954
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
955
- .hover();
956
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
957
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
958
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
959
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
960
- await page.getByRole('button', { name: 'OK', exact: true }).click();
961
- await page
962
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
963
- .hover();
964
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
965
- await page.mouse.move(300, 0, { steps: 100 });
966
- await page.mouse.click(300, 0);
967
- await manualNode.submitButton.click();
968
- await page.waitForLoadState('networkidle');
969
-
970
- // 2、测试步骤:添加数据触发工作流
971
- const triggerNodeCollectionRecordOne =
972
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
973
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
974
- { orgname: triggerNodeCollectionRecordOne },
975
- ]);
976
- await page.waitForTimeout(1000);
977
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
978
- const getWorkflow = await apiGetWorkflow(workflowId);
979
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
980
- const getWorkflowExecuted = getWorkflowObj.executed;
981
- expect(getWorkflowExecuted).toBe(1);
982
-
983
- const newPage = mockPage();
984
- await newPage.goto();
985
- await page.waitForLoadState('networkidle');
986
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
987
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
988
- await page.mouse.move(300, 0, { steps: 100 });
989
- await page.waitForTimeout(300);
990
- await page
991
- .locator(`//td[span[text()="${manualNodeName}"]]`)
992
- .locator('xpath=preceding-sibling::td[1]')
993
- .locator('text=View')
994
- .click();
995
- const manualNodeRecord = faker.number.float();
996
- await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
997
- await page.getByRole('button', { name: 'Continue the process' }).click();
998
-
999
- await page.waitForTimeout(1000);
1000
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1001
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1002
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1003
- return b.id - a.id;
1004
- });
1005
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1006
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
1007
- const manualNodeJobStatus = manualNodeJob.status;
1008
- expect(manualNodeJobStatus).toBe(1);
1009
-
1010
- const manualNodeJobResult = manualNodeJob.result;
1011
- const hasRegcapital = Object.values(manualNodeJobResult).some(
1012
- (value) => (value as { regcapital: number }).regcapital == manualNodeRecord,
1013
- );
1014
- expect(hasRegcapital).toBe(true);
1015
-
1016
- const filter = `pageSize=20&page=1&filter={"$and":[{"regcapital":{"$eq":"${manualNodeRecord}"}}]}`;
1017
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1018
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1019
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1020
-
1021
- // 4、后置处理:删除工作流
1022
- await apiDeleteWorkflow(workflowId);
1023
- });
1024
-
1025
- test('Collection event to add a data trigger, update percentage data', async ({
1026
- page,
1027
- mockPage,
1028
- mockCollections,
1029
- mockRecords,
1030
- }) => {
1031
- //数据表后缀标识
1032
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1033
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1034
-
1035
- // 创建触发器节点数据表
1036
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1037
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1038
- const triggerNodeFieldName = 'orgname';
1039
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1040
- await mockCollections(
1041
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1042
- .collections,
1043
- );
1044
- // 创建Manual节点数据表
1045
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1046
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1047
- const manualNodeFieldName = 'insuranceratio';
1048
- const manualNodeFieldDisplayName = '参保占比(百分比)';
1049
- await mockCollections(
1050
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1051
- .collections,
1052
- );
1053
- const manualNodeCollectioRecordOne = [
1054
- { orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10, insuranceratio: 1.11 },
1055
- ];
1056
- const manualNodeCollectioRecordTwo = [
1057
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22 },
1058
- ];
1059
- const manualNodeCollectioRecordThree = [
1060
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33 },
1061
- ];
1062
- const manualNodeCollectioRecordFour = [
1063
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44 },
1064
- ];
1065
- const manualNodeCollectioRecordFive = [
1066
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11 },
1067
- ];
1068
- const manualNodeCollectioRecordSix = [
1069
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22 },
1070
- ];
1071
- const manualNodeCollectioRecordSeven = [
1072
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33 },
1073
- ];
1074
- const manualNodeCollectioRecordEight = [
1075
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44 },
1076
- ];
1077
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
1078
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
1079
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
1080
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
1081
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
1082
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
1083
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
1084
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
1085
- //添加工作流
1086
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1087
- const workflowData = {
1088
- current: true,
1089
- options: { deleteExecutionOnStatus: [] },
1090
- title: workFlowName,
1091
- type: 'collection',
1092
- enabled: true,
1093
- };
1094
- const workflow = await apiCreateWorkflow(workflowData);
1095
- const workflowObj = JSON.parse(JSON.stringify(workflow));
1096
- const workflowId = workflowObj.id;
1097
- //配置工作流触发器
1098
- const triggerNodeData = {
1099
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1100
- };
1101
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1102
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1103
- //配置Manual节点
1104
- await page.goto(`admin/workflow/workflows/${workflowId}`);
1105
- await page.waitForLoadState('networkidle');
1106
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1107
- await collectionTriggerNode.addNodeButton.click();
1108
- await page.getByRole('button', { name: 'manual', exact: true }).click();
1109
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1110
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
1111
- const manualNode = new ManualNode(page, manualNodeName);
1112
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
1113
- await manualNode.nodeConfigure.click();
1114
- await manualNode.assigneesDropDown.click();
1115
- await page.getByRole('option', { name: 'Super Admin' }).click();
1116
- await manualNode.configureUserInterfaceButton.click();
1117
- await manualNode.addBlockButton.hover();
1118
- await manualNode.updateRecordFormMenu.hover();
1119
- const dataSourcesCount = await apiGetDataSourceCount();
1120
- if (dataSourcesCount > 1) {
1121
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
1122
- }
1123
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1124
- await page.mouse.move(300, 0, { steps: 100 });
1125
- await page
1126
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1127
- .hover();
1128
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1129
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1130
- await page.getByText('Add condition', { exact: true }).click();
1131
- await page.getByTestId('select-filter-field').click();
1132
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1133
- await page.getByTestId('select-filter-operator').click();
1134
- await page.getByRole('option', { name: 'exists', exact: true }).click();
1135
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
1136
- await page
1137
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1138
- .hover();
1139
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
1140
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
1141
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1142
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
1143
- await page.getByRole('button', { name: 'OK', exact: true }).click();
1144
- await page
1145
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1146
- .hover();
1147
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
1148
- await page.mouse.move(300, 0, { steps: 100 });
1149
- await page.mouse.click(300, 0);
1150
- await manualNode.submitButton.click();
1151
- await page.waitForLoadState('networkidle');
1152
-
1153
- // 2、测试步骤:添加数据触发工作流
1154
- const triggerNodeCollectionRecordOne =
1155
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1156
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1157
- { orgname: triggerNodeCollectionRecordOne },
1158
- ]);
1159
- await page.waitForTimeout(1000);
1160
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
1161
- const getWorkflow = await apiGetWorkflow(workflowId);
1162
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1163
- const getWorkflowExecuted = getWorkflowObj.executed;
1164
- expect(getWorkflowExecuted).toBe(1);
1165
-
1166
- const newPage = mockPage();
1167
- await newPage.goto();
1168
- await page.waitForLoadState('networkidle');
1169
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
1170
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
1171
- await page.mouse.move(300, 0, { steps: 100 });
1172
- await page.waitForTimeout(300);
1173
- await page
1174
- .locator(`//td[span[text()="${manualNodeName}"]]`)
1175
- .locator('xpath=preceding-sibling::td[1]')
1176
- .locator('text=View')
1177
- .click();
1178
- const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
1179
- await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
1180
- await page.getByRole('button', { name: 'Continue the process' }).click();
1181
-
1182
- await page.waitForTimeout(1000);
1183
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1184
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1185
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1186
- return b.id - a.id;
1187
- });
1188
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1189
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1190
- const manualNodeJobStatus = manualNodeJob.status;
1191
- expect(manualNodeJobStatus).toBe(1);
1192
-
1193
- const manualNodeJobResult = manualNodeJob.result;
1194
- const hasRegcapital = Object.values(manualNodeJobResult).some(
1195
- (value) => (value as { insuranceratio: number }).insuranceratio === manualNodeRecord / 100,
1196
- );
1197
- expect(hasRegcapital).toBe(true);
1198
-
1199
- const filter = `pageSize=20&page=1&filter={"$and":[{"insuranceratio":{"$eq":"${manualNodeRecord / 100}"}}]}`;
1200
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1201
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1202
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1203
-
1204
- // 4、后置处理:删除工作流
1205
- await apiDeleteWorkflow(workflowId);
1206
- });
1207
-
1208
- test('Collection event to add a data trigger, update checkbox data', async ({
1209
- page,
1210
- mockPage,
1211
- mockCollections,
1212
- mockRecords,
1213
- }) => {
1214
- //数据表后缀标识
1215
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1216
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1217
-
1218
- // 创建触发器节点数据表
1219
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1220
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1221
- const triggerNodeFieldName = 'orgname';
1222
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1223
- await mockCollections(
1224
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1225
- .collections,
1226
- );
1227
- // 创建Manual节点数据表
1228
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1229
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1230
- const manualNodeFieldName = 'isenable';
1231
- const manualNodeFieldDisplayName = '是否启用(勾选)';
1232
- await mockCollections(
1233
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1234
- .collections,
1235
- );
1236
- const manualNodeCollectioRecordOne = [
1237
- { orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10, insuranceratio: 1.11, isenable: false },
1238
- ];
1239
- const manualNodeCollectioRecordTwo = [
1240
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
1241
- ];
1242
- const manualNodeCollectioRecordThree = [
1243
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
1244
- ];
1245
- const manualNodeCollectioRecordFour = [
1246
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
1247
- ];
1248
- const manualNodeCollectioRecordFive = [
1249
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
1250
- ];
1251
- const manualNodeCollectioRecordSix = [
1252
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
1253
- ];
1254
- const manualNodeCollectioRecordSeven = [
1255
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
1256
- ];
1257
- const manualNodeCollectioRecordEight = [
1258
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
1259
- ];
1260
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
1261
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
1262
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
1263
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
1264
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
1265
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
1266
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
1267
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
1268
- //添加工作流
1269
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1270
- const workflowData = {
1271
- current: true,
1272
- options: { deleteExecutionOnStatus: [] },
1273
- title: workFlowName,
1274
- type: 'collection',
1275
- enabled: true,
1276
- };
1277
- const workflow = await apiCreateWorkflow(workflowData);
1278
- const workflowObj = JSON.parse(JSON.stringify(workflow));
1279
- const workflowId = workflowObj.id;
1280
- //配置工作流触发器
1281
- const triggerNodeData = {
1282
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1283
- };
1284
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1285
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1286
- //配置Manual节点
1287
- await page.goto(`admin/workflow/workflows/${workflowId}`);
1288
- await page.waitForLoadState('networkidle');
1289
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1290
- await collectionTriggerNode.addNodeButton.click();
1291
- await page.getByRole('button', { name: 'manual', exact: true }).click();
1292
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1293
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
1294
- const manualNode = new ManualNode(page, manualNodeName);
1295
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
1296
- await manualNode.nodeConfigure.click();
1297
- await manualNode.assigneesDropDown.click();
1298
- await page.getByRole('option', { name: 'Super Admin' }).click();
1299
- await manualNode.configureUserInterfaceButton.click();
1300
- await manualNode.addBlockButton.hover();
1301
- await manualNode.updateRecordFormMenu.hover();
1302
- const dataSourcesCount = await apiGetDataSourceCount();
1303
- if (dataSourcesCount > 1) {
1304
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
1305
- }
1306
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1307
- await page.mouse.move(300, 0, { steps: 100 });
1308
- await page
1309
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1310
- .hover();
1311
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1312
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1313
- await page.getByText('Add condition', { exact: true }).click();
1314
- await page.getByTestId('select-filter-field').click();
1315
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1316
- await page.getByTestId('select-filter-operator').click();
1317
- await page.getByRole('option', { name: 'exists', exact: true }).click();
1318
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
1319
- await page
1320
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1321
- .hover();
1322
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
1323
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
1324
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1325
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
1326
- await page.getByRole('button', { name: 'OK', exact: true }).click();
1327
- await page
1328
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1329
- .hover();
1330
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
1331
- await page.mouse.move(300, 0, { steps: 100 });
1332
- await page.mouse.click(300, 0);
1333
- await manualNode.submitButton.click();
1334
- await page.waitForLoadState('networkidle');
1335
-
1336
- // 2、测试步骤:添加数据触发工作流
1337
- const triggerNodeCollectionRecordOne =
1338
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1339
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1340
- { orgname: triggerNodeCollectionRecordOne },
1341
- ]);
1342
- await page.waitForTimeout(1000);
1343
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
1344
- const getWorkflow = await apiGetWorkflow(workflowId);
1345
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1346
- const getWorkflowExecuted = getWorkflowObj.executed;
1347
- expect(getWorkflowExecuted).toBe(1);
1348
-
1349
- const newPage = mockPage();
1350
- await newPage.goto();
1351
- await page.waitForLoadState('networkidle');
1352
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
1353
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
1354
- await page.mouse.move(300, 0, { steps: 100 });
1355
- await page.waitForTimeout(300);
1356
- await page
1357
- .locator(`//td[span[text()="${manualNodeName}"]]`)
1358
- .locator('xpath=preceding-sibling::td[1]')
1359
- .locator('text=View')
1360
- .click();
1361
- // const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
1362
- await page.getByRole('checkbox').check();
1363
- await page.getByRole('button', { name: 'Continue the process' }).click();
1364
-
1365
- await page.waitForTimeout(1000);
1366
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1367
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1368
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1369
- return b.id - a.id;
1370
- });
1371
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1372
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1373
- const manualNodeJobStatus = manualNodeJob.status;
1374
- expect(manualNodeJobStatus).toBe(1);
1375
-
1376
- const manualNodeJobResult = manualNodeJob.result;
1377
- const hasIsenable = Object.values(manualNodeJobResult).some(
1378
- (value) => (value as { isenable: boolean }).isenable === true,
1379
- );
1380
- expect(hasIsenable).toBe(true);
1381
-
1382
- const filter = `pageSize=20&page=1&filter={"$and":[{"isenable":{"$eq":true}}]}`;
1383
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1384
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1385
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1386
-
1387
- // 4、后置处理:删除工作流
1388
- await apiDeleteWorkflow(workflowId);
1389
- });
1390
-
1391
- test('Collection event to add a data trigger, update single select data', async ({
1392
- page,
1393
- mockPage,
1394
- mockCollections,
1395
- mockRecords,
1396
- }) => {
1397
- //数据表后缀标识
1398
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1399
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1400
-
1401
- // 创建触发器节点数据表
1402
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1403
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1404
- const triggerNodeFieldName = 'orgname';
1405
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1406
- await mockCollections(
1407
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1408
- .collections,
1409
- );
1410
- // 创建Manual节点数据表
1411
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1412
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1413
- const manualNodeFieldName = 'status_singleselect';
1414
- const manualNodeFieldDisplayName = '公司状态(下拉单选)';
1415
- await mockCollections(
1416
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1417
- .collections,
1418
- );
1419
- const manualNodeCollectioRecordOne = [
1420
- { orgname: '公司名称(单行文本)1', status_singleselect: '2', staffnum: 10, insuranceratio: 1.11, isenable: false },
1421
- ];
1422
- const manualNodeCollectioRecordTwo = [
1423
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
1424
- ];
1425
- const manualNodeCollectioRecordThree = [
1426
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
1427
- ];
1428
- const manualNodeCollectioRecordFour = [
1429
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
1430
- ];
1431
- const manualNodeCollectioRecordFive = [
1432
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
1433
- ];
1434
- const manualNodeCollectioRecordSix = [
1435
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
1436
- ];
1437
- const manualNodeCollectioRecordSeven = [
1438
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
1439
- ];
1440
- const manualNodeCollectioRecordEight = [
1441
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
1442
- ];
1443
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
1444
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
1445
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
1446
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
1447
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
1448
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
1449
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
1450
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
1451
- //添加工作流
1452
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1453
- const workflowData = {
1454
- current: true,
1455
- options: { deleteExecutionOnStatus: [] },
1456
- title: workFlowName,
1457
- type: 'collection',
1458
- enabled: true,
1459
- };
1460
- const workflow = await apiCreateWorkflow(workflowData);
1461
- const workflowObj = JSON.parse(JSON.stringify(workflow));
1462
- const workflowId = workflowObj.id;
1463
- //配置工作流触发器
1464
- const triggerNodeData = {
1465
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1466
- };
1467
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1468
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1469
- //配置Manual节点
1470
- await page.goto(`admin/workflow/workflows/${workflowId}`);
1471
- await page.waitForLoadState('networkidle');
1472
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1473
- await collectionTriggerNode.addNodeButton.click();
1474
- await page.getByRole('button', { name: 'manual', exact: true }).click();
1475
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1476
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
1477
- const manualNode = new ManualNode(page, manualNodeName);
1478
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
1479
- await manualNode.nodeConfigure.click();
1480
- await manualNode.assigneesDropDown.click();
1481
- await page.getByRole('option', { name: 'Super Admin' }).click();
1482
- await manualNode.configureUserInterfaceButton.click();
1483
- await manualNode.addBlockButton.hover();
1484
- await manualNode.updateRecordFormMenu.hover();
1485
- const dataSourcesCount = await apiGetDataSourceCount();
1486
- if (dataSourcesCount > 1) {
1487
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
1488
- }
1489
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1490
- await page.mouse.move(300, 0, { steps: 100 });
1491
- await page
1492
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1493
- .hover();
1494
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1495
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1496
- await page.getByText('Add condition', { exact: true }).click();
1497
- await page.getByTestId('select-filter-field').click();
1498
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1499
- await page.getByTestId('select-filter-operator').click();
1500
- await page.getByRole('option', { name: 'exists', exact: true }).click();
1501
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
1502
- await page
1503
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1504
- .hover();
1505
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
1506
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
1507
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1508
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
1509
- await page.getByRole('button', { name: 'OK', exact: true }).click();
1510
- await page
1511
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1512
- .hover();
1513
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
1514
- await page.mouse.move(300, 0, { steps: 100 });
1515
- await page.mouse.click(300, 0);
1516
- await manualNode.submitButton.click();
1517
- await page.waitForLoadState('networkidle');
1518
-
1519
- // 2、测试步骤:添加数据触发工作流
1520
- const triggerNodeCollectionRecordOne =
1521
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1522
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1523
- { orgname: triggerNodeCollectionRecordOne },
1524
- ]);
1525
- await page.waitForTimeout(1000);
1526
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
1527
- const getWorkflow = await apiGetWorkflow(workflowId);
1528
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1529
- const getWorkflowExecuted = getWorkflowObj.executed;
1530
- expect(getWorkflowExecuted).toBe(1);
1531
-
1532
- const newPage = mockPage();
1533
- await newPage.goto();
1534
- await page.waitForLoadState('networkidle');
1535
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
1536
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
1537
- await page.mouse.move(300, 0, { steps: 100 });
1538
- await page.waitForTimeout(300);
1539
- await page
1540
- .locator(`//td[span[text()="${manualNodeName}"]]`)
1541
- .locator('xpath=preceding-sibling::td[1]')
1542
- .locator('text=View')
1543
- .click();
1544
- // const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
1545
- await page.getByTestId('select-single').click();
1546
- await page.getByRole('option', { name: '存续' }).click();
1547
- await page.getByRole('button', { name: 'Continue the process' }).click();
1548
-
1549
- await page.waitForTimeout(1000);
1550
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1551
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1552
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1553
- return b.id - a.id;
1554
- });
1555
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1556
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1557
- const manualNodeJobStatus = manualNodeJob.status;
1558
- expect(manualNodeJobStatus).toBe(1);
1559
-
1560
- const manualNodeJobResult = manualNodeJob.result;
1561
- const hasIsenable = Object.values(manualNodeJobResult).some(
1562
- (value) => (value as { status_singleselect: string }).status_singleselect === '1',
1563
- );
1564
- expect(hasIsenable).toBe(true);
1565
-
1566
- const filter = `pageSize=20&page=1&filter={"$and":[{"status_singleselect":{"$eq":"1"}}]}`;
1567
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1568
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1569
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1570
-
1571
- // 4、后置处理:删除工作流
1572
- await apiDeleteWorkflow(workflowId);
1573
- });
1574
-
1575
- test('Collection event to add a data trigger, update multiple select data', async ({
1576
- page,
1577
- mockPage,
1578
- mockCollections,
1579
- mockRecords,
1580
- }) => {
1581
- //数据表后缀标识
1582
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1583
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1584
-
1585
- // 创建触发器节点数据表
1586
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1587
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1588
- const triggerNodeFieldName = 'orgname';
1589
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1590
- await mockCollections(
1591
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1592
- .collections,
1593
- );
1594
- // 创建Manual节点数据表
1595
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1596
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1597
- const manualNodeFieldName = 'range_multipleselect';
1598
- const manualNodeFieldDisplayName = '经营范围(下拉多选)';
1599
- await mockCollections(
1600
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1601
- .collections,
1602
- );
1603
- const manualNodeCollectioRecordOne = [
1604
- { orgname: '公司名称(单行文本)1', status_singleselect: '2', staffnum: 10, insuranceratio: 1.11, isenable: false },
1605
- ];
1606
- const manualNodeCollectioRecordTwo = [
1607
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
1608
- ];
1609
- const manualNodeCollectioRecordThree = [
1610
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
1611
- ];
1612
- const manualNodeCollectioRecordFour = [
1613
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
1614
- ];
1615
- const manualNodeCollectioRecordFive = [
1616
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
1617
- ];
1618
- const manualNodeCollectioRecordSix = [
1619
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
1620
- ];
1621
- const manualNodeCollectioRecordSeven = [
1622
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
1623
- ];
1624
- const manualNodeCollectioRecordEight = [
1625
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
1626
- ];
1627
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
1628
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
1629
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
1630
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
1631
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
1632
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
1633
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
1634
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
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
- //配置Manual节点
1654
- await page.goto(`admin/workflow/workflows/${workflowId}`);
1655
- await page.waitForLoadState('networkidle');
1656
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1657
- await collectionTriggerNode.addNodeButton.click();
1658
- await page.getByRole('button', { name: 'manual', exact: true }).click();
1659
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1660
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
1661
- const manualNode = new ManualNode(page, manualNodeName);
1662
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
1663
- await manualNode.nodeConfigure.click();
1664
- await manualNode.assigneesDropDown.click();
1665
- await page.getByRole('option', { name: 'Super Admin' }).click();
1666
- await manualNode.configureUserInterfaceButton.click();
1667
- await manualNode.addBlockButton.hover();
1668
- await manualNode.updateRecordFormMenu.hover();
1669
- const dataSourcesCount = await apiGetDataSourceCount();
1670
- if (dataSourcesCount > 1) {
1671
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
1672
- }
1673
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1674
- await page.mouse.move(300, 0, { steps: 100 });
1675
- await page
1676
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1677
- .hover();
1678
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1679
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1680
- await page.getByText('Add condition', { exact: true }).click();
1681
- await page.getByTestId('select-filter-field').click();
1682
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1683
- await page.getByTestId('select-filter-operator').click();
1684
- await page.getByRole('option', { name: 'exists', exact: true }).click();
1685
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
1686
- await page
1687
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1688
- .hover();
1689
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
1690
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
1691
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1692
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
1693
- await page.getByRole('button', { name: 'OK', exact: true }).click();
1694
- await page
1695
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1696
- .hover();
1697
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
1698
- await page.mouse.move(300, 0, { steps: 100 });
1699
- await page.mouse.click(300, 0);
1700
- await manualNode.submitButton.click();
1701
- await page.waitForLoadState('networkidle');
1702
-
1703
- // 2、测试步骤:添加数据触发工作流
1704
- const triggerNodeCollectionRecordOne =
1705
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1706
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1707
- { orgname: triggerNodeCollectionRecordOne },
1708
- ]);
1709
- await page.waitForTimeout(1000);
1710
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
1711
- const getWorkflow = await apiGetWorkflow(workflowId);
1712
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1713
- const getWorkflowExecuted = getWorkflowObj.executed;
1714
- expect(getWorkflowExecuted).toBe(1);
1715
-
1716
- const newPage = mockPage();
1717
- await newPage.goto();
1718
- await page.waitForLoadState('networkidle');
1719
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
1720
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
1721
- await page.mouse.move(300, 0, { steps: 100 });
1722
- await page.waitForTimeout(300);
1723
- await page
1724
- .locator(`//td[span[text()="${manualNodeName}"]]`)
1725
- .locator('xpath=preceding-sibling::td[1]')
1726
- .locator('text=View')
1727
- .click();
1728
- // const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
1729
- await page.getByTestId('select-multiple').click();
1730
- await page.getByRole('option', { name: '软件销售', exact: true }).click();
1731
- await page.getByRole('option', { name: '软件开发', exact: true }).click();
1732
- await page.getByTestId('select-multiple').click();
1733
- await page.getByRole('button', { name: 'Continue the process' }).click();
1734
-
1735
- await page.waitForTimeout(1000);
1736
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1737
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1738
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1739
- return b.id - a.id;
1740
- });
1741
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1742
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1743
- const manualNodeJobStatus = manualNodeJob.status;
1744
- expect(manualNodeJobStatus).toBe(1);
1745
-
1746
- const manualNodeJobResult = manualNodeJob.result;
1747
- let resultFieldValue = '';
1748
- const expectFieldValue = ['F3134', 'I3006'];
1749
- for (const key in manualNodeJobResult) {
1750
- if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'range_multipleselect')) {
1751
- resultFieldValue = manualNodeJobResult[key]['range_multipleselect'];
1752
- break;
1753
- }
1754
- }
1755
- const isEqual = JSON.stringify(resultFieldValue) === JSON.stringify(expectFieldValue);
1756
- expect(isEqual).toBe(true);
1757
-
1758
- const filter = `pageSize=20&page=1&filter={"$and":[{"range_multipleselect":{"$match":["F3134","I3006"]}}]}`;
1759
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1760
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1761
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1762
-
1763
- // 4、后置处理:删除工作流
1764
- await apiDeleteWorkflow(workflowId);
1765
- });
1766
-
1767
- test('Collection event to add a data trigger, update radio group data', async ({
1768
- page,
1769
- mockPage,
1770
- mockCollections,
1771
- mockRecords,
1772
- }) => {
1773
- //数据表后缀标识
1774
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1775
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1776
-
1777
- // 创建触发器节点数据表
1778
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1779
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1780
- const triggerNodeFieldName = 'orgname';
1781
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1782
- await mockCollections(
1783
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1784
- .collections,
1785
- );
1786
- // 创建Manual节点数据表
1787
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1788
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1789
- const manualNodeFieldName = 'status_radio';
1790
- const manualNodeFieldDisplayName = '公司状态(单选)';
1791
- await mockCollections(
1792
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1793
- .collections,
1794
- );
1795
- const manualNodeCollectioRecordOne = [
1796
- { orgname: '公司名称(单行文本)1', status_singleselect: '2', staffnum: 10, insuranceratio: 1.11, isenable: false },
1797
- ];
1798
- const manualNodeCollectioRecordTwo = [
1799
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
1800
- ];
1801
- const manualNodeCollectioRecordThree = [
1802
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
1803
- ];
1804
- const manualNodeCollectioRecordFour = [
1805
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
1806
- ];
1807
- const manualNodeCollectioRecordFive = [
1808
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
1809
- ];
1810
- const manualNodeCollectioRecordSix = [
1811
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
1812
- ];
1813
- const manualNodeCollectioRecordSeven = [
1814
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
1815
- ];
1816
- const manualNodeCollectioRecordEight = [
1817
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
1818
- ];
1819
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
1820
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
1821
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
1822
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
1823
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
1824
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
1825
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
1826
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
1827
- //添加工作流
1828
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
1829
- const workflowData = {
1830
- current: true,
1831
- options: { deleteExecutionOnStatus: [] },
1832
- title: workFlowName,
1833
- type: 'collection',
1834
- enabled: true,
1835
- };
1836
- const workflow = await apiCreateWorkflow(workflowData);
1837
- const workflowObj = JSON.parse(JSON.stringify(workflow));
1838
- const workflowId = workflowObj.id;
1839
- //配置工作流触发器
1840
- const triggerNodeData = {
1841
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
1842
- };
1843
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
1844
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
1845
- //配置Manual节点
1846
- await page.goto(`admin/workflow/workflows/${workflowId}`);
1847
- await page.waitForLoadState('networkidle');
1848
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
1849
- await collectionTriggerNode.addNodeButton.click();
1850
- await page.getByRole('button', { name: 'manual', exact: true }).click();
1851
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1852
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
1853
- const manualNode = new ManualNode(page, manualNodeName);
1854
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
1855
- await manualNode.nodeConfigure.click();
1856
- await manualNode.assigneesDropDown.click();
1857
- await page.getByRole('option', { name: 'Super Admin' }).click();
1858
- await manualNode.configureUserInterfaceButton.click();
1859
- await manualNode.addBlockButton.hover();
1860
- await manualNode.updateRecordFormMenu.hover();
1861
- const dataSourcesCount = await apiGetDataSourceCount();
1862
- if (dataSourcesCount > 1) {
1863
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
1864
- }
1865
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
1866
- await page.mouse.move(300, 0, { steps: 100 });
1867
- await page
1868
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1869
- .hover();
1870
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
1871
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
1872
- await page.getByText('Add condition', { exact: true }).click();
1873
- await page.getByTestId('select-filter-field').click();
1874
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
1875
- await page.getByTestId('select-filter-operator').click();
1876
- await page.getByRole('option', { name: 'exists', exact: true }).click();
1877
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
1878
- await page
1879
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1880
- .hover();
1881
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
1882
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
1883
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1884
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
1885
- await page.getByRole('button', { name: 'OK', exact: true }).click();
1886
- await page
1887
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
1888
- .hover();
1889
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
1890
- await page.mouse.move(300, 0, { steps: 100 });
1891
- await page.mouse.click(300, 0);
1892
- await manualNode.submitButton.click();
1893
- await page.waitForLoadState('networkidle');
1894
-
1895
- // 2、测试步骤:添加数据触发工作流
1896
- const triggerNodeCollectionRecordOne =
1897
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
1898
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
1899
- { orgname: triggerNodeCollectionRecordOne },
1900
- ]);
1901
- await page.waitForTimeout(1000);
1902
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
1903
- const getWorkflow = await apiGetWorkflow(workflowId);
1904
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
1905
- const getWorkflowExecuted = getWorkflowObj.executed;
1906
- expect(getWorkflowExecuted).toBe(1);
1907
-
1908
- const newPage = mockPage();
1909
- await newPage.goto();
1910
- await page.waitForLoadState('networkidle');
1911
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
1912
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
1913
- await page.mouse.move(300, 0, { steps: 100 });
1914
- await page.waitForTimeout(300);
1915
- await page
1916
- .locator(`//td[span[text()="${manualNodeName}"]]`)
1917
- .locator('xpath=preceding-sibling::td[1]')
1918
- .locator('text=View')
1919
- .click();
1920
- // const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
1921
- await page.getByLabel('存续').check();
1922
- await page.getByRole('button', { name: 'Continue the process' }).click();
1923
-
1924
- await page.waitForTimeout(1000);
1925
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
1926
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
1927
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
1928
- return b.id - a.id;
1929
- });
1930
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
1931
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
1932
- const manualNodeJobStatus = manualNodeJob.status;
1933
- expect(manualNodeJobStatus).toBe(1);
1934
-
1935
- const manualNodeJobResult = manualNodeJob.result;
1936
- const hasIsenable = Object.values(manualNodeJobResult).some(
1937
- (value) => (value as { status_radio: string }).status_radio === '1',
1938
- );
1939
- expect(hasIsenable).toBe(true);
1940
-
1941
- const filter = `pageSize=20&page=1&filter={"$and":[{"status_radio":{"$eq":"1"}}]}`;
1942
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
1943
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
1944
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
1945
-
1946
- // 4、后置处理:删除工作流
1947
- await apiDeleteWorkflow(workflowId);
1948
- });
1949
-
1950
- test('Collection event to add a data trigger, update checkbox group data', async ({
1951
- page,
1952
- mockPage,
1953
- mockCollections,
1954
- mockRecords,
1955
- }) => {
1956
- //数据表后缀标识
1957
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
1958
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
1959
-
1960
- // 创建触发器节点数据表
1961
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
1962
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
1963
- const triggerNodeFieldName = 'orgname';
1964
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
1965
- await mockCollections(
1966
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
1967
- .collections,
1968
- );
1969
- // 创建Manual节点数据表
1970
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
1971
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
1972
- const manualNodeFieldName = 'range_check';
1973
- const manualNodeFieldDisplayName = '经营范围(复选)';
1974
- await mockCollections(
1975
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
1976
- .collections,
1977
- );
1978
- const manualNodeCollectioRecordOne = [
1979
- { orgname: '公司名称(单行文本)1', status_singleselect: '2', staffnum: 10, insuranceratio: 1.11, isenable: false },
1980
- ];
1981
- const manualNodeCollectioRecordTwo = [
1982
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
1983
- ];
1984
- const manualNodeCollectioRecordThree = [
1985
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
1986
- ];
1987
- const manualNodeCollectioRecordFour = [
1988
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
1989
- ];
1990
- const manualNodeCollectioRecordFive = [
1991
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
1992
- ];
1993
- const manualNodeCollectioRecordSix = [
1994
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
1995
- ];
1996
- const manualNodeCollectioRecordSeven = [
1997
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
1998
- ];
1999
- const manualNodeCollectioRecordEight = [
2000
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
2001
- ];
2002
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
2003
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
2004
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
2005
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
2006
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
2007
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
2008
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
2009
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
2010
- //添加工作流
2011
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
2012
- const workflowData = {
2013
- current: true,
2014
- options: { deleteExecutionOnStatus: [] },
2015
- title: workFlowName,
2016
- type: 'collection',
2017
- enabled: true,
2018
- };
2019
- const workflow = await apiCreateWorkflow(workflowData);
2020
- const workflowObj = JSON.parse(JSON.stringify(workflow));
2021
- const workflowId = workflowObj.id;
2022
- //配置工作流触发器
2023
- const triggerNodeData = {
2024
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
2025
- };
2026
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
2027
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
2028
- //配置Manual节点
2029
- await page.goto(`admin/workflow/workflows/${workflowId}`);
2030
- await page.waitForLoadState('networkidle');
2031
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
2032
- await collectionTriggerNode.addNodeButton.click();
2033
- await page.getByRole('button', { name: 'manual', exact: true }).click();
2034
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2035
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
2036
- const manualNode = new ManualNode(page, manualNodeName);
2037
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
2038
- await manualNode.nodeConfigure.click();
2039
- await manualNode.assigneesDropDown.click();
2040
- await page.getByRole('option', { name: 'Super Admin' }).click();
2041
- await manualNode.configureUserInterfaceButton.click();
2042
- await manualNode.addBlockButton.hover();
2043
- await manualNode.updateRecordFormMenu.hover();
2044
- const dataSourcesCount = await apiGetDataSourceCount();
2045
- if (dataSourcesCount > 1) {
2046
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
2047
- }
2048
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
2049
- await page.mouse.move(300, 0, { steps: 100 });
2050
- await page
2051
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2052
- .hover();
2053
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
2054
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
2055
- await page.getByText('Add condition', { exact: true }).click();
2056
- await page.getByTestId('select-filter-field').click();
2057
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
2058
- await page.getByTestId('select-filter-operator').click();
2059
- await page.getByRole('option', { name: 'exists', exact: true }).click();
2060
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
2061
- await page
2062
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2063
- .hover();
2064
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
2065
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
2066
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2067
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
2068
- await page.getByRole('button', { name: 'OK', exact: true }).click();
2069
- await page
2070
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2071
- .hover();
2072
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
2073
- await page.mouse.move(300, 0, { steps: 100 });
2074
- await page.mouse.click(300, 0);
2075
- await manualNode.submitButton.click();
2076
- await page.waitForLoadState('networkidle');
2077
-
2078
- // 2、测试步骤:添加数据触发工作流
2079
- const triggerNodeCollectionRecordOne =
2080
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2081
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
2082
- { orgname: triggerNodeCollectionRecordOne },
2083
- ]);
2084
- await page.waitForTimeout(1000);
2085
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
2086
- const getWorkflow = await apiGetWorkflow(workflowId);
2087
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
2088
- const getWorkflowExecuted = getWorkflowObj.executed;
2089
- expect(getWorkflowExecuted).toBe(1);
2090
-
2091
- const newPage = mockPage();
2092
- await newPage.goto();
2093
- await page.waitForLoadState('networkidle');
2094
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
2095
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
2096
- await page.mouse.move(300, 0, { steps: 100 });
2097
- await page.waitForTimeout(300);
2098
- await page
2099
- .locator(`//td[span[text()="${manualNodeName}"]]`)
2100
- .locator('xpath=preceding-sibling::td[1]')
2101
- .locator('text=View')
2102
- .click();
2103
- await page.getByLabel('软件销售', { exact: true }).check();
2104
- await page.getByLabel('软件开发', { exact: true }).check();
2105
- await page.getByRole('button', { name: 'Continue the process' }).click();
2106
-
2107
- await page.waitForTimeout(1000);
2108
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
2109
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
2110
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
2111
- return b.id - a.id;
2112
- });
2113
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
2114
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
2115
- const manualNodeJobStatus = manualNodeJob.status;
2116
- expect(manualNodeJobStatus).toBe(1);
2117
-
2118
- const manualNodeJobResult = manualNodeJob.result;
2119
- let resultFieldValue = '';
2120
- const expectFieldValue = ['F3134', 'I3006'];
2121
- for (const key in manualNodeJobResult) {
2122
- if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'range_check')) {
2123
- resultFieldValue = manualNodeJobResult[key]['range_check'];
2124
- break;
2125
- }
2126
- }
2127
- const isEqual = JSON.stringify(resultFieldValue) === JSON.stringify(expectFieldValue);
2128
- expect(isEqual).toBe(true);
2129
-
2130
- const filter = `pageSize=20&page=1&filter={"$and":[{"range_check":{"$match":["F3134","I3006"]}}]}`;
2131
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
2132
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
2133
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
2134
-
2135
- // 4、后置处理:删除工作流
2136
- await apiDeleteWorkflow(workflowId);
2137
- });
2138
-
2139
- test('Collection event to add a data trigger, update datetime data', async ({
2140
- page,
2141
- mockPage,
2142
- mockCollections,
2143
- mockRecords,
2144
- }) => {
2145
- //数据表后缀标识
2146
- const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
2147
- const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
2148
-
2149
- // 创建触发器节点数据表
2150
- const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
2151
- const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
2152
- const triggerNodeFieldName = 'orgname';
2153
- const triggerNodeFieldDisplayName = '公司名称(单行文本)';
2154
- await mockCollections(
2155
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
2156
- .collections,
2157
- );
2158
- // 创建Manual节点数据表
2159
- const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
2160
- const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
2161
- const manualNodeFieldName = 'establishdate';
2162
- const manualNodeFieldDisplayName = '成立日期(日期)';
2163
- await mockCollections(
2164
- appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
2165
- .collections,
2166
- );
2167
- const manualNodeCollectioRecordOne = [
2168
- { orgname: '公司名称(单行文本)1', status_singleselect: '2', staffnum: 10, insuranceratio: 1.11, isenable: false },
2169
- ];
2170
- const manualNodeCollectioRecordTwo = [
2171
- { orgname: '公司名称(单行文本)2', status_singleselect: '2', staffnum: 20, insuranceratio: 2.22, isenable: false },
2172
- ];
2173
- const manualNodeCollectioRecordThree = [
2174
- { orgname: '公司名称(单行文本)3', status_singleselect: '3', staffnum: 30, insuranceratio: 3.33, isenable: false },
2175
- ];
2176
- const manualNodeCollectioRecordFour = [
2177
- { orgname: '公司名称(单行文本)4', status_singleselect: '4', staffnum: 40, insuranceratio: 4.44, isenable: false },
2178
- ];
2179
- const manualNodeCollectioRecordFive = [
2180
- { orgname: '公司名称(单行文本)5', status_singleselect: '5', staffnum: 10, insuranceratio: 1.11, isenable: false },
2181
- ];
2182
- const manualNodeCollectioRecordSix = [
2183
- { orgname: '公司名称(单行文本)6', status_singleselect: '6', staffnum: 20, insuranceratio: 2.22, isenable: false },
2184
- ];
2185
- const manualNodeCollectioRecordSeven = [
2186
- { orgname: '公司名称(单行文本)7', status_singleselect: '7', staffnum: 30, insuranceratio: 3.33, isenable: false },
2187
- ];
2188
- const manualNodeCollectioRecordEight = [
2189
- { orgname: '公司名称(单行文本)8', status_singleselect: '8', staffnum: 40, insuranceratio: 4.44, isenable: false },
2190
- ];
2191
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordOne);
2192
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordTwo);
2193
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordThree);
2194
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFour);
2195
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordFive);
2196
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSix);
2197
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordSeven);
2198
- await mockRecords(manualNodeCollectionName, manualNodeCollectioRecordEight);
2199
- //添加工作流
2200
- const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
2201
- const workflowData = {
2202
- current: true,
2203
- options: { deleteExecutionOnStatus: [] },
2204
- title: workFlowName,
2205
- type: 'collection',
2206
- enabled: true,
2207
- };
2208
- const workflow = await apiCreateWorkflow(workflowData);
2209
- const workflowObj = JSON.parse(JSON.stringify(workflow));
2210
- const workflowId = workflowObj.id;
2211
- //配置工作流触发器
2212
- const triggerNodeData = {
2213
- config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
2214
- };
2215
- const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
2216
- const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
2217
- //配置Manual节点
2218
- await page.goto(`admin/workflow/workflows/${workflowId}`);
2219
- await page.waitForLoadState('networkidle');
2220
- const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
2221
- await collectionTriggerNode.addNodeButton.click();
2222
- await page.getByRole('button', { name: 'manual', exact: true }).click();
2223
- const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2224
- await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
2225
- const manualNode = new ManualNode(page, manualNodeName);
2226
- const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
2227
- await manualNode.nodeConfigure.click();
2228
- await manualNode.assigneesDropDown.click();
2229
- await page.getByRole('option', { name: 'Super Admin' }).click();
2230
- await manualNode.configureUserInterfaceButton.click();
2231
- await manualNode.addBlockButton.hover();
2232
- await manualNode.updateRecordFormMenu.hover();
2233
- const dataSourcesCount = await apiGetDataSourceCount();
2234
- if (dataSourcesCount > 1) {
2235
- await page.getByRole('menuitem', { name: 'Main right' }).hover();
2236
- }
2237
- await page.getByRole('menuitem', { name: manualNodeCollectionDisplayName }).click();
2238
- await page.mouse.move(300, 0, { steps: 100 });
2239
- await page
2240
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2241
- .hover();
2242
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).click();
2243
- await page.getByRole('menuitem', { name: 'Filter settings' }).click();
2244
- await page.getByText('Add condition', { exact: true }).click();
2245
- await page.getByTestId('select-filter-field').click();
2246
- await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
2247
- await page.getByTestId('select-filter-operator').click();
2248
- await page.getByRole('option', { name: 'exists', exact: true }).click();
2249
- await page.getByRole('button', { name: 'Submit', exact: true }).click();
2250
- await page
2251
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2252
- .hover();
2253
- await page.getByLabel(`designer-schema-settings-CardItem-UpdateFormDesigner-${manualNodeCollectionName}`).hover();
2254
- await page.getByRole('menuitem', { name: 'Edit block title' }).click();
2255
- const blockTitle = 'Create record' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2256
- await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
2257
- await page.getByRole('button', { name: 'OK', exact: true }).click();
2258
- await page
2259
- .locator(`button[aria-label^="schema-initializer-Grid-form:configureFields-${manualNodeCollectionName}"]`)
2260
- .hover();
2261
- await page.getByRole('menuitem', { name: manualNodeFieldDisplayName }).getByRole('switch').click();
2262
- await page.mouse.move(300, 0, { steps: 100 });
2263
- await page.mouse.click(300, 0);
2264
- await manualNode.submitButton.click();
2265
- await page.waitForLoadState('networkidle');
2266
-
2267
- // 2、测试步骤:添加数据触发工作流
2268
- const triggerNodeCollectionRecordOne =
2269
- triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
2270
- const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
2271
- { orgname: triggerNodeCollectionRecordOne },
2272
- ]);
2273
- await page.waitForTimeout(1000);
2274
- // 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
2275
- const getWorkflow = await apiGetWorkflow(workflowId);
2276
- const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
2277
- const getWorkflowExecuted = getWorkflowObj.executed;
2278
- expect(getWorkflowExecuted).toBe(1);
2279
-
2280
- const newPage = mockPage();
2281
- await newPage.goto();
2282
- await page.waitForLoadState('networkidle');
2283
- await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
2284
- await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
2285
- await page.mouse.move(300, 0, { steps: 100 });
2286
- await page.waitForTimeout(300);
2287
- await page
2288
- .locator(`//td[span[text()="${manualNodeName}"]]`)
2289
- .locator('xpath=preceding-sibling::td[1]')
2290
- .locator('text=View')
2291
- .click();
2292
- const manualNodeRecord = dayjs().format('YYYY-MM-DD');
2293
- await page.getByPlaceholder('Select date').click();
2294
- await page.getByTitle(manualNodeRecord.toString()).click();
2295
- await page.mouse.move(300, 0, { steps: 100 });
2296
- await page.mouse.click(300, 0);
2297
- await page.getByRole('button', { name: 'Cancel', exact: true }).click();
2298
- await page.getByRole('button', { name: 'Continue the process' }).click();
2299
-
2300
- await page.waitForTimeout(1000);
2301
- const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
2302
- const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
2303
- getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
2304
- return b.id - a.id;
2305
- });
2306
- const jobs = getWorkflowNodeExecutionsObj[0].jobs;
2307
- const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
2308
- const manualNodeJobStatus = manualNodeJob.status;
2309
- expect(manualNodeJobStatus).toBe(1);
2310
-
2311
- const manualNodeJobResult = manualNodeJob.result;
2312
- let resultFieldValue = '';
2313
- for (const key in manualNodeJobResult) {
2314
- if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'establishdate')) {
2315
- resultFieldValue = manualNodeJobResult[key]['establishdate'];
2316
- break;
2317
- }
2318
- }
2319
- const now = new Date();
2320
- now.setHours(0, 0, 0, 0);
2321
- const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
2322
- const timeWithTimeZone = now.toLocaleString('en-US', { timeZone: timeZone });
2323
- // 转换为0时区的时间
2324
- const timeInUTC = new Date(timeWithTimeZone).toISOString();
2325
-
2326
- const filter = `pageSize=20&page=1&filter={"$and":[{"establishdate":{"$eq":"${timeInUTC}"}}]}`;
2327
- const createNodeCollectionData = await apiFilterList(manualNodeCollectionName, filter);
2328
- const createNodeCollectionDataObj = JSON.parse(JSON.stringify(createNodeCollectionData));
2329
- expect(createNodeCollectionDataObj.meta.count).toBe(8);
2330
-
2331
- // 4、后置处理:删除工作流
2332
- await apiDeleteWorkflow(workflowId);
2333
- });
2334
- });
2335
-
2336
- test.describe('relation field data update', () => {});
2337
-
2338
- test.describe('action button', () => {});