Skip to content

Commit de073e8

Browse files
committed
feat: 工作流审批页面timeline组件节点icon展示样式自定义特殊处理
1 parent dfa9cd5 commit de073e8

File tree

6 files changed

+146
-18
lines changed

6 files changed

+146
-18
lines changed

src/assets/svgs/bpm/auditor.svg

Lines changed: 1 addition & 0 deletions
Loading

src/assets/svgs/bpm/condition.svg

Lines changed: 1 addition & 0 deletions
Loading

src/assets/svgs/bpm/copy.svg

Lines changed: 1 addition & 0 deletions
Loading

src/assets/svgs/bpm/parallel.svg

Lines changed: 1 addition & 0 deletions
Loading

src/assets/svgs/bpm/starter.svg

Lines changed: 1 addition & 0 deletions
Loading

src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue

Lines changed: 141 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,32 @@
99
:icon="getApprovalNodeIcon(activity.status, activity.nodeType)"
1010
:color="getApprovalNodeColor(activity.status)"
1111
>
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>
1226
<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>
1438
<div class="flex items-center flex-wrap mt-1">
1539
<!-- 情况一:遍历每个审批节点下的【进行中】task 任务 -->
1640
<div v-for="(task, idx) in activity.tasks" :key="idx" class="flex items-center">
@@ -70,7 +94,7 @@
7094
<div
7195
v-for="(user, idx1) in activity.candidateUsers"
7296
:key="idx1"
73-
class="flex items-center"
97+
class="flex items-center self-start"
7498
>
7599
<div class="flex items-center flex-col pr-2">
76100
<div class="position-relative">
@@ -99,13 +123,6 @@
99123
</div>
100124
</div>
101125
</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>
109126
</div>
110127
</el-timeline-item>
111128
</el-timeline>
@@ -117,16 +134,105 @@ import * as ProcessInstanceApi from '@/api/bpm/processInstance'
117134
import { TaskStatusEnum } from '@/api/bpm/task'
118135
import { NodeType } from '@/components/SimpleProcessDesignerV2/src/consts'
119136
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+
120143
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+
]
124231
125232
// 审批节点
126-
127233
const statusIconMap2 = {
128234
// 未开始
129-
'-1': { color: '#e5e7ec', icon: 'ep-clock' },
235+
'-1': { color: '#909398', icon: 'ep-clock' },
130236
// 待审批
131237
'0': { color: '#e5e7ec', icon: 'ep:loading' },
132238
// 审批中
@@ -147,7 +253,7 @@ const statusIconMap2 = {
147253
148254
const statusIconMap = {
149255
// 审批未开始
150-
'-1': { color: '#e5e7ec', icon: Clock },
256+
'-1': { color: '#909398', icon: Clock },
151257
'0': { color: '#e5e7ec', icon: Clock },
152258
// 审批中
153259
'1': { color: '#448ef7', icon: Loading },
@@ -165,6 +271,23 @@ const statusIconMap = {
165271
'7': { color: '#00b32a', icon: Check }
166272
}
167273
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+
168291
const getApprovalNodeIcon = (taskStatus: number, nodeType: NodeType) => {
169292
if (taskStatus == TaskStatusEnum.NOT_START) {
170293
return statusIconMap[taskStatus]?.icon
@@ -181,13 +304,13 @@ const getApprovalNodeColor = (taskStatus: number) => {
181304
182305
const getApprovalNodeTime = (node: ProcessInstanceApi.ApprovalNodeInfo) => {
183306
if (node.nodeType === NodeType.START_USER_NODE && node.startTime) {
184-
return `发起时间:${formatDate(node.startTime)}`
307+
return `${formatDate(node.startTime)}`
185308
}
186309
if (node.endTime) {
187-
return `审批时间:${formatDate(node.endTime)}`
310+
return `${formatDate(node.endTime)}`
188311
}
189312
if (node.startTime) {
190-
return `创建时间:${formatDate(node.startTime)}`
313+
return `${formatDate(node.startTime)}`
191314
}
192315
}
193316
</script>

0 commit comments

Comments
 (0)