Skip to content

Commit eb79ee1

Browse files
committed
仿钉钉流程设计器- 新增发起人节点,去掉开始节点
1 parent eb7e939 commit eb79ee1

File tree

10 files changed

+350
-100
lines changed

10 files changed

+350
-100
lines changed

src/components/SimpleProcessDesignerV2/src/NodeHandler.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020
</div>
2121
<div class="handler-item-text">抄送</div>
2222
</div>
23-
<div class="handler-item" @click="addNode(NodeType.EXCLUSIVE_NODE)">
23+
<div class="handler-item" @click="addNode(NodeType.CONDITION_BRANCH_NODE)">
2424
<div class="handler-item-icon condition">
2525
<span class="iconfont icon-size icon-exclusive"></span>
2626
</div>
2727
<div class="handler-item-text">条件分支</div>
2828
</div>
29-
<div class="handler-item" @click="addNode(NodeType.PARALLEL_NODE_FORK)">
29+
<div class="handler-item" @click="addNode(NodeType.PARALLEL_BRANCH_NODE)">
3030
<div class="handler-item-icon condition">
3131
<span class="iconfont icon-size icon-parallel"></span>
3232
</div>
@@ -107,10 +107,10 @@ const addNode = (type: number) => {
107107
}
108108
emits('update:childNode', data)
109109
}
110-
if (type === NodeType.EXCLUSIVE_NODE) {
110+
if (type === NodeType.CONDITION_BRANCH_NODE) {
111111
const data: SimpleFlowNode = {
112112
name: '条件分支',
113-
type: NodeType.EXCLUSIVE_NODE,
113+
type: NodeType.CONDITION_BRANCH_NODE,
114114
id: 'GateWay_' + generateUUID(),
115115
childNode: props.childNode,
116116
conditionNodes: [
@@ -140,10 +140,10 @@ const addNode = (type: number) => {
140140
}
141141
emits('update:childNode', data)
142142
}
143-
if (type === NodeType.PARALLEL_NODE_FORK) {
143+
if (type === NodeType.PARALLEL_BRANCH_NODE) {
144144
const data: SimpleFlowNode = {
145145
name: '并行分支',
146-
type: NodeType.PARALLEL_NODE_FORK,
146+
type: NodeType.PARALLEL_BRANCH_NODE,
147147
id: 'GateWay_' + generateUUID(),
148148
childNode: props.childNode,
149149
conditionNodes: [

src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<template>
2-
<!-- 开始节点 -->
3-
<StartEventNode
4-
v-if="currentNode && currentNode.type === NodeType.START_EVENT_NODE"
2+
<!-- 发起人节点 -->
3+
<StartUserNode
4+
v-if="currentNode && currentNode.type === NodeType.START_USER_NODE"
55
:flow-node="currentNode"
66
/>
77
<!-- 审批节点 -->
@@ -19,14 +19,14 @@
1919
/>
2020
<!-- 条件节点 -->
2121
<ExclusiveNode
22-
v-if="currentNode && currentNode.type === NodeType.EXCLUSIVE_NODE"
22+
v-if="currentNode && currentNode.type === NodeType.CONDITION_BRANCH_NODE"
2323
:flow-node="currentNode"
2424
@update:model-value="handleModelValueUpdate"
2525
@find:parent-node="findFromParentNode"
2626
/>
2727
<!-- 并行节点 -->
2828
<ParallelNode
29-
v-if="currentNode && currentNode.type === NodeType.PARALLEL_NODE_FORK"
29+
v-if="currentNode && currentNode.type === NodeType.PARALLEL_BRANCH_NODE"
3030
:flow-node="currentNode"
3131
@update:model-value="handleModelValueUpdate"
3232
@find:parent-node="findFromParentNode"
@@ -43,7 +43,7 @@
4343
<EndEventNode v-if="currentNode && currentNode.type === NodeType.END_EVENT_NODE" />
4444
</template>
4545
<script setup lang="ts">
46-
import StartEventNode from './nodes/StartEventNode.vue'
46+
import StartUserNode from './nodes/StartUserNode.vue'
4747
import EndEventNode from './nodes/EndEventNode.vue'
4848
import UserTaskNode from './nodes/UserTaskNode.vue'
4949
import CopyTaskNode from './nodes/CopyTaskNode.vue'
@@ -90,7 +90,11 @@ const recursiveFindParentNode = (
9090
findNode: SimpleFlowNode,
9191
nodeType: number
9292
) => {
93-
if (!findNode || findNode.type === NodeType.START_EVENT_NODE) {
93+
if (!findNode) {
94+
return
95+
}
96+
if (findNode.type === NodeType.START_USER_NODE) {
97+
nodeList.push(findNode)
9498
return
9599
}
96100

src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
<script setup lang="ts">
3838
import ProcessNodeTree from './ProcessNodeTree.vue'
3939
import { updateBpmSimpleModel, getBpmSimpleModel } from '@/api/bpm/simple'
40-
import { SimpleFlowNode, NodeType, NODE_DEFAULT_TEXT } from './consts'
40+
import { SimpleFlowNode, NodeType, NodeId, NODE_DEFAULT_TEXT } from './consts'
4141
4242
defineOptions({
4343
name: 'SimpleProcessDesigner'
@@ -83,7 +83,7 @@ const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNo
8383
if (type == NodeType.END_EVENT_NODE) {
8484
return
8585
}
86-
if (type == NodeType.START_EVENT_NODE) {
86+
if (type == NodeType.START_USER_NODE) {
8787
validateNode(node.childNode, errorNodes)
8888
}
8989
@@ -106,7 +106,7 @@ const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNo
106106
validateNode(node.childNode, errorNodes)
107107
}
108108
109-
if (type == NodeType.EXCLUSIVE_NODE) {
109+
if (type == NodeType.CONDITION_BRANCH_NODE) {
110110
conditionNodes?.forEach((item) => {
111111
validateNode(item, errorNodes)
112112
})
@@ -138,17 +138,16 @@ const zoomIn = () => {
138138
139139
onMounted(async () => {
140140
const result = await getBpmSimpleModel(props.modelId)
141-
console.log('the result is :', result)
142141
if (result) {
143142
processNodeTree.value = result
144143
} else {
145144
// 初始值
146145
processNodeTree.value = {
147-
name: '开始',
148-
type: NodeType.START_EVENT_NODE,
149-
id: 'StartEvent',
146+
name: '发起人',
147+
type: NodeType.START_USER_NODE,
148+
id: NodeId.START_USER_NODE_ID,
150149
childNode: {
151-
id: 'EndEvent',
150+
id: NodeId.END_EVENT_NODE_ID,
152151
name: '结束',
153152
type: NodeType.END_EVENT_NODE
154153
}

src/components/SimpleProcessDesignerV2/src/consts.ts

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,54 @@ import { DictDataVO } from '@/api/system/dict/types'
66
*/
77
export enum NodeType {
88
/**
9-
* 发起人节点
9+
* 结束节点
1010
*/
11-
START_EVENT_NODE = 0,
11+
END_EVENT_NODE = 1,
1212
/**
13-
* 结束节点
13+
* 发起人节点
1414
*/
15-
END_EVENT_NODE = -2,
16-
15+
START_USER_NODE = 10,
1716
/**
1817
* 审批人节点
1918
*/
20-
USER_TASK_NODE = 1,
19+
USER_TASK_NODE = 11,
2120

2221
/**
2322
* 抄送人节点
2423
*/
25-
COPY_TASK_NODE = 2,
24+
COPY_TASK_NODE = 12,
2625

2726
/**
2827
* 条件节点
2928
*/
30-
CONDITION_NODE = 3,
29+
CONDITION_NODE = 50,
3130
/**
32-
* 条件分支节点
31+
* 条件分支节点 (对应排他网关)
3332
*/
34-
EXCLUSIVE_NODE = 4,
33+
CONDITION_BRANCH_NODE = 51,
3534
/**
36-
* 并行分支分叉节点
35+
* 并行分支节点 (对应并行网关)
3736
*/
38-
PARALLEL_NODE_FORK = 5,
37+
PARALLEL_BRANCH_NODE = 52,
38+
3939
/**
40-
* 并行分支聚合
40+
* 包容分支节点 (对应包容网关)
4141
*/
42-
PARALLEL_NODE_JOIN = 6,
42+
INCLUSIVE_BRANCH_NODE = 53
43+
}
44+
45+
export enum NodeId {
4346
/**
44-
* 包容分支分叉节点
47+
* 发起人节点 Id
4548
*/
46-
INCLUSIVE_NODE_FORK = 7,
49+
START_USER_NODE_ID = 'StartUserNode',
50+
4751
/**
48-
* 包容分支聚合节点
52+
* 发起人节点 Id
4953
*/
50-
INCLUSIVE_NODE_JOIN = 8
54+
END_EVENT_NODE_ID = 'EndEvent'
5155
}
56+
5257
/**
5358
* 节点结构定义
5459
*/
@@ -298,7 +303,23 @@ export enum ConditionConfigType {
298303
*/
299304
RULE = 2
300305
}
301-
306+
/**
307+
* 表单权限的枚举
308+
*/
309+
export enum FieldPermissionType {
310+
/**
311+
* 只读
312+
*/
313+
READ = '1',
314+
/**
315+
* 编辑
316+
*/
317+
WRITE = '2',
318+
/**
319+
* 隐藏
320+
*/
321+
NONE = '3'
322+
}
302323
/**
303324
* 操作按钮权限结构定义
304325
*/
@@ -335,6 +356,7 @@ export enum OperationButtonType {
335356
*/
336357
RETURN = 6
337358
}
359+
338360
/**
339361
* 条件规则结构定义
340362
*/
@@ -369,11 +391,13 @@ export const NODE_DEFAULT_TEXT = new Map<number, string>()
369391
NODE_DEFAULT_TEXT.set(NodeType.USER_TASK_NODE, '请配置审批人')
370392
NODE_DEFAULT_TEXT.set(NodeType.COPY_TASK_NODE, '请配置抄送人')
371393
NODE_DEFAULT_TEXT.set(NodeType.CONDITION_NODE, '请设置条件')
394+
NODE_DEFAULT_TEXT.set(NodeType.START_USER_NODE, '请设置发起人')
372395

373396
export const NODE_DEFAULT_NAME = new Map<number, string>()
374397
NODE_DEFAULT_NAME.set(NodeType.USER_TASK_NODE, '审批人')
375398
NODE_DEFAULT_NAME.set(NodeType.COPY_TASK_NODE, '抄送人')
376399
NODE_DEFAULT_NAME.set(NodeType.CONDITION_NODE, '条件')
400+
NODE_DEFAULT_NAME.set(NodeType.START_USER_NODE, '发起人')
377401

378402
// 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
379403
export const CANDIDATE_STRATEGY: DictDataVO[] = [
@@ -483,6 +507,16 @@ export const DEFAULT_BUTTON_SETTING: ButtonSetting[] = [
483507
{ id: OperationButtonType.RETURN, displayName: '回退', enable: false }
484508
]
485509

510+
// 发起人的按钮权限。暂时定死,不可以编辑
511+
export const START_USER_BUTTON_SETTING: ButtonSetting[] = [
512+
{ id: OperationButtonType.APPROVE, displayName: '提交', enable: true },
513+
{ id: OperationButtonType.REJECT, displayName: '拒绝', enable: false },
514+
{ id: OperationButtonType.TRANSFER, displayName: '转办', enable: false },
515+
{ id: OperationButtonType.DELEGATE, displayName: '委派', enable: false },
516+
{ id: OperationButtonType.ADD_SIGN, displayName: '加签', enable: false },
517+
{ id: OperationButtonType.RETURN, displayName: '回退', enable: false }
518+
]
519+
486520
export const MULTI_LEVEL_DEPT: DictDataVO = [
487521
{ label: '第 1 级部门', value: 1 },
488522
{ label: '第 2 级部门', value: 2 },

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {
1212
RejectHandlerType,
1313
NODE_DEFAULT_NAME,
1414
AssignStartUserHandlerType,
15-
AssignEmptyHandlerType
15+
AssignEmptyHandlerType,
16+
FieldPermissionType
1617
} from './consts'
1718
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
1819
const node = ref<SimpleFlowNode>(props.flowNode)
@@ -26,9 +27,9 @@ export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlo
2627
}
2728

2829
/**
29-
* @description 表单数据权限配置,用于审批节点、抄送节点
30+
* @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点
3031
*/
31-
export function useFormFieldsPermission() {
32+
export function useFormFieldsPermission(defaultPermission: FieldPermissionType) {
3233
// 字段权限配置. 需要有 field, title, permissioin 属性
3334
const fieldsPermissionConfig = ref<Array<Record<string, string>>>([])
3435

@@ -66,7 +67,7 @@ export function useFormFieldsPermission() {
6667
fieldsPermission.push({
6768
field,
6869
title,
69-
permission: '1' // 只读
70+
permission: defaultPermission
7071
})
7172
// TODO 子表单 需要处理子表单字段
7273
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
@@ -139,7 +140,6 @@ export function useNodeForm(nodeType: NodeType) {
139140
const configForm = ref<UserTaskFormType | CopyTaskFormType>()
140141
if (nodeType === NodeType.USER_TASK_NODE) {
141142
configForm.value = {
142-
//candidateParamArray: [],
143143
candidateStrategy: CandidateStrategy.USER,
144144
approveMethod: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE,
145145
approveRatio: 100,
@@ -154,7 +154,6 @@ export function useNodeForm(nodeType: NodeType) {
154154
}
155155
} else {
156156
configForm.value = {
157-
//candidateParamArray: [],
158157
candidateStrategy: CandidateStrategy.USER
159158
}
160159
}

src/components/SimpleProcessDesignerV2/src/nodes-config/CopyTaskNodeConfig.vue

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,29 @@
157157
<div class="field-setting-item-label"> {{ item.title }} </div>
158158
<el-radio-group class="field-setting-item-group" v-model="item.permission">
159159
<div class="item-radio-wrap">
160-
<el-radio value="1" size="large" label="1"><span></span></el-radio>
160+
<el-radio
161+
:value="FieldPermissionType.READ"
162+
size="large"
163+
:label="FieldPermissionType.WRITE"
164+
><span></span
165+
></el-radio>
161166
</div>
162167
<div class="item-radio-wrap">
163-
<el-radio value="2" size="large" label="2" disabled><span></span></el-radio>
168+
<el-radio
169+
:value="FieldPermissionType.WRITE"
170+
size="large"
171+
:label="FieldPermissionType.WRITE"
172+
disabled
173+
><span></span
174+
></el-radio>
164175
</div>
165176
<div class="item-radio-wrap">
166-
<el-radio value="3" size="large" label="3"><span></span></el-radio>
177+
<el-radio
178+
:value="FieldPermissionType.NONE"
179+
size="large"
180+
:label="FieldPermissionType.NONE"
181+
><span></span
182+
></el-radio>
167183
</div>
168184
</el-radio-group>
169185
</div>
@@ -180,7 +196,13 @@
180196
</el-drawer>
181197
</template>
182198
<script setup lang="ts">
183-
import { SimpleFlowNode, CandidateStrategy, NodeType, CANDIDATE_STRATEGY } from '../consts'
199+
import {
200+
SimpleFlowNode,
201+
CandidateStrategy,
202+
NodeType,
203+
CANDIDATE_STRATEGY,
204+
FieldPermissionType
205+
} from '../consts'
184206
import {
185207
useWatchNode,
186208
useDrawer,
@@ -208,7 +230,9 @@ const { nodeName, showInput, clickIcon, blurEvent } = useNodeName(NodeType.COPY_
208230
// 激活的 Tab 标签页
209231
const activeTabName = ref('user')
210232
// 表单字段权限配置
211-
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission()
233+
const { formType, fieldsPermissionConfig, getNodeConfigFormFields } = useFormFieldsPermission(
234+
FieldPermissionType.READ
235+
)
212236
// 抄送人表单配置
213237
const formRef = ref() // 表单 Ref
214238
// 表单校验规则

0 commit comments

Comments
 (0)