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
5286ad1c
authored
Mar 22, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BPM:新增【流程实例】菜单,用于全部流程实例的查询
parent
ee12e691
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
300 additions
and
22 deletions
+300
-22
src/api/bpm/processInstance/index.ts
+15
-3
src/views/bpm/oa/leave/index.vue
+1
-1
src/views/bpm/processInstance/index.vue
+29
-18
src/views/bpm/processInstance/manager/index.vue
+255
-0
No files found.
src/api/bpm/processInstance/index.ts
View file @
5286ad1c
...
@@ -31,20 +31,32 @@ export type ProcessInstanceCopyVO = {
...
@@ -31,20 +31,32 @@ export type ProcessInstanceCopyVO = {
reason
:
string
reason
:
string
}
}
export
const
get
MyProcessInstancePage
=
async
(
params
)
=>
{
export
const
get
ProcessInstanceMyPage
=
async
(
params
:
any
)
=>
{
return
await
request
.
get
({
url
:
'/bpm/process-instance/my-page'
,
params
})
return
await
request
.
get
({
url
:
'/bpm/process-instance/my-page'
,
params
})
}
}
export
const
getProcessInstanceManagerPage
=
async
(
params
:
any
)
=>
{
return
await
request
.
get
({
url
:
'/bpm/process-instance/manager-page'
,
params
})
}
export
const
createProcessInstance
=
async
(
data
)
=>
{
export
const
createProcessInstance
=
async
(
data
)
=>
{
return
await
request
.
post
({
url
:
'/bpm/process-instance/create'
,
data
:
data
})
return
await
request
.
post
({
url
:
'/bpm/process-instance/create'
,
data
:
data
})
}
}
export
const
cancelProcessInstance
=
async
(
id
:
number
,
reason
:
string
)
=>
{
export
const
cancelProcessInstanceByStartUser
=
async
(
id
:
number
,
reason
:
string
)
=>
{
const
data
=
{
id
:
id
,
reason
:
reason
}
return
await
request
.
delete
({
url
:
'/bpm/process-instance/cancel-by-start-user'
,
data
:
data
})
}
export
const
cancelProcessInstanceByAdmin
=
async
(
id
:
number
,
reason
:
string
)
=>
{
const
data
=
{
const
data
=
{
id
:
id
,
id
:
id
,
reason
:
reason
reason
:
reason
}
}
return
await
request
.
delete
({
url
:
'/bpm/process-instance/cancel'
,
data
:
data
})
return
await
request
.
delete
({
url
:
'/bpm/process-instance/cancel
-by-admin
'
,
data
:
data
})
}
}
export
const
getProcessInstance
=
async
(
id
:
string
)
=>
{
export
const
getProcessInstance
=
async
(
id
:
string
)
=>
{
...
...
src/views/bpm/oa/leave/index.vue
View file @
5286ad1c
...
@@ -226,7 +226,7 @@ const cancelLeave = async (row) => {
...
@@ -226,7 +226,7 @@ const cancelLeave = async (row) => {
inputErrorMessage
:
'取消原因不能为空'
inputErrorMessage
:
'取消原因不能为空'
})
})
// 发起取消
// 发起取消
await
ProcessInstanceApi
.
cancelProcessInstance
(
row
.
id
,
value
)
await
ProcessInstanceApi
.
cancelProcessInstance
ByStartUser
(
row
.
id
,
value
)
message
.
success
(
'取消成功'
)
message
.
success
(
'取消成功'
)
// 刷新列表
// 刷新列表
await
getList
()
await
getList
()
...
...
src/views/bpm/processInstance/index.vue
View file @
5286ad1c
...
@@ -58,7 +58,7 @@
...
@@ -58,7 +58,7 @@
/>
/>
</el-select>
</el-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"
提交
时间"
prop=
"createTime"
>
<el-form-item
label=
"
发起
时间"
prop=
"createTime"
>
<el-date-picker
<el-date-picker
v-model=
"queryParams.createTime"
v-model=
"queryParams.createTime"
value-format=
"YYYY-MM-DD HH:mm:ss"
value-format=
"YYYY-MM-DD HH:mm:ss"
...
@@ -87,23 +87,21 @@
...
@@ -87,23 +87,21 @@
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"流程编号"
align=
"center"
prop=
"id"
width=
"300px"
/>
<el-table-column
label=
"流程名称"
align=
"center"
prop=
"name"
min-width=
"200px"
fixed=
"left"
/>
<el-table-column
label=
"流程名称"
align=
"center"
prop=
"name"
/>
<el-table-column
<el-table-column
label=
"流程分类"
align=
"center"
prop=
"categoryName"
/>
label=
"流程分类"
<el-table-column
label=
"当前审批任务"
align=
"center"
prop=
"tasks"
>
align=
"center"
<template
#
default=
"scope"
>
prop=
"categoryName"
<el-button
type=
"primary"
v-for=
"task in scope.row.tasks"
:key=
"task.id"
link
>
min-width=
"100"
<span>
{{
task
.
name
}}
</span>
fixed=
"left"
</el-button>
/>
</
template
>
<el-table-column
label=
"流程状态"
prop=
"status"
width=
"120"
>
</el-table-column>
<el-table-column
label=
"流程"
prop=
"status"
>
<template
#
default=
"scope"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
:value=
"scope.row.status"
/>
<dict-tag
:type=
"DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
<el-table-column
label=
"
提交
时间"
label=
"
发起
时间"
align=
"center"
align=
"center"
prop=
"startTime"
prop=
"startTime"
width=
"180"
width=
"180"
...
@@ -116,7 +114,20 @@
...
@@ -116,7 +114,20 @@
width=
"180"
width=
"180"
:formatter=
"dateFormatter"
:formatter=
"dateFormatter"
/>
/>
<el-table-column
label=
"操作"
align=
"center"
>
<el-table-column
align=
"center"
label=
"耗时"
prop=
"durationInMillis"
width=
"120"
>
<
template
#
default=
"scope"
>
{{
scope
.
row
.
durationInMillis
>
0
?
formatPast2
(
scope
.
row
.
durationInMillis
)
:
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"当前审批任务"
align=
"center"
prop=
"tasks"
min-width=
"120px"
>
<
template
#
default=
"scope"
>
<el-button
type=
"primary"
v-for=
"task in scope.row.tasks"
:key=
"task.id"
link
>
<span>
{{
task
.
name
}}
</span>
</el-button>
</
template
>
</el-table-column>
<el-table-column
label=
"流程编号"
align=
"center"
prop=
"id"
min-width=
"320px"
/>
<el-table-column
label=
"操作"
align=
"center"
fixed=
"right"
width=
"180"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
<el-button
link
link
...
@@ -152,12 +163,12 @@
...
@@ -152,12 +163,12 @@
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
dateFormatter
,
formatPast2
}
from
'@/utils/formatTime'
import
{
ElMessageBox
}
from
'element-plus'
import
{
ElMessageBox
}
from
'element-plus'
import
*
as
ProcessInstanceApi
from
'@/api/bpm/processInstance'
import
*
as
ProcessInstanceApi
from
'@/api/bpm/processInstance'
import
{
CategoryApi
}
from
'@/api/bpm/category'
import
{
CategoryApi
}
from
'@/api/bpm/category'
defineOptions
({
name
:
'BpmProcessInstance'
})
defineOptions
({
name
:
'BpmProcessInstance
My
'
})
const
router
=
useRouter
()
// 路由
const
router
=
useRouter
()
// 路由
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
...
@@ -182,7 +193,7 @@ const categoryList = ref([]) // 流程分类列表
...
@@ -182,7 +193,7 @@ const categoryList = ref([]) // 流程分类列表
const
getList
=
async
()
=>
{
const
getList
=
async
()
=>
{
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
const
data
=
await
ProcessInstanceApi
.
get
MyProcessInstance
Page
(
queryParams
)
const
data
=
await
ProcessInstanceApi
.
get
ProcessInstanceMy
Page
(
queryParams
)
list
.
value
=
data
.
list
list
.
value
=
data
.
list
total
.
value
=
data
.
total
total
.
value
=
data
.
total
}
finally
{
}
finally
{
...
@@ -230,7 +241,7 @@ const handleCancel = async (row) => {
...
@@ -230,7 +241,7 @@ const handleCancel = async (row) => {
inputErrorMessage
:
'取消原因不能为空'
inputErrorMessage
:
'取消原因不能为空'
})
})
// 发起取消
// 发起取消
await
ProcessInstanceApi
.
cancelProcessInstance
(
row
.
id
,
value
)
await
ProcessInstanceApi
.
cancelProcessInstance
ByStartUser
(
row
.
id
,
value
)
message
.
success
(
'取消成功'
)
message
.
success
(
'取消成功'
)
// 刷新列表
// 刷新列表
await
getList
()
await
getList
()
...
...
src/views/bpm/processInstance/manager/index.vue
0 → 100644
View file @
5286ad1c
<
template
>
<doc-alert
title=
"工作流手册"
url=
"https://doc.iocoder.cn/bpm/"
/>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class=
"-mb-15px"
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"发起人"
prop=
"startUserId"
>
<el-select
v-model=
"queryParams.startUserId"
placeholder=
"请选择发起人"
class=
"!w-240px"
>
<el-option
v-for=
"user in userList"
:key=
"user.id"
:label=
"user.nickname"
:value=
"user.id"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"流程名称"
prop=
"name"
>
<el-input
v-model=
"queryParams.name"
placeholder=
"请输入流程名称"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"所属流程"
prop=
"processDefinitionId"
>
<el-input
v-model=
"queryParams.processDefinitionId"
placeholder=
"请输入流程定义的编号"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"流程分类"
prop=
"category"
>
<el-select
v-model=
"queryParams.category"
placeholder=
"请选择流程分类"
clearable
class=
"!w-240px"
>
<el-option
v-for=
"category in categoryList"
:key=
"category.code"
:label=
"category.name"
:value=
"category.code"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"流程状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择流程状态"
clearable
class=
"!w-240px"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"发起时间"
prop=
"createTime"
>
<el-date-picker
v-model=
"queryParams.createTime"
value-format=
"YYYY-MM-DD HH:mm:ss"
type=
"daterange"
start-placeholder=
"开始日期"
end-placeholder=
"结束日期"
:default-time=
"[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class=
"!w-220px"
/>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"流程名称"
align=
"center"
prop=
"name"
min-width=
"200px"
fixed=
"left"
/>
<el-table-column
label=
"流程分类"
align=
"center"
prop=
"categoryName"
min-width=
"100"
fixed=
"left"
/>
<el-table-column
label=
"流程发起人"
align=
"center"
prop=
"startUser.nickname"
width=
"120"
/>
<el-table-column
label=
"发起部门"
align=
"center"
prop=
"startUser.deptName"
width=
"120"
/>
<el-table-column
label=
"流程状态"
prop=
"status"
width=
"120"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"发起时间"
align=
"center"
prop=
"startTime"
width=
"180"
:formatter=
"dateFormatter"
/>
<el-table-column
label=
"结束时间"
align=
"center"
prop=
"endTime"
width=
"180"
:formatter=
"dateFormatter"
/>
<el-table-column
align=
"center"
label=
"耗时"
prop=
"durationInMillis"
width=
"120"
>
<
template
#
default=
"scope"
>
{{
scope
.
row
.
durationInMillis
>
0
?
formatPast2
(
scope
.
row
.
durationInMillis
)
:
'-'
}}
</
template
>
</el-table-column>
<el-table-column
label=
"当前审批任务"
align=
"center"
prop=
"tasks"
min-width=
"120px"
>
<
template
#
default=
"scope"
>
<el-button
type=
"primary"
v-for=
"task in scope.row.tasks"
:key=
"task.id"
link
>
<span>
{{
task
.
name
}}
</span>
</el-button>
</
template
>
</el-table-column>
<el-table-column
label=
"流程编号"
align=
"center"
prop=
"id"
min-width=
"320px"
/>
<el-table-column
label=
"操作"
align=
"center"
fixed=
"right"
width=
"180"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"primary"
v-hasPermi=
"['bpm:process-instance:cancel']"
@
click=
"handleDetail(scope.row)"
>
详情
</el-button>
<el-button
link
type=
"primary"
v-if=
"scope.row.status === 1"
v-hasPermi=
"['bpm:process-instance:query']"
@
click=
"handleCancel(scope.row)"
>
取消
</el-button>
</
template
>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
@
pagination=
"getList"
/>
</ContentWrap>
</template>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
dateFormatter
,
formatPast2
}
from
'@/utils/formatTime'
import
{
ElMessageBox
}
from
'element-plus'
import
*
as
ProcessInstanceApi
from
'@/api/bpm/processInstance'
import
{
CategoryApi
}
from
'@/api/bpm/category'
import
*
as
UserApi
from
'@/api/system/user'
import
{
cancelProcessInstanceByAdmin
}
from
'@/api/bpm/processInstance'
// 它是【我的流程】的差异是,该菜单可以看全部的流程实例
defineOptions
({
name
:
'BpmProcessInstanceManager'
})
const
router
=
useRouter
()
// 路由
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
loading
=
ref
(
true
)
// 列表的加载中
const
total
=
ref
(
0
)
// 列表的总页数
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
startUserId
:
undefined
,
name
:
''
,
processDefinitionId
:
undefined
,
category
:
undefined
,
status
:
undefined
,
createTime
:
[]
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
categoryList
=
ref
([])
// 流程分类列表
const
userList
=
ref
<
any
[]
>
([])
// 用户列表
/** 查询列表 */
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
const
data
=
await
ProcessInstanceApi
.
getProcessInstanceManagerPage
(
queryParams
)
list
.
value
=
data
.
list
total
.
value
=
data
.
total
}
finally
{
loading
.
value
=
false
}
}
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
queryParams
.
pageNo
=
1
getList
()
}
/** 重置按钮操作 */
const
resetQuery
=
()
=>
{
queryFormRef
.
value
.
resetFields
()
handleQuery
()
}
/** 查看详情 */
const
handleDetail
=
(
row
)
=>
{
router
.
push
({
name
:
'BpmProcessInstanceDetail'
,
query
:
{
id
:
row
.
id
}
})
}
/** 取消按钮操作 */
const
handleCancel
=
async
(
row
)
=>
{
// 二次确认
const
{
value
}
=
await
ElMessageBox
.
prompt
(
'请输入取消原因'
,
'取消流程'
,
{
confirmButtonText
:
t
(
'common.ok'
),
cancelButtonText
:
t
(
'common.cancel'
),
inputPattern
:
/^
[\s\S]
*.*
\S[\s\S]
*$/
,
// 判断非空,且非空格
inputErrorMessage
:
'取消原因不能为空'
})
// 发起取消
await
ProcessInstanceApi
.
cancelProcessInstanceByAdmin
(
row
.
id
,
value
)
message
.
success
(
'取消成功'
)
// 刷新列表
await
getList
()
}
/** 激活时 **/
onActivated
(()
=>
{
getList
()
})
/** 初始化 **/
onMounted
(
async
()
=>
{
await
getList
()
categoryList
.
value
=
await
CategoryApi
.
getCategorySimpleList
()
userList
.
value
=
await
UserApi
.
getSimpleUserList
()
})
</
script
>
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