@scvzerng/snakerflow-designer-vue2 3.0.54

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 (44) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +618 -0
  3. package/dist/SnakerflowDesigner.es.js +31310 -0
  4. package/dist/SnakerflowDesigner.umd.js +105 -0
  5. package/dist/favicon.ico +0 -0
  6. package/dist/index.html +17 -0
  7. package/dist/style.css +1 -0
  8. package/dist/types/SnakerFlowDesigner/index.d.ts +2 -0
  9. package/dist/types/SnakerFlowDesigner/src/Control/DataDetail.vue.d.ts +5 -0
  10. package/dist/types/SnakerFlowDesigner/src/Control/HighLightData.vue.d.ts +6 -0
  11. package/dist/types/SnakerFlowDesigner/src/Control/ImportData.vue.d.ts +7 -0
  12. package/dist/types/SnakerFlowDesigner/src/PropertySetting/CustomAttributeRender.d.ts +27 -0
  13. package/dist/types/SnakerFlowDesigner/src/PropertySetting/custom.vue.d.ts +23077 -0
  14. package/dist/types/SnakerFlowDesigner/src/PropertySetting/decision.vue.d.ts +16493 -0
  15. package/dist/types/SnakerFlowDesigner/src/PropertySetting/end.vue.d.ts +9909 -0
  16. package/dist/types/SnakerFlowDesigner/src/PropertySetting/fork.vue.d.ts +3325 -0
  17. package/dist/types/SnakerFlowDesigner/src/PropertySetting/index.d.ts +2 -0
  18. package/dist/types/SnakerFlowDesigner/src/PropertySetting/index.vue.d.ts +36 -0
  19. package/dist/types/SnakerFlowDesigner/src/PropertySetting/join.vue.d.ts +3325 -0
  20. package/dist/types/SnakerFlowDesigner/src/PropertySetting/process.vue.d.ts +23077 -0
  21. package/dist/types/SnakerFlowDesigner/src/PropertySetting/start.vue.d.ts +9909 -0
  22. package/dist/types/SnakerFlowDesigner/src/PropertySetting/subProcess.vue.d.ts +23077 -0
  23. package/dist/types/SnakerFlowDesigner/src/PropertySetting/transition.vue.d.ts +9909 -0
  24. package/dist/types/SnakerFlowDesigner/src/PropertySetting/wfSubProcess.vue.d.ts +19785 -0
  25. package/dist/types/SnakerFlowDesigner/src/SnakerFlowDesigner.vue.d.ts +180 -0
  26. package/dist/types/SnakerFlowDesigner/src/data.d.ts +15 -0
  27. package/dist/types/SnakerFlowDesigner/src/enums.d.ts +23 -0
  28. package/dist/types/SnakerFlowDesigner/src/snakerflow/custom/index.d.ts +30 -0
  29. package/dist/types/SnakerFlowDesigner/src/snakerflow/decision/index.d.ts +22 -0
  30. package/dist/types/SnakerFlowDesigner/src/snakerflow/end/index.d.ts +25 -0
  31. package/dist/types/SnakerFlowDesigner/src/snakerflow/fork/index.d.ts +22 -0
  32. package/dist/types/SnakerFlowDesigner/src/snakerflow/index.d.ts +17 -0
  33. package/dist/types/SnakerFlowDesigner/src/snakerflow/join/index.d.ts +22 -0
  34. package/dist/types/SnakerFlowDesigner/src/snakerflow/start/index.d.ts +23 -0
  35. package/dist/types/SnakerFlowDesigner/src/snakerflow/subProcess/index.d.ts +22 -0
  36. package/dist/types/SnakerFlowDesigner/src/snakerflow/task/VueNode.vue.d.ts +6 -0
  37. package/dist/types/SnakerFlowDesigner/src/snakerflow/task/html.d.ts +21 -0
  38. package/dist/types/SnakerFlowDesigner/src/snakerflow/task/index.d.ts +26 -0
  39. package/dist/types/SnakerFlowDesigner/src/snakerflow/tool.d.ts +58 -0
  40. package/dist/types/SnakerFlowDesigner/src/snakerflow/transition/index.d.ts +20 -0
  41. package/dist/types/SnakerFlowDesigner/src/snakerflow/wfSubProcess/index.d.ts +26 -0
  42. package/dist/types/SnakerFlowDesigner/src/vModel.d.ts +12 -0
  43. package/dist/types/index.d.ts +2 -0
  44. package/package.json +81 -0
