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
Unverified
Commit
9685fbf8
authored
Dec 15, 2024
by
芋道源码
Committed by
GitHub
Dec 15, 2024
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #111 from GoldenZqqq/feature/bpm
工作流模块改造优化
parents
24e13749
746aeaff
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
487 additions
and
113 deletions
+487
-113
src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
+53
-4
src/components/UserSelectForm/index.vue
+29
-10
src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
+56
-19
src/router/modules/remaining.ts
+12
-0
src/views/bpm/model/CategoryDraggableModel.vue
+22
-17
src/views/bpm/model/CreateUpdate.vue
+0
-0
src/views/bpm/model/ModelForm.vue
+153
-17
src/views/bpm/model/editor/index.vue
+129
-39
src/views/bpm/model/index.vue
+6
-1
src/views/bpm/simple/SimpleModelDesign.vue
+27
-6
No files found.
src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue
View file @
9685fbf8
...
@@ -38,12 +38,21 @@ import * as UserGroupApi from '@/api/bpm/userGroup'
...
@@ -38,12 +38,21 @@ import * as UserGroupApi from '@/api/bpm/userGroup'
defineOptions
({
defineOptions
({
name
:
'SimpleProcessDesigner'
name
:
'SimpleProcessDesigner'
})
})
const
emits
=
defineEmits
([
'success'
])
// 保存成功事件
const
emits
=
defineEmits
([
'success'
])
// 保存成功事件
const
props
=
defineProps
({
const
props
=
defineProps
({
modelId
:
{
modelId
:
{
type
:
String
,
type
:
String
,
required
:
true
required
:
false
},
modelKey
:
{
type
:
String
,
required
:
false
},
modelName
:
{
type
:
String
,
required
:
false
}
}
})
})
...
@@ -69,6 +78,33 @@ const message = useMessage() // 国际化
...
@@ -69,6 +78,33 @@ const message = useMessage() // 国际化
const
processNodeTree
=
ref
<
SimpleFlowNode
|
undefined
>
()
const
processNodeTree
=
ref
<
SimpleFlowNode
|
undefined
>
()
const
errorDialogVisible
=
ref
(
false
)
const
errorDialogVisible
=
ref
(
false
)
let
errorNodes
:
SimpleFlowNode
[]
=
[]
let
errorNodes
:
SimpleFlowNode
[]
=
[]
// 添加更新模型的方法
const
updateModel
=
(
key
?:
string
,
name
?:
string
)
=>
{
if
(
!
processNodeTree
.
value
)
{
processNodeTree
.
value
=
{
name
:
name
||
'发起人'
,
type
:
NodeType
.
START_USER_NODE
,
id
:
NodeId
.
START_USER_NODE_ID
,
childNode
:
{
id
:
NodeId
.
END_EVENT_NODE_ID
,
name
:
'结束'
,
type
:
NodeType
.
END_EVENT_NODE
}
}
}
else
if
(
name
)
{
// 更新现有模型的名称
processNodeTree
.
value
.
name
=
name
}
}
// 监听属性变化
watch
([()
=>
props
.
modelKey
,
()
=>
props
.
modelName
],
([
newKey
,
newName
])
=>
{
if
(
!
props
.
modelId
&&
newKey
&&
newName
)
{
updateModel
(
newKey
,
newName
)
}
},
{
immediate
:
true
,
deep
:
true
})
const
saveSimpleFlowModel
=
async
(
simpleModelNode
:
SimpleFlowNode
)
=>
{
const
saveSimpleFlowModel
=
async
(
simpleModelNode
:
SimpleFlowNode
)
=>
{
if
(
!
simpleModelNode
)
{
if
(
!
simpleModelNode
)
{
message
.
error
(
'模型数据为空'
)
message
.
error
(
'模型数据为空'
)
...
@@ -76,6 +112,8 @@ const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
...
@@ -76,6 +112,8 @@ const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
}
}
try
{
try
{
loading
.
value
=
true
loading
.
value
=
true
if
(
props
.
modelId
)
{
// 编辑模式
const
data
=
{
const
data
=
{
id
:
props
.
modelId
,
id
:
props
.
modelId
,
simpleModel
:
simpleModelNode
simpleModel
:
simpleModelNode
...
@@ -87,10 +125,15 @@ const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
...
@@ -87,10 +125,15 @@ const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => {
}
else
{
}
else
{
message
.
alert
(
'修改失败'
)
message
.
alert
(
'修改失败'
)
}
}
}
else
{
// 新建模式,直接返回数据
emits
(
'success'
,
simpleModelNode
)
}
}
finally
{
}
finally
{
loading
.
value
=
false
loading
.
value
=
false
}
}
}
}
// 校验节点设置。 暂时以 showText 为空 未节点错误配置
// 校验节点设置。 暂时以 showText 为空 未节点错误配置
const
validateNode
=
(
node
:
SimpleFlowNode
|
undefined
,
errorNodes
:
SimpleFlowNode
[])
=>
{
const
validateNode
=
(
node
:
SimpleFlowNode
|
undefined
,
errorNodes
:
SimpleFlowNode
[])
=>
{
if
(
node
)
{
if
(
node
)
{
...
@@ -134,6 +177,7 @@ onMounted(async () => {
...
@@ -134,6 +177,7 @@ onMounted(async () => {
try
{
try
{
loading
.
value
=
true
loading
.
value
=
true
// 获取表单字段
// 获取表单字段
if
(
props
.
modelId
)
{
const
bpmnModel
=
await
getModel
(
props
.
modelId
)
const
bpmnModel
=
await
getModel
(
props
.
modelId
)
if
(
bpmnModel
)
{
if
(
bpmnModel
)
{
formType
.
value
=
bpmnModel
.
formType
formType
.
value
=
bpmnModel
.
formType
...
@@ -142,6 +186,7 @@ onMounted(async () => {
...
@@ -142,6 +186,7 @@ onMounted(async () => {
formFields
.
value
=
bpmnForm
?.
fields
formFields
.
value
=
bpmnForm
?.
fields
}
}
}
}
}
// 获得角色列表
// 获得角色列表
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
// 获得岗位列表
// 获得岗位列表
...
@@ -155,14 +200,18 @@ onMounted(async () => {
...
@@ -155,14 +200,18 @@ onMounted(async () => {
// 获取用户组列表
// 获取用户组列表
userGroupOptions
.
value
=
await
UserGroupApi
.
getUserGroupSimpleList
()
userGroupOptions
.
value
=
await
UserGroupApi
.
getUserGroupSimpleList
()
if
(
props
.
modelId
)
{
//获取 SIMPLE 设计器模型
//获取 SIMPLE 设计器模型
const
result
=
await
getBpmSimpleModel
(
props
.
modelId
)
const
result
=
await
getBpmSimpleModel
(
props
.
modelId
)
if
(
result
)
{
if
(
result
)
{
processNodeTree
.
value
=
result
processNodeTree
.
value
=
result
}
else
{
}
// 初始值
}
// 如果没有现有模型,创建初始模型
if
(
!
processNodeTree
.
value
)
{
processNodeTree
.
value
=
{
processNodeTree
.
value
=
{
name
:
'发起人'
,
name
:
props
.
modelName
||
'发起人'
,
type
:
NodeType
.
START_USER_NODE
,
type
:
NodeType
.
START_USER_NODE
,
id
:
NodeId
.
START_USER_NODE_ID
,
id
:
NodeId
.
START_USER_NODE_ID
,
childNode
:
{
childNode
:
{
...
...
src/components/UserSelectForm/index.vue
View file @
9685fbf8
...
@@ -39,7 +39,7 @@
...
@@ -39,7 +39,7 @@
</Dialog>
</Dialog>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
defaultProps
,
findTreeNode
,
handleTree
}
from
'@/utils/tree'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
*
as
DeptApi
from
'@/api/system/dept'
import
*
as
DeptApi
from
'@/api/system/dept'
import
*
as
UserApi
from
'@/api/system/user'
import
*
as
UserApi
from
'@/api/system/user'
...
@@ -50,6 +50,7 @@ const emit = defineEmits<{
...
@@ -50,6 +50,7 @@ const emit = defineEmits<{
const
{
t
}
=
useI18n
()
// 国际
const
{
t
}
=
useI18n
()
// 国际
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
deptTree
=
ref
<
Tree
[]
>
([])
// 部门树形结构化
const
deptTree
=
ref
<
Tree
[]
>
([])
// 部门树形结构化
const
deptList
=
ref
<
any
[]
>
([])
// 保存扁平化的部门列表数据
const
userList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 所有用户列表
const
userList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 所有用户列表
const
filteredUserList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 当前部门过滤后的用户列表
const
filteredUserList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 当前部门过滤后的用户列表
const
selectedUserIdList
:
any
=
ref
([])
// 选中的用户列表
const
selectedUserIdList
:
any
=
ref
([])
// 选中的用户列表
...
@@ -79,7 +80,9 @@ const open = async (id: number, selectedList?: any[]) => {
...
@@ -79,7 +80,9 @@ const open = async (id: number, selectedList?: any[]) => {
resetForm
()
resetForm
()
// 加载部门、用户列表
// 加载部门、用户列表
deptTree
.
value
=
handleTree
(
await
DeptApi
.
getSimpleDeptList
())
const
deptData
=
await
DeptApi
.
getSimpleDeptList
()
deptList
.
value
=
deptData
// 保存扁平结构的部门数据
deptTree
.
value
=
handleTree
(
deptData
)
// 转换成树形结构
userList
.
value
=
await
UserApi
.
getSimpleUserList
()
userList
.
value
=
await
UserApi
.
getSimpleUserList
()
// 初始状态下,过滤列表等于所有用户列表
// 初始状态下,过滤列表等于所有用户列表
...
@@ -88,16 +91,31 @@ const open = async (id: number, selectedList?: any[]) => {
...
@@ -88,16 +91,31 @@ const open = async (id: number, selectedList?: any[]) => {
dialogVisible
.
value
=
true
dialogVisible
.
value
=
true
}
}
/** 获取指定部门及其所有子部门的ID列表 */
const
getChildDeptIds
=
(
deptId
:
number
,
deptList
:
any
[]):
number
[]
=>
{
const
ids
=
[
deptId
]
const
children
=
deptList
.
filter
((
dept
)
=>
dept
.
parentId
===
deptId
)
children
.
forEach
((
child
)
=>
{
ids
.
push
(...
getChildDeptIds
(
child
.
id
,
deptList
))
})
return
ids
}
/** 获取部门过滤后的用户列表 */
/** 获取部门过滤后的用户列表 */
const
get
UserList
=
async
(
deptId
?:
number
)
=>
{
const
filter
UserList
=
async
(
deptId
?:
number
)
=>
{
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
// @ts-ignore
if
(
!
deptId
)
{
// TODO @芋艿:替换到 simple List 暂不支持 deptId 过滤
// 如果没有选择部门,显示所有用户
// TODO @Zqqq:这个,可以使用前端过滤么?通过 deptList 获取到 deptId 子节点,然后去 userList
filteredUserList
.
value
=
[...
userList
.
value
]
const
data
=
await
UserApi
.
getUserPage
({
pageSize
:
100
,
pageNo
:
1
,
deptId
})
return
// 更新过滤后的用户列表
}
filteredUserList
.
value
=
data
.
list
// 直接使用已保存的部门列表数据进行过滤
const
deptIds
=
getChildDeptIds
(
deptId
,
deptList
.
value
)
// 过滤出这些部门下的用户
filteredUserList
.
value
=
userList
.
value
.
filter
((
user
)
=>
deptIds
.
includes
(
user
.
deptId
))
}
finally
{
}
finally
{
formLoading
.
value
=
false
formLoading
.
value
=
false
}
}
...
@@ -121,6 +139,7 @@ const submitForm = async () => {
...
@@ -121,6 +139,7 @@ const submitForm = async () => {
/** 重置表单 */
/** 重置表单 */
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
deptTree
.
value
=
[]
deptTree
.
value
=
[]
deptList
.
value
=
[]
userList
.
value
=
[]
userList
.
value
=
[]
filteredUserList
.
value
=
[]
filteredUserList
.
value
=
[]
selectedUserIdList
.
value
=
[]
selectedUserIdList
.
value
=
[]
...
@@ -128,7 +147,7 @@ const resetForm = () => {
...
@@ -128,7 +147,7 @@ const resetForm = () => {
/** 处理部门被点击 */
/** 处理部门被点击 */
const
handleNodeClick
=
(
row
:
{
[
key
:
string
]:
any
})
=>
{
const
handleNodeClick
=
(
row
:
{
[
key
:
string
]:
any
})
=>
{
get
UserList
(
row
.
id
)
filter
UserList
(
row
.
id
)
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
...
...
src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
View file @
9685fbf8
<
template
>
<
template
>
<div
class=
"process-panel__container"
:style=
"
{ width: `${width}px` }">
<div
class=
"process-panel__container"
:style=
"
{ width: `${width}px` }">
<el-collapse
v-model=
"activeTab"
>
<el-collapse
v-model=
"activeTab"
v-if=
"isReady"
>
<el-collapse-item
name=
"base"
>
<el-collapse-item
name=
"base"
>
<!-- class="panel-tab__title" -->
<!-- class="panel-tab__title" -->
<template
#
title
>
<template
#
title
>
...
@@ -108,24 +108,16 @@ const elementBusinessObject = ref<any>({}) // 元素 businessObject 镜像,提
...
@@ -108,24 +108,16 @@ const elementBusinessObject = ref<any>({}) // 元素 businessObject 镜像,提
const
conditionFormVisible
=
ref
(
false
)
// 流转条件设置
const
conditionFormVisible
=
ref
(
false
)
// 流转条件设置
const
formVisible
=
ref
(
false
)
// 表单配置
const
formVisible
=
ref
(
false
)
// 表单配置
const
bpmnElement
=
ref
()
const
bpmnElement
=
ref
()
const
isReady
=
ref
(
false
)
provide
(
'prefix'
,
props
.
prefix
)
provide
(
'prefix'
,
props
.
prefix
)
provide
(
'width'
,
props
.
width
)
provide
(
'width'
,
props
.
width
)
const
bpmnInstances
=
()
=>
(
window
as
any
)?.
bpmnInstances
// 监听 props.bpmnModeler 然后 initModels
const
unwatchBpmn
=
watch
(
()
=>
props
.
bpmnModeler
,
()
=>
{
// 避免加载时 流程图 并未加载完成
if
(
!
props
.
bpmnModeler
)
{
console
.
log
(
'缺少props.bpmnModeler'
)
return
}
console
.
log
(
'props.bpmnModeler 有值了!!!'
)
// 初始化 bpmnInstances
const
w
=
window
as
any
const
initBpmnInstances
=
()
=>
{
w
.
bpmnInstances
=
{
if
(
!
props
.
bpmnModeler
)
return
false
try
{
const
instances
=
{
modeler
:
props
.
bpmnModeler
,
modeler
:
props
.
bpmnModeler
,
modeling
:
props
.
bpmnModeler
.
get
(
'modeling'
),
modeling
:
props
.
bpmnModeler
.
get
(
'modeling'
),
moddle
:
props
.
bpmnModeler
.
get
(
'moddle'
),
moddle
:
props
.
bpmnModeler
.
get
(
'moddle'
),
...
@@ -137,9 +129,45 @@ const unwatchBpmn = watch(
...
@@ -137,9 +129,45 @@ const unwatchBpmn = watch(
selection
:
props
.
bpmnModeler
.
get
(
'selection'
)
selection
:
props
.
bpmnModeler
.
get
(
'selection'
)
}
}
console
.
log
(
bpmnInstances
(),
'window.bpmnInstances'
)
// 检查所有实例是否都存在
const
allInstancesExist
=
Object
.
values
(
instances
).
every
(
instance
=>
instance
)
if
(
allInstancesExist
)
{
const
w
=
window
as
any
w
.
bpmnInstances
=
instances
return
true
}
return
false
}
catch
(
error
)
{
console
.
error
(
'初始化 bpmnInstances 失败:'
,
error
)
return
false
}
}
const
bpmnInstances
=
()
=>
(
window
as
any
)?.
bpmnInstances
// 监听 props.bpmnModeler 然后 initModels
const
unwatchBpmn
=
watch
(
()
=>
props
.
bpmnModeler
,
async
()
=>
{
// 避免加载时 流程图 并未加载完成
if
(
!
props
.
bpmnModeler
)
{
console
.
log
(
'缺少props.bpmnModeler'
)
return
}
try
{
// 等待 modeler 初始化完成
await
nextTick
()
if
(
initBpmnInstances
())
{
isReady
.
value
=
true
await
nextTick
()
getActiveElement
()
getActiveElement
()
unwatchBpmn
()
}
else
{
console
.
error
(
'modeler 实例未完全初始化'
)
}
}
catch
(
error
)
{
console
.
error
(
'初始化失败:'
,
error
)
}
},
},
{
{
immediate
:
true
immediate
:
true
...
@@ -147,6 +175,8 @@ const unwatchBpmn = watch(
...
@@ -147,6 +175,8 @@ const unwatchBpmn = watch(
)
)
const
getActiveElement
=
()
=>
{
const
getActiveElement
=
()
=>
{
if
(
!
isReady
.
value
||
!
props
.
bpmnModeler
)
return
// 初始第一个选中元素 bpmn:Process
// 初始第一个选中元素 bpmn:Process
initFormOnChanged
(
null
)
initFormOnChanged
(
null
)
props
.
bpmnModeler
.
on
(
'import.done'
,
(
e
)
=>
{
props
.
bpmnModeler
.
on
(
'import.done'
,
(
e
)
=>
{
...
@@ -164,8 +194,11 @@ const getActiveElement = () => {
...
@@ -164,8 +194,11 @@ const getActiveElement = () => {
}
}
})
})
}
}
// 初始化数据
// 初始化数据
const
initFormOnChanged
=
(
element
)
=>
{
const
initFormOnChanged
=
(
element
)
=>
{
if
(
!
isReady
.
value
||
!
bpmnInstances
())
return
let
activatedElement
=
element
let
activatedElement
=
element
if
(
!
activatedElement
)
{
if
(
!
activatedElement
)
{
activatedElement
=
activatedElement
=
...
@@ -173,6 +206,8 @@ const initFormOnChanged = (element) => {
...
@@ -173,6 +206,8 @@ const initFormOnChanged = (element) => {
bpmnInstances
().
elementRegistry
.
find
((
el
)
=>
el
.
type
===
'bpmn:Collaboration'
)
bpmnInstances
().
elementRegistry
.
find
((
el
)
=>
el
.
type
===
'bpmn:Collaboration'
)
}
}
if
(
!
activatedElement
)
return
if
(
!
activatedElement
)
return
try
{
console
.
log
(
`
console
.
log
(
`
----------
----------
select element changed:
select element changed:
...
@@ -192,13 +227,15 @@ const initFormOnChanged = (element) => {
...
@@ -192,13 +227,15 @@ const initFormOnChanged = (element) => {
activatedElement
.
source
.
type
.
indexOf
(
'StartEvent'
)
===
-
1
activatedElement
.
source
.
type
.
indexOf
(
'StartEvent'
)
===
-
1
)
)
formVisible
.
value
=
elementType
.
value
===
'UserTask'
||
elementType
.
value
===
'StartEvent'
formVisible
.
value
=
elementType
.
value
===
'UserTask'
||
elementType
.
value
===
'StartEvent'
}
catch
(
error
)
{
console
.
error
(
'初始化表单数据失败:'
,
error
)
}
}
}
onBeforeUnmount
(()
=>
{
onBeforeUnmount
(()
=>
{
const
w
=
window
as
any
const
w
=
window
as
any
w
.
bpmnInstances
=
null
w
.
bpmnInstances
=
null
console
.
log
(
props
,
'props1'
)
isReady
.
value
=
false
console
.
log
(
props
.
bpmnModeler
,
'props.bpmnModeler1'
)
})
})
watch
(
watch
(
...
...
src/router/modules/remaining.ts
View file @
9685fbf8
...
@@ -330,6 +330,18 @@ const remainingRouter: AppRouteRecordRaw[] = [
...
@@ -330,6 +330,18 @@ const remainingRouter: AppRouteRecordRaw[] = [
title
:
'查看 OA 请假'
,
title
:
'查看 OA 请假'
,
activeMenu
:
'/bpm/oa/leave'
activeMenu
:
'/bpm/oa/leave'
}
}
},
{
path
:
'manager/model/create-update'
,
component
:
()
=>
import
(
'@/views/bpm/model/CreateUpdate.vue'
),
name
:
'BpmModelCreateUpdate'
,
meta
:
{
noCache
:
true
,
hidden
:
true
,
canTo
:
true
,
title
:
'创建/修改流程'
,
activeMenu
:
'/bpm/manager/model'
}
}
}
]
]
},
},
...
...
src/views/bpm/model/CategoryDraggableModel.vue
View file @
9685fbf8
...
@@ -249,7 +249,7 @@ import { formatDate } from '@/utils/formatTime'
...
@@ -249,7 +249,7 @@ import { formatDate } from '@/utils/formatTime'
import
*
as
ModelApi
from
'@/api/bpm/model'
import
*
as
ModelApi
from
'@/api/bpm/model'
import
*
as
FormApi
from
'@/api/bpm/form'
import
*
as
FormApi
from
'@/api/bpm/form'
import
{
setConfAndFields2
}
from
'@/utils/formCreate'
import
{
setConfAndFields2
}
from
'@/utils/formCreate'
import
{
BpmModelFormType
,
BpmModelType
}
from
'@/utils/constants'
import
{
BpmModelFormType
}
from
'@/utils/constants'
import
{
checkPermi
}
from
'@/utils/permission'
import
{
checkPermi
}
from
'@/utils/permission'
import
{
useUserStoreWithOut
}
from
'@/store/modules/user'
import
{
useUserStoreWithOut
}
from
'@/store/modules/user'
import
{
useAppStore
}
from
'@/store/modules/app'
import
{
useAppStore
}
from
'@/store/modules/app'
...
@@ -339,21 +339,22 @@ const handleChangeState = async (row: any) => {
...
@@ -339,21 +339,22 @@ const handleChangeState = async (row: any) => {
/** 设计流程 */
/** 设计流程 */
const
handleDesign
=
(
row
:
any
)
=>
{
const
handleDesign
=
(
row
:
any
)
=>
{
if
(
row
.
type
==
BpmModelType
.
BPMN
)
{
// if (row.type == BpmModelType.BPMN) {
push
({
// push({
name
:
'BpmModelEditor'
,
// name: 'BpmModelEditor',
query
:
{
// query: {
modelId
:
row
.
id
// modelId: row.id
}
// }
})
// })
}
else
{
// } else {
push
({
// push({
name
:
'SimpleModelDesign'
,
// name: 'SimpleModelDesign',
query
:
{
// query: {
modelId
:
row
.
id
// modelId: row.id
}
// }
})
// })
}
// }
push
(
`/bpm/manager/model/create-update?id=
${
row
.
id
}
`
)
}
}
/** 发布流程 */
/** 发布流程 */
...
@@ -496,7 +497,11 @@ const handleDeleteCategory = async () => {
...
@@ -496,7 +497,11 @@ const handleDeleteCategory = async () => {
/** 添加流程模型弹窗 */
/** 添加流程模型弹窗 */
const
modelFormRef
=
ref
()
const
modelFormRef
=
ref
()
const
openModelForm
=
(
type
:
string
,
id
?:
number
)
=>
{
const
openModelForm
=
(
type
:
string
,
id
?:
number
)
=>
{
modelFormRef
.
value
.
open
(
type
,
id
)
if
(
type
===
'create'
)
{
push
(
'/bpm/manager/model/create-update'
)
}
else
{
push
(
`/bpm/manager/model/create-update?id=
${
id
}
`
)
}
}
}
watch
(()
=>
props
.
categoryInfo
.
modelList
,
updateModeList
,
{
immediate
:
true
})
watch
(()
=>
props
.
categoryInfo
.
modelList
,
updateModeList
,
{
immediate
:
true
})
...
...
src/views/bpm/model/CreateUpdate.vue
0 → 100644
View file @
9685fbf8
This diff is collapsed.
Click to expand it.
src/views/bpm/model/ModelForm.vue
View file @
9685fbf8
...
@@ -123,29 +123,69 @@
...
@@ -123,29 +123,69 @@
</el-radio>
</el-radio>
</el-radio-group>
</el-radio-group>
</el-form-item>
</el-form-item>
<el-form-item
label=
"谁可以发起"
prop=
"startUser
Ids
"
>
<el-form-item
label=
"谁可以发起"
prop=
"startUser
Type
"
>
<el-select
<el-select
v-model=
"formData.startUser
Ids
"
v-model=
"formData.startUser
Type
"
multiple
placeholder=
"请选择谁可以发起"
placeholder=
"请选择可发起人,默认(不选择)则所有人都可以发起
"
@
change=
"handleStartUserTypeChange
"
>
>
<el-option
<el-option
label=
"全员"
:value=
"0"
/>
v-for=
"user in userList"
<el-option
label=
"指定人员"
:value=
"1"
/>
<el-option
label=
"均不可提交"
:value=
"2"
/>
</el-select>
<div
v-if=
"formData.startUserType === 1"
class=
"mt-2 flex flex-wrap gap-2"
>
<div
v-for=
"user in selectedStartUsers"
:key=
"user.id"
:key=
"user.id"
:label=
"user.nickname"
class=
"bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
:value=
"user.id"
>
<el-avatar
class=
"!m-5px"
:size=
"28"
v-if=
"user.avatar"
:src=
"user.avatar"
/>
<el-avatar
class=
"!m-5px"
:size=
"28"
v-else
>
{{
user
.
nickname
.
substring
(
0
,
1
)
}}
</el-avatar>
{{
user
.
nickname
}}
<Icon
icon=
"ep:close"
class=
"ml-2 cursor-pointer hover:text-red-500"
@
click=
"handleRemoveStartUser(user)"
/>
/>
</el-select>
</div>
<el-button
type=
"primary"
link
@
click=
"openStartUserSelect"
>
<Icon
icon=
"ep:plus"
/>
选择人员
</el-button>
</div>
</el-form-item>
</el-form-item>
<el-form-item
label=
"流程管理员"
prop=
"managerUserIds"
>
<el-form-item
label=
"流程管理员"
prop=
"managerUserType"
>
<el-select
v-model=
"formData.managerUserIds"
multiple
placeholder=
"请选择流程管理员"
>
<el-select
<el-option
v-model=
"formData.managerUserType"
v-for=
"user in userList"
placeholder=
"请选择流程管理员"
@
change=
"handleManagerUserTypeChange"
>
<el-option
label=
"全员"
:value=
"0"
/>
<el-option
label=
"指定人员"
:value=
"1"
/>
<el-option
label=
"均不可提交"
:value=
"2"
/>
</el-select>
<div
v-if=
"formData.managerUserType === 1"
class=
"mt-2 flex flex-wrap gap-2"
>
<div
v-for=
"user in selectedManagerUsers"
:key=
"user.id"
:key=
"user.id"
:label=
"user.nickname"
class=
"bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
:value=
"user.id"
>
<el-avatar
class=
"!m-5px"
:size=
"28"
v-if=
"user.avatar"
:src=
"user.avatar"
/>
<el-avatar
class=
"!m-5px"
:size=
"28"
v-else
>
{{
user
.
nickname
.
substring
(
0
,
1
)
}}
</el-avatar>
{{
user
.
nickname
}}
<Icon
icon=
"ep:close"
class=
"ml-2 cursor-pointer hover:text-red-500"
@
click=
"handleRemoveManagerUser(user)"
/>
/>
</el-select>
</div>
<el-button
type=
"primary"
link
@
click=
"openManagerUserSelect"
>
<Icon
icon=
"ep:plus"
/>
选择人员
</el-button>
</div>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
<template
#
footer
>
<template
#
footer
>
...
@@ -153,6 +193,7 @@
...
@@ -153,6 +193,7 @@
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</
template
>
</Dialog>
</Dialog>
<UserSelectForm
ref=
"userSelectFormRef"
@
confirm=
"handleUserSelectConfirm"
/>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
propTypes
}
from
'@/utils/propTypes'
import
{
propTypes
}
from
'@/utils/propTypes'
...
@@ -178,7 +219,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
...
@@ -178,7 +219,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
const
formData
:
any
=
ref
({
id
:
undefined
,
id
:
undefined
,
name
:
''
,
name
:
''
,
key
:
''
,
key
:
''
,
...
@@ -191,6 +232,8 @@ const formData = ref({
...
@@ -191,6 +232,8 @@ const formData = ref({
formCustomCreatePath
:
''
,
formCustomCreatePath
:
''
,
formCustomViewPath
:
''
,
formCustomViewPath
:
''
,
visible
:
true
,
visible
:
true
,
startUserType
:
undefined
,
managerUserType
:
undefined
,
startUserIds
:
[],
startUserIds
:
[],
managerUserIds
:
[]
managerUserIds
:
[]
})
})
...
@@ -211,6 +254,10 @@ const formRef = ref() // 表单 Ref
...
@@ -211,6 +254,10 @@ const formRef = ref() // 表单 Ref
const
formList
=
ref
([])
// 流程表单的下拉框的数据
const
formList
=
ref
([])
// 流程表单的下拉框的数据
const
categoryList
=
ref
([])
// 流程分类列表
const
categoryList
=
ref
([])
// 流程分类列表
const
userList
=
ref
<
UserVO
[]
>
([])
// 用户列表
const
userList
=
ref
<
UserVO
[]
>
([])
// 用户列表
const
selectedStartUsers
=
ref
<
UserVO
[]
>
([])
// 已选择的发起人列表
const
selectedManagerUsers
=
ref
<
UserVO
[]
>
([])
// 已选择的管理员列表
const
userSelectFormRef
=
ref
()
// 用户选择弹窗ref
const
currentSelectType
=
ref
<
'start'
|
'manager'
>
(
'start'
)
// 当前选择的是发起人还是管理员
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
string
)
=>
{
const
open
=
async
(
type
:
string
,
id
?:
string
)
=>
{
...
@@ -226,6 +273,19 @@ const open = async (type: string, id?: string) => {
...
@@ -226,6 +273,19 @@ const open = async (type: string, id?: string) => {
}
finally
{
}
finally
{
formLoading
.
value
=
false
formLoading
.
value
=
false
}
}
// 加载数据时,根据已有的用户ID列表初始化已选用户
if
(
formData
.
value
.
startUserIds
?.
length
)
{
formData
.
value
.
startUserType
=
1
selectedStartUsers
.
value
=
userList
.
value
.
filter
((
user
)
=>
formData
.
value
.
startUserIds
.
includes
(
user
.
id
)
)
}
if
(
formData
.
value
.
managerUserIds
?.
length
)
{
formData
.
value
.
managerUserType
=
1
selectedManagerUsers
.
value
=
userList
.
value
.
filter
((
user
)
=>
formData
.
value
.
managerUserIds
.
includes
(
user
.
id
)
)
}
}
else
{
}
else
{
formData
.
value
.
managerUserIds
.
push
(
userStore
.
getUser
.
id
)
formData
.
value
.
managerUserIds
.
push
(
userStore
.
getUser
.
id
)
}
}
...
@@ -293,9 +353,85 @@ const resetForm = () => {
...
@@ -293,9 +353,85 @@ const resetForm = () => {
formCustomCreatePath
:
''
,
formCustomCreatePath
:
''
,
formCustomViewPath
:
''
,
formCustomViewPath
:
''
,
visible
:
true
,
visible
:
true
,
startUserType
:
undefined
,
managerUserType
:
undefined
,
startUserIds
:
[],
startUserIds
:
[],
managerUserIds
:
[]
managerUserIds
:
[]
}
}
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
selectedStartUsers
.
value
=
[]
selectedManagerUsers
.
value
=
[]
}
// 处理发起人类型变化
const
handleStartUserTypeChange
=
(
value
:
number
)
=>
{
if
(
value
!==
1
)
{
selectedStartUsers
.
value
=
[]
formData
.
value
.
startUserIds
=
[]
}
}
// 处理管理员类型变化
const
handleManagerUserTypeChange
=
(
value
:
number
)
=>
{
if
(
value
!==
1
)
{
selectedManagerUsers
.
value
=
[]
formData
.
value
.
managerUserIds
=
[]
}
}
// 打开发起人选择
const
openStartUserSelect
=
()
=>
{
currentSelectType
.
value
=
'start'
userSelectFormRef
.
value
.
open
(
0
,
selectedStartUsers
.
value
)
}
// 打开管理员选择
const
openManagerUserSelect
=
()
=>
{
currentSelectType
.
value
=
'manager'
userSelectFormRef
.
value
.
open
(
0
,
selectedManagerUsers
.
value
)
}
// 处理用户选择确认
const
handleUserSelectConfirm
=
(
_
,
users
:
UserVO
[])
=>
{
if
(
currentSelectType
.
value
===
'start'
)
{
selectedStartUsers
.
value
=
users
formData
.
value
.
startUserIds
=
users
.
map
((
u
)
=>
u
.
id
)
}
else
{
selectedManagerUsers
.
value
=
users
formData
.
value
.
managerUserIds
=
users
.
map
((
u
)
=>
u
.
id
)
}
}
// 移除发起人
const
handleRemoveStartUser
=
(
user
:
UserVO
)
=>
{
selectedStartUsers
.
value
=
selectedStartUsers
.
value
.
filter
((
u
)
=>
u
.
id
!==
user
.
id
)
formData
.
value
.
startUserIds
=
formData
.
value
.
startUserIds
.
filter
((
id
)
=>
id
!==
user
.
id
)
}
// 移除管理员
const
handleRemoveManagerUser
=
(
user
:
UserVO
)
=>
{
selectedManagerUsers
.
value
=
selectedManagerUsers
.
value
.
filter
((
u
)
=>
u
.
id
!==
user
.
id
)
formData
.
value
.
managerUserIds
=
formData
.
value
.
managerUserIds
.
filter
((
id
)
=>
id
!==
user
.
id
)
}
}
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
.bg-gray-100
{
background-color
:
#f5f7fa
;
transition
:
all
0.3s
;
&:hover
{
background-color
:
#e6e8eb
;
}
.ep-close
{
font-size
:
14px
;
color
:
#909399
;
transition
:
color
0.3s
;
&:hover
{
color
:
#f56c6c
;
}
}
}
</
style
>
src/views/bpm/model/editor/index.vue
View file @
9685fbf8
...
@@ -3,7 +3,6 @@
...
@@ -3,7 +3,6 @@
<!-- 流程设计器,负责绘制流程等 -->
<!-- 流程设计器,负责绘制流程等 -->
<MyProcessDesigner
<MyProcessDesigner
key=
"designer"
key=
"designer"
v-if=
"xmlString !== undefined"
v-model=
"xmlString"
v-model=
"xmlString"
:value=
"xmlString"
:value=
"xmlString"
v-bind=
"controlForm"
v-bind=
"controlForm"
...
@@ -11,12 +10,14 @@
...
@@ -11,12 +10,14 @@
ref=
"processDesigner"
ref=
"processDesigner"
@
init-finished=
"initModeler"
@
init-finished=
"initModeler"
:additionalModel=
"controlForm.additionalModel"
:additionalModel=
"controlForm.additionalModel"
:model=
"model"
@
save=
"save"
@
save=
"save"
/>
/>
<!-- 流程属性器,负责编辑每个流程节点的属性 -->
<!-- 流程属性器,负责编辑每个流程节点的属性 -->
<MyProcessPenal
<MyProcessPenal
v-if=
"isModelerReady && modeler"
key=
"penal"
key=
"penal"
:bpmnModeler=
"modeler
as any
"
:bpmnModeler=
"modeler"
:prefix=
"controlForm.prefix"
:prefix=
"controlForm.prefix"
class=
"process-panel"
class=
"process-panel"
:model=
"model"
:model=
"model"
...
@@ -34,12 +35,19 @@ import * as ModelApi from '@/api/bpm/model'
...
@@ -34,12 +35,19 @@ import * as ModelApi from '@/api/bpm/model'
defineOptions
({
name
:
'BpmModelEditor'
})
defineOptions
({
name
:
'BpmModelEditor'
})
const
router
=
useRouter
()
// 路由
const
props
=
defineProps
<
{
const
{
query
}
=
useRoute
()
// 路由的查询
modelId
?:
string
modelKey
?:
string
modelName
?:
string
}
>
()
const
emit
=
defineEmits
([
'success'
])
const
message
=
useMessage
()
// 国际化
const
message
=
useMessage
()
// 国际化
const
xmlString
=
ref
(
undefined
)
// BPMN XML
const
xmlString
=
ref
<
string
>
(
''
)
// BPMN XML
const
modeler
=
ref
(
null
)
// BPMN Modeler
const
modeler
=
shallowRef
()
// BPMN Modeler
const
processDesigner
=
ref
()
const
isModelerReady
=
ref
(
false
)
const
controlForm
=
ref
({
const
controlForm
=
ref
({
simulation
:
true
,
simulation
:
true
,
labelEditing
:
false
,
labelEditing
:
false
,
...
@@ -50,60 +58,142 @@ const controlForm = ref({
...
@@ -50,60 +58,142 @@ const controlForm = ref({
})
})
const
model
=
ref
<
ModelApi
.
ModelVO
>
()
// 流程模型的信息
const
model
=
ref
<
ModelApi
.
ModelVO
>
()
// 流程模型的信息
// 初始化 bpmnInstances
const
initBpmnInstances
=
()
=>
{
if
(
!
modeler
.
value
)
return
false
try
{
const
instances
=
{
modeler
:
modeler
.
value
,
modeling
:
modeler
.
value
.
get
(
'modeling'
),
moddle
:
modeler
.
value
.
get
(
'moddle'
),
eventBus
:
modeler
.
value
.
get
(
'eventBus'
),
bpmnFactory
:
modeler
.
value
.
get
(
'bpmnFactory'
),
elementFactory
:
modeler
.
value
.
get
(
'elementFactory'
),
elementRegistry
:
modeler
.
value
.
get
(
'elementRegistry'
),
replace
:
modeler
.
value
.
get
(
'replace'
),
selection
:
modeler
.
value
.
get
(
'selection'
)
}
// 检查所有实例是否都存在
return
Object
.
values
(
instances
).
every
(
instance
=>
instance
)
}
catch
(
error
)
{
console
.
error
(
'初始化 bpmnInstances 失败:'
,
error
)
return
false
}
}
/** 初始化 modeler */
/** 初始化 modeler */
const
initModeler
=
(
item
)
=>
{
const
initModeler
=
async
(
item
)
=>
{
setTimeout
(()
=>
{
try
{
modeler
.
value
=
item
modeler
.
value
=
item
},
10
)
// 等待 modeler 初始化完成
await
nextTick
()
// 确保 modeler 的所有实例都已经准备好
if
(
initBpmnInstances
())
{
isModelerReady
.
value
=
true
if
(
!
props
.
modelId
&&
props
.
modelKey
&&
props
.
modelName
)
{
await
updateModelData
(
props
.
modelKey
,
props
.
modelName
)
}
}
else
{
console
.
error
(
'modeler 实例未完全初始化'
)
}
}
catch
(
error
)
{
console
.
error
(
'初始化 modeler 失败:'
,
error
)
}
}
/** 获取默认的BPMN XML */
const
getDefaultBpmnXml
=
(
key
:
string
,
name
:
string
)
=>
{
return
`<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.activiti.org/processdef">
<process id="
${
key
}
" name="
${
name
}
" isExecutable="true" />
<bpmndi:BPMNDiagram id="BPMNDiagram">
<bpmndi:BPMNPlane id="
${
key
}
_di" bpmnElement="
${
key
}
" />
</bpmndi:BPMNDiagram>
</definitions>`
}
}
/** 添加/修改模型 */
/** 添加/修改模型 */
const
save
=
async
(
bpmnXml
:
string
)
=>
{
const
save
=
async
(
bpmnXml
:
string
)
=>
{
try
{
if
(
props
.
modelId
)
{
// 编辑模式
const
data
=
{
const
data
=
{
...
model
.
value
,
...
model
.
value
,
bpmnXml
:
bpmnXml
// bpmnXml 只是初始化流程图,后续修改无法通过它获得
bpmnXml
:
bpmnXml
}
as
unknown
as
ModelApi
.
ModelVO
}
as
unknown
as
ModelApi
.
ModelVO
// 提交
if
(
data
.
id
)
{
await
ModelApi
.
updateModelBpmn
(
data
)
await
ModelApi
.
updateModelBpmn
(
data
)
message
.
success
(
'修改成功
'
)
emit
(
'success
'
)
}
else
{
}
else
{
await
ModelApi
.
updateModelBpmn
(
data
)
// 新建模式,直接返回XML
message
.
success
(
'新增成功'
)
emit
(
'success'
,
bpmnXml
)
}
}
catch
(
error
)
{
console
.
error
(
'保存失败:'
,
error
)
message
.
error
(
'保存失败'
)
}
}
// 跳转回去
close
()
}
/** 关闭按钮 */
const
close
=
()
=>
{
router
.
push
({
path
:
'/bpm/manager/model'
})
}
}
/** 初始化 */
/** 初始化 */
onMounted
(
async
()
=>
{
onMounted
(
async
()
=>
{
const
modelId
=
query
.
modelId
as
unknown
as
number
try
{
if
(
!
modelId
)
{
if
(
props
.
modelId
)
{
message
.
error
(
'缺少模型 modelId 编号'
)
// 编辑模式
return
}
// 查询模型
// 查询模型
const
data
=
await
ModelApi
.
getModel
(
modelId
)
const
data
=
await
ModelApi
.
getModel
(
props
.
modelId
)
if
(
!
data
.
bpmnXml
)
{
// 首次创建的 Model 模型,它是没有 bpmnXml,此时需要给它一个默认的
data
.
bpmnXml
=
` <?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.activiti.org/processdef">
<process id="
${
data
.
key
}
" name="
${
data
.
name
}
" isExecutable="true" />
<bpmndi:BPMNDiagram id="BPMNDiagram">
<bpmndi:BPMNPlane id="
${
data
.
key
}
_di" bpmnElement="
${
data
.
key
}
" />
</bpmndi:BPMNDiagram>
</definitions>`
}
model
.
value
=
{
model
.
value
=
{
...
data
,
...
data
,
bpmnXml
:
undefined
// 清空 bpmnXml 属性
bpmnXml
:
undefined
// 清空 bpmnXml 属性
}
}
xmlString
.
value
=
data
.
bpmnXml
xmlString
.
value
=
data
.
bpmnXml
||
getDefaultBpmnXml
(
data
.
key
,
data
.
name
)
}
else
if
(
props
.
modelKey
&&
props
.
modelName
)
{
// 新建模式
xmlString
.
value
=
getDefaultBpmnXml
(
props
.
modelKey
,
props
.
modelName
)
model
.
value
=
{
key
:
props
.
modelKey
,
name
:
props
.
modelName
}
as
ModelApi
.
ModelVO
}
}
catch
(
error
)
{
console
.
error
(
'初始化失败:'
,
error
)
message
.
error
(
'初始化失败'
)
}
})
// 更新模型数据
const
updateModelData
=
async
(
key
?:
string
,
name
?:
string
)
=>
{
if
(
key
&&
name
)
{
xmlString
.
value
=
getDefaultBpmnXml
(
key
,
name
)
model
.
value
=
{
...
model
.
value
,
key
:
key
,
name
:
name
}
as
ModelApi
.
ModelVO
// 确保更新后重新渲染
await
nextTick
()
if
(
processDesigner
.
value
?.
refresh
)
{
processDesigner
.
value
.
refresh
()
}
}
}
// 监听key和name的变化
watch
([()
=>
props
.
modelKey
,
()
=>
props
.
modelName
],
async
([
newKey
,
newName
])
=>
{
if
(
!
props
.
modelId
&&
newKey
&&
newName
&&
modeler
.
value
)
{
await
updateModelData
(
newKey
,
newName
)
}
},
{
immediate
:
true
,
deep
:
true
})
// 在组件卸载时清理
onBeforeUnmount
(()
=>
{
isModelerReady
.
value
=
false
modeler
.
value
=
null
// 清理全局实例
const
w
=
window
as
any
if
(
w
.
bpmnInstances
)
{
w
.
bpmnInstances
=
null
}
})
})
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
...
...
src/views/bpm/model/index.vue
View file @
9685fbf8
...
@@ -106,6 +106,7 @@ import CategoryDraggableModel from './CategoryDraggableModel.vue'
...
@@ -106,6 +106,7 @@ import CategoryDraggableModel from './CategoryDraggableModel.vue'
defineOptions
({
name
:
'BpmModel'
})
defineOptions
({
name
:
'BpmModel'
})
const
{
push
}
=
useRouter
()
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
loading
=
ref
(
true
)
// 列表的加载中
const
loading
=
ref
(
true
)
// 列表的加载中
const
isCategorySorting
=
ref
(
false
)
// 是否 category 正处于排序状态
const
isCategorySorting
=
ref
(
false
)
// 是否 category 正处于排序状态
...
@@ -124,7 +125,11 @@ const handleQuery = () => {
...
@@ -124,7 +125,11 @@ const handleQuery = () => {
/** 添加/修改操作 */
/** 添加/修改操作 */
const
formRef
=
ref
()
const
formRef
=
ref
()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
formRef
.
value
.
open
(
type
,
id
)
if
(
type
===
'create'
)
{
push
(
'/bpm/manager/model/create-update'
)
}
else
{
push
(
`/bpm/manager/model/create-update?id=
${
id
}
`
)
}
}
}
/** 流程表单的详情按钮操作 */
/** 流程表单的详情按钮操作 */
...
...
src/views/bpm/simple/SimpleModelDesign.vue
View file @
9685fbf8
<
template
>
<
template
>
<ContentWrap
:bodyStyle=
"
{ padding: '20px 16px' }">
<ContentWrap
:bodyStyle=
"
{ padding: '20px 16px' }">
<SimpleProcessDesigner
:model-id=
"modelId"
@
success=
"close"
/>
<SimpleProcessDesigner
:model-id=
"modelId"
:model-key=
"modelKey"
:model-name=
"modelName"
@
success=
"handleSuccess"
ref=
"designerRef"
/>
</ContentWrap>
</ContentWrap>
</
template
>
</
template
>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
...
@@ -9,11 +15,26 @@ import { SimpleProcessDesigner } from '@/components/SimpleProcessDesignerV2/src/
...
@@ -9,11 +15,26 @@ import { SimpleProcessDesigner } from '@/components/SimpleProcessDesignerV2/src/
defineOptions
({
defineOptions
({
name
:
'SimpleModelDesign'
name
:
'SimpleModelDesign'
})
})
const
router
=
useRouter
()
// 路由
const
{
query
}
=
useRoute
()
// 路由的查询
const
props
=
defineProps
<
{
const
modelId
=
query
.
modelId
as
string
modelId
?:
string
const
close
=
()
=>
{
modelKey
?:
string
router
.
push
({
path
:
'/bpm/manager/model'
})
modelName
?:
string
}
>
()
const
emit
=
defineEmits
([
'success'
])
const
designerRef
=
ref
()
// 监听属性变化
watch
([()
=>
props
.
modelKey
,
()
=>
props
.
modelName
],
([
newKey
,
newName
])
=>
{
if
(
designerRef
.
value
&&
newKey
&&
newName
)
{
designerRef
.
value
.
updateModel
(
newKey
,
newName
)
}
},
{
immediate
:
true
,
deep
:
true
})
// 修改成功回调
const
handleSuccess
=
(
data
?:
any
)
=>
{
emit
(
'success'
,
data
)
}
}
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
></
style
>
<
style
lang=
"scss"
scoped
></
style
>
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