Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
98e9ba49
authored
Nov 02, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【功能修改】工作流:流程审批详情的“流程记录”,从 timeline 改成 list table
parent
5121d569
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
161 deletions
+67
-161
src/views/bpm/processInstance/detail/ProcessInstanceTaskList.vue
+61
-112
src/views/bpm/processInstance/detail/index.vue
+6
-49
No files found.
src/views/bpm/processInstance/detail/ProcessInstanceTaskList.vue
View file @
98e9ba49
<
template
>
<el-card
v-loading=
"loading"
class=
"box-card"
>
<el-col>
<div
class=
"block"
>
<el-timeline>
<el-timeline-item
v-if=
"processInstance.endTime"
:type=
"getProcessInstanceTimelineItemType(processInstance)"
>
<p
style=
"font-weight: 700"
>
结束流程:在
{{
formatDate
(
processInstance
?.
endTime
)
}}
结束
<dict-tag
:type=
"DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
:value=
"processInstance.status"
/>
</p>
</el-timeline-item>
<el-timeline-item
v-for=
"(item, index) in tasks"
:key=
"index"
:type=
"getTaskTimelineItemType(item)"
>
<p
style=
"font-weight: 700"
>
审批任务:
{{
item
.
name
}}
<dict-tag
:type=
"DICT_TYPE.BPM_TASK_STATUS"
:value=
"item.status"
/>
<el-button
class=
"ml-10px"
size=
"small"
v-if=
"item.formId > 0"
@
click=
"handleFormDetail(item)"
>
<Icon
icon=
"ep:document"
/>
查看表单
</el-button>
</p>
<el-card
:body-style=
"
{ padding: '10px' }">
<label
v-if=
"item.assigneeUser"
style=
"margin-right: 30px; font-weight: normal"
>
审批人:
{{
item
.
assigneeUser
.
nickname
}}
<el-tag
size=
"small"
type=
"info"
>
{{
item
.
assigneeUser
.
deptName
}}
</el-tag>
</label>
<label
v-if=
"item.createTime"
style=
"font-weight: normal"
>
创建时间:
</label>
<label
style=
"font-weight: normal; color: #8a909c"
>
{{
formatDate
(
item
?.
createTime
)
}}
</label>
<label
v-if=
"item.endTime"
style=
"margin-left: 30px; font-weight: normal"
>
审批时间:
</label>
<label
v-if=
"item.endTime"
style=
"font-weight: normal; color: #8a909c"
>
{{
formatDate
(
item
?.
endTime
)
}}
</label>
<label
v-if=
"item.durationInMillis"
style=
"margin-left: 30px; font-weight: normal"
>
耗时:
</label>
<label
v-if=
"item.durationInMillis"
style=
"font-weight: normal; color: #8a909c"
>
{{
formatPast2
(
item
?.
durationInMillis
)
}}
</label>
<p
v-if=
"item.reason"
>
审批建议:
{{
item
.
reason
}}
</p>
</el-card>
</el-timeline-item>
<el-timeline-item
type=
"success"
>
<p
style=
"font-weight: 700"
>
发起流程:【
{{
processInstance
.
startUser
?.
nickname
}}
】在
{{
formatDate
(
processInstance
?.
startTime
)
}}
发起【
{{
processInstance
.
name
}}
】流程
</p>
</el-timeline-item>
</el-timeline>
</div>
</el-col>
</el-card>
<el-table
:data=
"tasks"
border
header-cell-class-name=
"table-header-gray"
>
<el-table-column
label=
"审批节点"
prop=
"name"
min-width=
"120"
align=
"center"
/>
<el-table-column
label=
"审批人"
min-width=
"100"
align=
"center"
>
<template
#
default=
"scope"
>
{{
scope
.
row
.
assigneeUser
?.
nickname
||
scope
.
row
.
ownerUser
?.
nickname
}}
</
template
>
</el-table-column>
<el-table-column
:formatter=
"dateFormatter"
align=
"center"
label=
"开始时间"
prop=
"createTime"
min-width=
"140"
/>
<el-table-column
:formatter=
"dateFormatter"
align=
"center"
label=
"结束时间"
prop=
"endTime"
min-width=
"140"
/>
<el-table-column
align=
"center"
label=
"审批状态"
prop=
"status"
min-width=
"90"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.BPM_TASK_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"审批建议"
prop=
"reason"
min-width=
"200"
>
<
template
#
default=
"scope"
>
{{
scope
.
row
.
reason
}}
<el-button
class=
"ml-10px"
size=
"small"
v-if=
"scope.row.formId > 0"
@
click=
"handleFormDetail(scope.row)"
>
<Icon
icon=
"ep:document"
/>
查看表单
</el-button>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"耗时"
prop=
"durationInMillis"
min-width=
"100"
>
<
template
#
default=
"scope"
>
{{
formatPast2
(
scope
.
row
.
durationInMillis
)
}}
</
template
>
</el-table-column>
</el-table>
<!-- 弹窗:表单 -->
<Dialog
title=
"表单详情"
v-model=
"taskFormVisible"
width=
"600"
>
...
...
@@ -78,53 +56,20 @@
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
import
{
formatDate
,
formatPast2
}
from
'@/utils/formatTime'
import
{
dateFormatter
,
formatPast2
}
from
'@/utils/formatTime'
import
{
propTypes
}
from
'@/utils/propTypes'
import
{
DICT_TYPE
}
from
'@/utils/dict'
import
type
{
ApiAttrs
}
from
'@form-create/element-ui/types/config'
import
{
setConfAndFields2
}
from
'@/utils/formCreate'
import
*
as
TaskApi
from
'@/api/bpm/task'
defineOptions
({
name
:
'BpmProcessInstanceTaskList'
})
defineProps
({
loading
:
propTypes
.
bool
,
// 是否加载中
processInstance
:
propTypes
.
object
,
// 流程实例
tasks
:
propTypes
.
arrayOf
(
propTypes
.
object
)
// 流程任务的数组
const
props
=
defineProps
({
loading
:
propTypes
.
bool
.
def
(
false
),
// 是否加载中
id
:
propTypes
.
string
// 流程实例的编号
})
/** 获得流程实例对应的颜色 */
const
getProcessInstanceTimelineItemType
=
(
item
:
any
)
=>
{
if
(
item
.
status
===
2
)
{
return
'success'
}
if
(
item
.
status
===
3
)
{
return
'danger'
}
if
(
item
.
status
===
4
)
{
return
'warning'
}
return
''
}
/** 获得任务对应的颜色 */
const
getTaskTimelineItemType
=
(
item
:
any
)
=>
{
if
([
0
,
1
,
6
,
7
].
includes
(
item
.
status
))
{
return
'primary'
}
if
(
item
.
status
===
2
)
{
return
'success'
}
if
(
item
.
status
===
3
)
{
return
'danger'
}
if
(
item
.
status
===
4
)
{
return
'info'
}
if
(
item
.
status
===
5
)
{
return
'warning'
}
return
''
}
const
tasks
=
ref
([])
// 流程任务的数组
/** 查看表单 */
const
fApi
=
ref
<
ApiAttrs
>
()
// form-create 的 API 操作类
...
...
@@ -134,7 +79,7 @@ const taskForm = ref({
value
:
{}
})
// 流程任务的表单详情
const
taskFormVisible
=
ref
(
false
)
const
handleFormDetail
=
async
(
row
)
=>
{
const
handleFormDetail
=
async
(
row
:
any
)
=>
{
// 设置表单
setConfAndFields2
(
taskForm
,
row
.
formConf
,
row
.
formFields
,
row
.
formVariables
)
// 弹窗打开
...
...
@@ -146,9 +91,13 @@ const handleFormDetail = async (row) => {
fApi
.
value
?.
fapi
?.
disabled
(
true
)
}
/** 刷新数据 */
const
emit
=
defineEmits
([
'refresh'
])
// 定义 success 事件,用于操作成功后的回调
const
refresh
=
()
=>
{
emit
(
'refresh'
)
}
/** 只有 loading 完成时,才去加载流程列表 */
watch
(
()
=>
props
.
loading
,
async
(
value
)
=>
{
if
(
value
)
{
tasks
.
value
=
await
TaskApi
.
getTaskListByProcessInstanceId
(
props
.
id
)
}
}
)
</
script
>
src/views/bpm/processInstance/detail/index.vue
View file @
98e9ba49
...
...
@@ -65,7 +65,7 @@
</el-col>
<el-col
:span=
"7"
>
<!-- 审批记录时间线 -->
<ProcessInstanceTimeline
ref=
"timelineRef"
:activity-nodes=
"activityNodes"
/>
<ProcessInstanceTimeline
:activity-nodes=
"activityNodes"
/>
</el-col>
</el-row>
</el-scrollbar>
...
...
@@ -96,12 +96,7 @@
<el-tab-pane
label=
"流转记录"
name=
"record"
>
<div
class=
"form-scroll-area"
>
<el-scrollbar>
<ProcessInstanceTaskList
:loading=
"tasksLoad"
:process-instance=
"processInstance"
:tasks=
"tasks"
:show-header=
"false"
/>
<ProcessInstanceTaskList
:loading=
"processInstanceLoading"
:id=
"id"
/>
</el-scrollbar>
</div>
</el-tab-pane>
...
...
@@ -135,14 +130,14 @@ import { BpmModelType } from '@/utils/constants'
import
{
setConfAndFields2
}
from
'@/utils/formCreate'
import
type
{
ApiAttrs
}
from
'@form-create/element-ui/types/config'
import
*
as
ProcessInstanceApi
from
'@/api/bpm/processInstance'
import
*
as
TaskApi
from
'@/api/bpm/task
'
import
*
as
UserApi
from
'@/api/system/user
'
import
ProcessInstanceBpmnViewer
from
'./ProcessInstanceBpmnViewer.vue'
import
ProcessInstanceSimpleViewer
from
'./ProcessInstanceSimpleViewer.vue'
import
ProcessInstanceTaskList
from
'./ProcessInstanceTaskList.vue'
import
ProcessInstanceOperationButton
from
'./ProcessInstanceOperationButton.vue'
import
ProcessInstanceTimeline
from
'./ProcessInstanceTimeline.vue'
import
*
as
UserApi
from
'@/api/system/user'
import
{
FieldPermissionType
}
from
'@/components/SimpleProcessDesignerV2/src/consts'
// TODO 代码优化,换个明确的 icon 名字
import
audit1
from
'@/assets/svgs/bpm/audit1.svg'
import
audit2
from
'@/assets/svgs/bpm/audit2.svg'
import
audit3
from
'@/assets/svgs/bpm/audit3.svg'
...
...
@@ -158,11 +153,8 @@ const message = useMessage() // 消息弹窗
const
processInstanceLoading
=
ref
(
false
)
// 流程实例的加载中
const
processInstance
=
ref
<
any
>
({})
// 流程实例
const
processDefinition
=
ref
<
any
>
({})
// 流程定义
const
timelineRef
=
ref
()
// 操作按钮组件 ref
const
operationButtonRef
=
ref
()
const
tasksLoad
=
ref
(
true
)
// 任务的加载中
const
tasks
=
ref
<
any
[]
>
([])
// 任务列表
const
operationButtonRef
=
ref
()
// 操作按钮组件 ref
const
auditIcons
=
{
1
:
audit1
,
2
:
audit2
,
...
...
@@ -180,10 +172,7 @@ const detailForm = ref({
/** 获得详情 */
const
getDetail
=
()
=>
{
// 1. 获取审批详情
getApprovalDetail
()
// 2. 获得流程任务列表
getTaskList
()
}
/** 加载流程实例 */
...
...
@@ -269,38 +258,6 @@ const setFieldPermission = (field: string, permission: string) => {
}
}
/** 加载任务列表 */
const
getTaskList
=
async
()
=>
{
try
{
// 获得未取消的任务
tasksLoad
.
value
=
true
const
data
=
await
TaskApi
.
getTaskListByProcessInstanceId
(
props
.
id
)
tasks
.
value
=
[]
// 1.1 移除已取消的审批
data
.
forEach
((
task
:
any
)
=>
{
if
(
task
.
status
!==
4
)
{
tasks
.
value
.
push
(
task
)
}
})
// 1.2 排序,将未完成的排在前面,已完成的排在后面;
tasks
.
value
.
sort
((
a
,
b
)
=>
{
// 有已完成的情况,按照完成时间倒序
if
(
a
.
endTime
&&
b
.
endTime
)
{
return
b
.
endTime
-
a
.
endTime
}
else
if
(
a
.
endTime
)
{
return
1
}
else
if
(
b
.
endTime
)
{
return
-
1
// 都是未完成,按照创建时间倒序
}
else
{
return
b
.
createTime
-
a
.
createTime
}
})
}
finally
{
tasksLoad
.
value
=
false
}
}
/**
* 操作成功后刷新
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment