9
9
:icon =" getApprovalNodeIcon(activity.status, activity.nodeType)"
10
10
:color =" getApprovalNodeColor(activity.status)"
11
11
>
12
+ <template #dot >
13
+ <div
14
+ class =" position-absolute left--10px top--6px rounded-full border border-solid border-#dedede w-30px h-30px flex justify-center items-center bg-#3f73f7 p-5px"
15
+ >
16
+ <img class =" w-full h-full" :src =" getApprovalNodeImg(activity.nodeType)" alt =" " />
17
+ <div
18
+ class =" position-absolute top-17px left-17px bg-#fff rounded-full flex items-center p-2px"
19
+ >
20
+ <el-icon :size =" 12" :color =" getApprovalNodeColor(activity.status)" >
21
+ <component :is =" getApprovalNodeIcon(activity.status, activity.nodeType)" />
22
+ </el-icon >
23
+ </div >
24
+ </div >
25
+ </template >
12
26
<div class =" flex flex-col items-start" >
13
- <div class =" font-bold" > {{ activity.name }}</div >
27
+ <!-- 第一行:节点名称、时间 -->
28
+ <div class =" flex w-full" >
29
+ <div class =" font-bold" > {{ activity.name }}</div >
30
+ <!-- 信息:时间 -->
31
+ <div
32
+ v-if =" activity.status !== TaskStatusEnum.NOT_START"
33
+ class =" text-#a5a5a5 text-13px mt-1 ml-auto"
34
+ >
35
+ {{ getApprovalNodeTime(activity) }}
36
+ </div >
37
+ </div >
14
38
<div class =" flex items-center flex-wrap mt-1" >
15
39
<!-- 情况一:遍历每个审批节点下的【进行中】task 任务 -->
16
40
<div v-for =" (task, idx) in activity.tasks" :key =" idx" class =" flex items-center" >
70
94
<div
71
95
v-for =" (user, idx1) in activity.candidateUsers"
72
96
:key =" idx1"
73
- class =" flex items-center"
97
+ class =" flex items-center self-start "
74
98
>
75
99
<div class =" flex items-center flex-col pr-2" >
76
100
<div class =" position-relative" >
99
123
</div >
100
124
</div >
101
125
</div >
102
- <!-- 信息:时间 -->
103
- <div
104
- v-if =" activity.status !== TaskStatusEnum.NOT_START"
105
- class =" text-#a5a5a5 text-13px mt-1"
106
- >
107
- {{ getApprovalNodeTime(activity) }}
108
- </div >
109
126
</div >
110
127
</el-timeline-item >
111
128
</el-timeline >
@@ -117,16 +134,105 @@ import * as ProcessInstanceApi from '@/api/bpm/processInstance'
117
134
import { TaskStatusEnum } from ' @/api/bpm/task'
118
135
import { NodeType } from ' @/components/SimpleProcessDesignerV2/src/consts'
119
136
import { Check , Close , Loading , Clock , Minus , Delete } from ' @element-plus/icons-vue'
137
+ import starterSvg from ' @/assets/svgs/bpm/starter.svg'
138
+ import auditorSvg from ' @/assets/svgs/bpm/auditor.svg'
139
+ import copySvg from ' @/assets/svgs/bpm/copy.svg'
140
+ import conditionSvg from ' @/assets/svgs/bpm/condition.svg'
141
+ import parallelSvg from ' @/assets/svgs/bpm/parallel.svg'
142
+
120
143
defineOptions ({ name: ' BpmProcessInstanceTimeline' })
121
- defineProps <{
122
- approveNodes: ProcessInstanceApi .ApprovalNodeInfo [] // 审批节点信息
123
- }>()
144
+ // defineProps<{
145
+ // approveNodes: ProcessInstanceApi.ApprovalNodeInfo[] // 审批节点信息
146
+ // }>()
147
+ const approveNodes = [
148
+ {
149
+ id: 1 ,
150
+ name: ' 发起审批' ,
151
+ nodeType: NodeType .START_USER_NODE ,
152
+ status: TaskStatusEnum .NOT_START ,
153
+ startTime: new Date (' 2024-10-01 10:00:00' ),
154
+ endTime: null ,
155
+ candidateUsers: [],
156
+ tasks: []
157
+ },
158
+ {
159
+ id: 2 ,
160
+ name: ' 经理审批' ,
161
+ nodeType: NodeType .USER_TASK_NODE ,
162
+ status: TaskStatusEnum .RUNNING , // 审批中
163
+ startTime: new Date (' 2024-10-02 11:00:00' ),
164
+ endTime: null ,
165
+ candidateUsers: [
166
+ {
167
+ nickname: ' 张经理' ,
168
+ avatar: ' https://picsum.photos/200?r=1'
169
+ },
170
+ {
171
+ nickname: ' 张经理' ,
172
+ avatar: ' https://picsum.photos/200?r=1'
173
+ },
174
+ {
175
+ nickname: ' 张经理' ,
176
+ avatar: ' https://picsum.photos/200?r=1'
177
+ },
178
+ {
179
+ nickname: ' 张经理' ,
180
+ avatar: ' https://picsum.photos/200?r=1'
181
+ }
182
+ ],
183
+ tasks: [
184
+ {
185
+ assigneeUser: {
186
+ nickname: ' 李经理' ,
187
+ avatar: ' https://picsum.photos/200?r=1'
188
+ },
189
+ ownerUser: null ,
190
+ status: TaskStatusEnum .RUNNING , // 审批中
191
+ reason: ' 同意'
192
+ }
193
+ ]
194
+ },
195
+ {
196
+ id: 3 ,
197
+ name: ' 财务审批' ,
198
+ nodeType: NodeType .USER_TASK_NODE ,
199
+ status: TaskStatusEnum .APPROVE , // 审批通过
200
+ startTime: new Date (' 2024-10-03 14:00:00' ),
201
+ endTime: new Date (' 2024-10-03 15:00:00' ),
202
+ candidateUsers: [],
203
+ tasks: [
204
+ {
205
+ assigneeUser: {
206
+ nickname: ' 王财务' ,
207
+ avatar: ' https://picsum.photos/200?r=1'
208
+ },
209
+ ownerUser: null ,
210
+ status: TaskStatusEnum .APPROVE , // 审批通过
211
+ reason: ' 审批通过'
212
+ }
213
+ ]
214
+ },
215
+ {
216
+ id: 4 ,
217
+ name: ' 总经理审批' ,
218
+ nodeType: NodeType .USER_TASK_NODE ,
219
+ status: TaskStatusEnum .NOT_START , // 未开始
220
+ startTime: null ,
221
+ endTime: null ,
222
+ candidateUsers: [
223
+ {
224
+ nickname: ' 总经理' ,
225
+ avatar: ' https://picsum.photos/200?r=1'
226
+ }
227
+ ],
228
+ tasks: []
229
+ }
230
+ ]
124
231
125
232
// 审批节点
126
-
127
233
const statusIconMap2 = {
128
234
// 未开始
129
- ' -1' : { color: ' #e5e7ec ' , icon: ' ep-clock' },
235
+ ' -1' : { color: ' #909398 ' , icon: ' ep-clock' },
130
236
// 待审批
131
237
' 0' : { color: ' #e5e7ec' , icon: ' ep:loading' },
132
238
// 审批中
@@ -147,7 +253,7 @@ const statusIconMap2 = {
147
253
148
254
const statusIconMap = {
149
255
// 审批未开始
150
- ' -1' : { color: ' #e5e7ec ' , icon: Clock },
256
+ ' -1' : { color: ' #909398 ' , icon: Clock },
151
257
' 0' : { color: ' #e5e7ec' , icon: Clock },
152
258
// 审批中
153
259
' 1' : { color: ' #448ef7' , icon: Loading },
@@ -165,6 +271,23 @@ const statusIconMap = {
165
271
' 7' : { color: ' #00b32a' , icon: Check }
166
272
}
167
273
274
+ const nodeTypeSvgMap = {
275
+ // 发起人节点
276
+ [NodeType .START_USER_NODE ]: { color: ' ' , svg: starterSvg },
277
+ // 审批人节点
278
+ [NodeType .USER_TASK_NODE ]: { color: ' ' , svg: auditorSvg },
279
+ // 抄送人节点
280
+ [NodeType .COPY_TASK_NODE ]: { color: ' ' , svg: copySvg },
281
+ // 条件分支节点
282
+ [NodeType .CONDITION_NODE ]: { color: ' ' , svg: conditionSvg },
283
+ // 并行分支节点
284
+ [NodeType .PARALLEL_BRANCH_NODE ]: { color: ' ' , svg: parallelSvg }
285
+ }
286
+
287
+ const getApprovalNodeImg = (nodeType : NodeType ) => {
288
+ return nodeTypeSvgMap [nodeType ]?.svg
289
+ }
290
+
168
291
const getApprovalNodeIcon = (taskStatus : number , nodeType : NodeType ) => {
169
292
if (taskStatus == TaskStatusEnum .NOT_START ) {
170
293
return statusIconMap [taskStatus ]?.icon
@@ -181,13 +304,13 @@ const getApprovalNodeColor = (taskStatus: number) => {
181
304
182
305
const getApprovalNodeTime = (node : ProcessInstanceApi .ApprovalNodeInfo ) => {
183
306
if (node .nodeType === NodeType .START_USER_NODE && node .startTime ) {
184
- return ` 发起时间: ${formatDate (node .startTime )}`
307
+ return ` ${formatDate (node .startTime )} `
185
308
}
186
309
if (node .endTime ) {
187
- return ` 审批时间: ${formatDate (node .endTime )}`
310
+ return ` ${formatDate (node .endTime )} `
188
311
}
189
312
if (node .startTime ) {
190
- return ` 创建时间: ${formatDate (node .startTime )}`
313
+ return ` ${formatDate (node .startTime )} `
191
314
}
192
315
}
193
316
</script >
0 commit comments