package/README.md ADDED
@@ -0,0 +1,618 @@
1
+ # snaker工作流引擎web设计器(vue3版)
2
+ 情怀!N年前使用的工作流引擎,虽然原作者已经不再维护,但是还是有那么一波人还在使用。个人看来其核心功能尚好,麻雀虽少,五脏俱全,是用来学习工作流引擎的好项目。但其流程设计器所用的技术栈可能就跟不上时代了(2016年前的开源项目)。为了让大伙或自己用得更舒心,或者也为了让更多人认识或重新认识这个工作流引擎。本人就花些许时间,使用现阶段前端主流的技术栈重新开发此款流程设计器。如大家在使用的过程中如有啥问题,欢迎留言或进群交流!
3
+
4
+ # 加群交流可加作者微信:mldong_ (`微信号有下划线`)
5
+
6
+ # 交流圈子
7
+
8
+ ![纷传](doc/images/fenchuan.jpg)
9
+
10
+ [在线体验] (https://snaker-vue3.mldong.com/)
11
+
12
+ [编辑模式] (https://snaker-vue3.mldong.com/)
13
+
14
+ [只读模式] (https://snaker-vue3.mldong.com/preview)
15
+
16
+ [高亮模式] (https://snaker-vue3.mldong.com/highLight)
17
+
18
+ [xml数据] (https://snaker-vue3.mldong.com/xml)
19
+
20
+ # 使用案例
21
+ [后端工程] (https://gitee.com/mldong/mldong)
22
+
23
+ [前端工程] (https://gitee.com/mldong/mldong-vue3)
24
+
25
+ # 如何使用
26
+ ## 安装
27
+ ```bash
28
+ npm install snakerflow-designer-vue@next --save
29
+ ```
30
+ ## 其他依赖
31
+ 设计器依赖以下第三方库,如果工程中没有引入这些第三库将会无法正常使用,需自行安装。
32
+ ```bash
33
+ npm install @logicflow/core@^1.1.28 --save
34
+ npm install @logicflow/extension@^1.1.28 --save
35
+ npm install clipboard@^2.0.11 --save
36
+ npm install vue-json-pretty@^2.1.1 --save
37
+ ```
38
+ ## 引入
39
+ ```js
40
+ import { createApp } from 'vue'
41
+ import App from './App.vue'
42
+ import router from './router'
43
+ import ElementPlus from 'element-plus'
44
+ import 'element-plus/dist/index.css'
45
+ // 导入组件库
46
+ import SnakerFlowDesigner from 'snakerflow-designer-vue'
47
+ createApp(App).use(router).use(ElementPlus).use(SnakerFlowDesigner).mount('#app')
48
+
49
+ ```
50
+ ## 样例
51
+ ### 编辑模式
52
+ ```html
53
+ <!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/vue3/examples/views/Home.vue -->
54
+ <SnakerFlowDesigner ref='designerRef' v-model="flowData" @on-save="handleSave"/>
55
+
56
+ ```
57
+ ### 只读模式
58
+ ```html
59
+ <!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/vue3/examples/views/Preview.vue -->
60
+ <SnakerFlowDesigner :viewer="true" ref='designerRef' v-model="flowData"/>
61
+ ```
62
+ ### 高亮模式
63
+ ```html
64
+ <!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/vue3/examples/views/HighLight.vue -->
65
+ <SnakerFlowDesigner :viewer="true" ref='designerRef' v-model="flowData" :high-light="highLight"/>
66
+ ```
67
+ ### XML数据
68
+ ```html
69
+ <!-- https://gitee.com/mldong/snakerflow-designer-vue/blob/vue3/examples/views/Xml.vue -->
70
+ <SnakerFlowDesigner :viewer="true" ref='designerRef' v-model="flowData"/>
71
+ ```
72
+ ## 属性
73
+ | 参数 | 说明 | 类型 |可选值 |默认值 |
74
+ | ---- | ---- | ---- | ---- |---- |
75
+ | value / v-model | 绑定值(xml或json) | string/object |-- |-- |
76
+ | config | LogicFlow配置 | object |-- |-- |
77
+ | viewer | 是否预览模式 | boolean | true/false |false |
78
+ | highLight | 高亮数据,具体见下表 | object | -- | -- |
79
+ | extendAttrConfig | 扩展属性配置,具体见下表 | object | -- | -- |
80
+ | extendPropertyKeys | 配置额外扩展属性和自定义插槽一起使用,详见examples/views/CustomAssigner | Array | -- | -- |
81
+ | showDoc | 是否显示码云标识 | boolean | true/false |true |
82
+ ### highLight
83
+ | 参数 | 说明 | 类型 |可选值 |默认值 |
84
+ | ---- | ---- | ---- | ---- |---- |
85
+ | historyNodeNames | 历史节点名称 | array |-- |-- |
86
+ | historyEdgeNames | 历史边名称 | array |-- |-- |
87
+ | activeNodeNames | 活跃节点名称 | array |-- |-- |
88
+ ### extendAttrConfig
89
+ #### 样例数据
90
+ ``` json
91
+ {
92
+ "items": [
93
+ {
94
+ "label": "用户标识",
95
+ "name": "userKey",
96
+ "icon": "",
97
+ "tips": "参与者处理类可根据用户标识获取参与者"
98
+ },
99
+ {
100
+ "label": "用户组标识",
101
+ "name": "groupKey",
102
+ "icon": "",
103
+ "tips": "参与者处理类可根据用户组标识获取参与者"
104
+ }
105
+ ]
106
+ }
107
+ ```
108
+ #### 说明
109
+ | 参数 | 说明 | 类型 |必填 |默认值 |
110
+ | ---- | ---- | ---- | ---- |---- |
111
+ | label | 显示名称 | string | 是 |-- |
112
+ | name | 名称 | string | 是|-- |
113
+ | icon | 图标 | string | 否|-- |
114
+ | tips | 提示语 | string | 否|-- |
115
+
116
+ #### 默认配置
117
+
118
+ | 显示名称 | 名称 | 图标 |提示语 |
119
+ | ---- | ---- | ---- | ---- |
120
+ | 用户标识 | userKey | -- | 参与者处理类可根据用户标识获取参与者 |
121
+ | 用户组标识 | groupKey | -- | 参与者处理类可根据用户组标识获取参与者 |
122
+ | 候选用户 | candidateUsers | -- | 候选用户(提供给上一节点选择下一节点参与者的用户标识) |
123
+ | 候选用户组 | candidateGroups | -- | 候选用户组(提供给上一节点选择下一节点参与者的用户组标识) |
124
+ | 候选人处理类 | candidateHandler | -- | 获取候选人的处理类 |
125
+ | 额外属性1 | attr1 | -- | 其他扩展属性1 |
126
+ | 额外属性2 | attr2 | -- | 其他扩展属性2 |
127
+ | 额外属性3 | attr3 | -- | 其他扩展属性3 |
128
+ ## 方法
129
+ | 方法名 | 说明 | 参数 |
130
+ | ---- | ---- | ---- |
131
+ | importXml | 导入SnakerFlow流程定义数据 | (xml) snakerflow流程定义xml |
132
+ | importJson | 导入LogicFlow流程定义数据 | (data) LogicFlow流程定义json对象或json字符串 |
133
+ | setHighLight | 设置高亮数据 | (data) 和属性中的hightLight数据结构一致 |
134
+
135
+ ## 插槽slot
136
+ 规则:`form-item-${nodeType}-${field}`
137
+ 使用样例:
138
+ ``` html
139
+ <SnakerFlowDesigner ref='designerRef' v-model="flowData" @on-save="handleSave">
140
+ <template #form-item-task-assignee="{model, field}">
141
+ <el-form-item label="自定义参与者">
142
+ <el-input v-model="model[field]"></el-input>
143
+ </el-form-item>
144
+ </template>
145
+ </SnakerFlowDesigner>
146
+ ```
147
+ ### nodeType类型
148
+ | 名称 | 说明 |
149
+ | ---- | ---- |
150
+ | task | 任务节点 |
151
+ | custom | 自定义节点 |
152
+ | decision | 决策节点 |
153
+ | end | 结束节点 |
154
+ | fork | 分支节点 |
155
+ | join | 合并节点 |
156
+ | process | 流程 |
157
+ | start | 开始节点 |
158
+ | subProcess | 子流程 |
159
+ | transition | 边 |
160
+ | wfSubProcess | snaker子流程 |
161
+
162
+ ### task节点插槽slot
163
+ | 名称 | 说明 |
164
+ | ---- | ---- |
165
+ | form-item-task-name | 名称 |
166
+ | form-item-task-displayName | 显示名称 |
167
+ | form-item-task-form | 表单 |
168
+ | form-item-task-assignee | 参与者 |
169
+ | form-item-task-assignmentHandler | 参与者处理类 |
170
+ | form-item-task-taskType | 任务类型 |
171
+ | form-item-task-performType | 参与类型 |
172
+ | form-item-task-preInterceptors | 前置拦截器 |
173
+ | form-item-task-postInterceptors | 后置拦截器 |
174
+ | form-item-task-reminderTime | 提醒时间 |
175
+ | form-item-task-reminderRepeat | 重复提醒间隔 |
176
+ | form-item-task-expireTime | 期待完成时间 |
177
+ | form-item-task-autoExecute | 是否自动完成 |
178
+ | form-item-task-width | 宽度 |
179
+ | form-item-task-height | 高度 |
180
+ ### custom节点插槽slot
181
+ | 名称 | 说明 |
182
+ | ---- | ---- |
183
+ | form-item-custom-name | 名称 |
184
+ | form-item-custom-displayName | 显示名称 |
185
+ | form-item-custom-clazz | 类路径 |
186
+ | form-item-custom-methodName | 方法名 |
187
+ | form-item-custom-args | 参数变量 |
188
+ | form-item-custom-preInterceptors | 前置拦截器 |
189
+ | form-item-custom-postInterceptors | 后置拦截器 |
190
+ ### decision节点插槽slot
191
+ | 名称 | 说明 |
192
+ | ---- | ---- |
193
+ | form-item-decision-name | 名称 |
194
+ | form-item-decision-expr | 决策表达式 |
195
+ | form-item-decision-handleClass | 处理类 |
196
+ | form-item-decision-preInterceptors | 前置拦截器 |
197
+ | form-item-decision-postInterceptors | 后置拦截器 |
198
+ ### end节点插槽slot
199
+ | 名称 | 说明 |
200
+ | ---- | ---- |
201
+ | form-item-end-name | 名称 |
202
+ | form-item-end-preInterceptors | 前置拦截器 |
203
+ | form-item-end-postInterceptors | 后置拦截器 |
204
+ ### fork节点插槽slot
205
+ | 名称 | 说明 |
206
+ | ---- | ---- |
207
+ | form-item-end-name | 名称 |
208
+ ### join节点插槽slot
209
+ | 名称 | 说明 |
210
+ | ---- | ---- |
211
+ | form-item-join-name | 名称 |
212
+ ### process节点插槽slot
213
+ | 名称 | 说明 |
214
+ | ---- | ---- |
215
+ | form-item-process-name | 流程定义名称 |
216
+ | form-item-process-displayName | 流程定义显示名称 |
217
+ | form-item-process-expireTime | 期望完成时间 |
218
+ | form-item-process-instanceUrl | 实例启动Url |
219
+ | form-item-process-instanceNoClass | 实例编号生成类 |
220
+ | form-item-process-preInterceptors | 节点前置拦截器 |
221
+ | form-item-process-postInterceptors | 节点后置拦截器 |
222
+ ### start节点插槽slot
223
+ | 名称 | 说明 |
224
+ | ---- | ---- |
225
+ | form-item-start-name | 名称 |
226
+ | form-item-start-preInterceptors | 前置拦截器 |
227
+ | form-item-start-postInterceptors | 后置拦截器 |
228
+ ### subProcess节点插槽slot
229
+ | 名称 | 说明 |
230
+ | ---- | ---- |
231
+ | form-item-subProcess-name | 流程定义名称 |
232
+ | form-item-subProcess-displayName | 流程定义显示名称 |
233
+ | form-item-subProcess-expireTime | 期望完成时间 |
234
+ | form-item-subProcess-instanceUrl | 实例启动Url |
235
+ | form-item-subProcess-instanceNoClass | 实例编号生成类 |
236
+ | form-item-subProcess-preInterceptors | 节点前置拦截器 |
237
+ | form-item-subProcess-postInterceptors | 节点后置拦截器 |
238
+ ### transition节点插槽slot
239
+ | 名称 | 说明 |
240
+ | ---- | ---- |
241
+ | form-item-transition-name | 名称 |
242
+ | form-item-subProcess-displayName | 显示名称 |
243
+ | form-item-transition-expr | 决策表达式 |
244
+ ### wfSubProcess节点插槽slot
245
+ | 名称 | 说明 |
246
+ | ---- | ---- |
247
+ | form-item-wfSubProcess-name | 子流程定义名称 |
248
+ | form-item-wfSubProcess-displayName | 子流程定义显示名称 |
249
+ | form-item-wfSubProcess-form | 表单 |
250
+ | form-item-wfSubProcess-version | 版本号 |
251
+ | form-item-wfSubProcess-width | 宽度 |
252
+ | form-item-wfSubProcess-height | 高度 |
253
+ ## 事件
254
+ | 事件名称 | 说明 | 回调参数 |
255
+ | ---- | ---- | ---- |
256
+ | on-save | 点击右上角工具栏保存按钮时触发 | 传递流程图数据对象data,包含json和xml数据({json, xml}) |
257
+
258
+
259
+
260
+ # 本地开发
261
+ ## 安装
262
+ ```bash
263
+ npm install
264
+
265
+ yarn install
266
+ ```
267
+
268
+ ## 开发
269
+ ```bash
270
+ npm run serve
271
+
272
+ yarn serve
273
+ ```
274
+
275
+ ## 打包编译
276
+ ```bash
277
+ npm run build
278
+
279
+ yarn build
280
+ ```
281
+
282
+ ## 校验
283
+ ```bash
284
+ npm run lint
285
+
286
+ yarn lint
287
+ ```
288
+ # 数据
289
+ ## JSON样例数据
290
+ ``` json
291
+ {
292
+ "name": "leave",
293
+ "displayName": "请假",
294
+ "expireTime": "",
295
+ "instanceUrl": "leaveForm",
296
+ "nodes": [
297
+ {
298
+ "id": "start",
299
+ "type": "snaker:start",
300
+ "x": 340,
301
+ "y": 160,
302
+ "properties": {},
303
+ "text": {
304
+ "x": 340,
305
+ "y": 200,
306
+ "value": "开始"
307
+ }
308
+ },
309
+ {
310
+ "id": "apply",
311
+ "type": "snaker:task",
312
+ "x": 520,
313
+ "y": 160,
314
+ "properties": {
315
+ "taskType": "Major",
316
+ "performType": "ANY",
317
+ "autoExecute": "N",
318
+ "assignee": "approve.operator"
319
+ },
320
+ "text": {
321
+ "x": 520,
322
+ "y": 160,
323
+ "value": "请假申请"
324
+ }
325
+ },
326
+ {
327
+ "id": "approveDept",
328
+ "type": "snaker:task",
329
+ "x": 740,
330
+ "y": 160,
331
+ "properties": {
332
+ "assignee": "",
333
+ "taskType": "Major",
334
+ "performType": "ANY",
335
+ "autoExecute": "N",
336
+ "assignmentHandler": "com.mldong.config.FlowAssignmentHandler"
337
+ },
338
+ "text": {
339
+ "x": 740,
340
+ "y": 160,
341
+ "value": "部门领导审批"
342
+ }
343
+ },
344
+ {
345
+ "id": "end",
346
+ "type": "snaker:end",
347
+ "x": 1080,
348
+ "y": 160,
349
+ "properties": {},
350
+ "text": {
351
+ "x": 1080,
352
+ "y": 200,
353
+ "value": "结束"
354
+ }
355
+ },
356
+ {
357
+ "id": "2c75eebf-5baf-4cd0-a7b3-05466be13634",
358
+ "type": "snaker:decision",
359
+ "x": 740,
360
+ "y": 340,
361
+ "properties": {}
362
+ },
363
+ {
364
+ "id": "approveBoss",
365
+ "type": "snaker:task",
366
+ "x": 900,
367
+ "y": 480,
368
+ "properties": {
369
+ "assignee": "",
370
+ "taskType": "Major",
371
+ "performType": "ANY",
372
+ "autoExecute": "N",
373
+ "assignmentHandler": "com.mldong.config.FlowAssignmentHandler"
374
+ },
375
+ "text": {
376
+ "x": 900,
377
+ "y": 480,
378
+ "value": "公司领导审批"
379
+ }
380
+ }
381
+ ],
382
+ "edges": [
383
+ {
384
+ "id": "3037be41-5682-4344-b94a-9faf5c3e62ba",
385
+ "type": "snaker:transition",
386
+ "sourceNodeId": "start",
387
+ "targetNodeId": "apply",
388
+ "startPoint": {
389
+ "x": 358,
390
+ "y": 160
391
+ },
392
+ "endPoint": {
393
+ "x": 460,
394
+ "y": 160
395
+ },
396
+ "properties": {},
397
+ "pointsList": [
398
+ {
399
+ "x": 358,
400
+ "y": 160
401
+ },
402
+ {
403
+ "x": 460,
404
+ "y": 160
405
+ }
406
+ ]
407
+ },
408
+ {
409
+ "id": "c79642ae-9f28-4213-8cdf-0e0d6467b1b9",
410
+ "type": "snaker:transition",
411
+ "sourceNodeId": "apply",
412
+ "targetNodeId": "approveDept",
413
+ "startPoint": {
414
+ "x": 580,
415
+ "y": 160
416
+ },
417
+ "endPoint": {
418
+ "x": 680,
419
+ "y": 160
420
+ },
421
+ "properties": {},
422
+ "pointsList": [
423
+ {
424
+ "x": 580,
425
+ "y": 160
426
+ },
427
+ {
428
+ "x": 680,
429
+ "y": 160
430
+ }
431
+ ]
432
+ },
433
+ {
434
+ "id": "09d9b143-9473-4a0f-8287-9abf6f65baf5",
435
+ "type": "snaker:transition",
436
+ "sourceNodeId": "approveDept",
437
+ "targetNodeId": "2c75eebf-5baf-4cd0-a7b3-05466be13634",
438
+ "startPoint": {
439
+ "x": 740,
440
+ "y": 200
441
+ },
442
+ "endPoint": {
443
+ "x": 740,
444
+ "y": 315
445
+ },
446
+ "properties": {},
447
+ "pointsList": [
448
+ {
449
+ "x": 740,
450
+ "y": 200
451
+ },
452
+ {
453
+ "x": 740,
454
+ "y": 315
455
+ }
456
+ ]
457
+ },
458
+ {
459
+ "id": "517ef2c7-3486-4992-b554-0f538ab91751",
460
+ "type": "snaker:transition",
461
+ "sourceNodeId": "2c75eebf-5baf-4cd0-a7b3-05466be13634",
462
+ "targetNodeId": "end",
463
+ "startPoint": {
464
+ "x": 764,
465
+ "y": 339
466
+ },
467
+ "endPoint": {
468
+ "x": 1080,
469
+ "y": 178
470
+ },
471
+ "properties": {
472
+ "expr": "#f_day<3"
473
+ },
474
+ "text": {
475
+ "x": 912,
476
+ "y": 339,
477
+ "value": "请假天数小于3"
478
+ },
479
+ "pointsList": [
480
+ {
481
+ "x": 764,
482
+ "y": 339
483
+ },
484
+ {
485
+ "x": 1080,
486
+ "y": 339
487
+ },
488
+ {
489
+ "x": 1080,
490
+ "y": 178
491
+ }
492
+ ]
493
+ },
494
+ {
495
+ "id": "d7ec4166-f3fc-4fd6-a2ac-a6c4d509c4dd",
496
+ "type": "snaker:transition",
497
+ "sourceNodeId": "2c75eebf-5baf-4cd0-a7b3-05466be13634",
498
+ "targetNodeId": "approveBoss",
499
+ "startPoint": {
500
+ "x": 740,
501
+ "y": 365
502
+ },
503
+ "endPoint": {
504
+ "x": 840,
505
+ "y": 480
506
+ },
507
+ "properties": {
508
+ "expr": "#f_day>=3"
509
+ },
510
+ "text": {
511
+ "x": 740,
512
+ "y": 422.5,
513
+ "value": "请假天数大于等于3"
514
+ },
515
+ "pointsList": [
516
+ {
517
+ "x": 740,
518
+ "y": 365
519
+ },
520
+ {
521
+ "x": 740,
522
+ "y": 480
523
+ },
524
+ {
525
+ "x": 840,
526
+ "y": 480
527
+ }
528
+ ]
529
+ },
530
+ {
531
+ "id": "a64348ec-4168-4f36-8a61-15cf12c710b9",
532
+ "type": "snaker:transition",
533
+ "sourceNodeId": "approveBoss",
534
+ "targetNodeId": "end",
535
+ "startPoint": {
536
+ "x": 960,
537
+ "y": 480
538
+ },
539
+ "endPoint": {
540
+ "x": 1080,
541
+ "y": 142
542
+ },
543
+ "properties": {},
544
+ "pointsList": [
545
+ {
546
+ "x": 960,
547
+ "y": 480
548
+ },
549
+ {
550
+ "x": 1140,
551
+ "y": 480
552
+ },
553
+ {
554
+ "x": 1140,
555
+ "y": 112
556
+ },
557
+ {
558
+ "x": 1080,
559
+ "y": 112
560
+ },
561
+ {
562
+ "x": 1080,
563
+ "y": 142
564
+ }
565
+ ]
566
+ }
567
+ ]
568
+ }
569
+ ```
570
+ ## XML样例数据
571
+ ```xml
572
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
573
+ <process name="leave" displayName="请假" instanceUrl="leaveForm">
574
+ <start name="start" displayName="开始" layout="340,160,120,80">
575
+ <transition name="3037be41-5682-4344-b94a-9faf5c3e62ba" to="apply" g="358,160;460,160"></transition>
576
+ </start>
577
+ <task name="apply" displayName="请假申请" layout="520,160,120,80" taskType="Major" performType="ANY" autoExecute="N" assignee="approve.operator">
578
+ <transition name="c79642ae-9f28-4213-8cdf-0e0d6467b1b9" to="approveDept" g="580,160;680,160"></transition>
579
+ </task>
580
+ <task name="approveDept" displayName="部门领导审批" layout="740,160,120,80" taskType="Major" performType="ANY" autoExecute="N" assignmentHandler="com.mldong.config.FlowAssignmentHandler">
581
+ <transition name="09d9b143-9473-4a0f-8287-9abf6f65baf5" to="2c75eebf-5baf-4cd0-a7b3-05466be13634" g="740,200;740,315"></transition>
582
+ </task>
583
+ <decision name="2c75eebf-5baf-4cd0-a7b3-05466be13634" layout="740,340,120,80">
584
+ <transition name="517ef2c7-3486-4992-b554-0f538ab91751" displayName="请假天数小于3" to="end" expr="#f_day&lt;3" g="764,339;1080,339;1080,178"></transition>
585
+ <transition name="d7ec4166-f3fc-4fd6-a2ac-a6c4d509c4dd" displayName="请假天数大于等于3" to="approveBoss" expr="#f_day&gt;=3" g="740,365;740,480;840,480"></transition>
586
+ </decision>
587
+ <end name="end" displayName="结束" layout="1080,160,120,80">
588
+ </end>
589
+ <task name="approveBoss" displayName="公司领导审批" layout="900,480,120,80" taskType="Major" performType="ANY" autoExecute="N" assignmentHandler="com.mldong.config.FlowAssignmentHandler">
590
+ <transition name="a64348ec-4168-4f36-8a61-15cf12c710b9" to="end" g="960,480;1140,480;1140,112;1080,112;1080,142"></transition>
591
+ </task>
592
+ </process>
593
+ ```
594
+ ## 高亮数据
595
+ ``` json
596
+ {
597
+ "historyNodeNames": [
598
+ "start",
599
+ "apply"
600
+ ],
601
+ "historyEdgeNames": [
602
+ "3037be41-5682-4344-b94a-9faf5c3e62ba",
603
+ "c79642ae-9f28-4213-8cdf-0e0d6467b1b9"
604
+ ],
605
+ "activeNodeNames": [
606
+ "approveDept"
607
+ ]
608
+ }
609
+ ```
610
+
611
+ # 相关资料
612
+ [snakerflow-designer-vue2.0] (https://gitee.com/mldong/snakerflow-designer-vue)
613
+
614
+ [LogicFlow] (http://logic-flow.org/)
615
+
616
+ [snaker工作流中文文档] (https://yunmel.gitbooks.io/snakerflow/content/)
617
+
618
+ [snaker源码] (https://gitee.com/yuqs/snakerflow)