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
929b67b9
authored
Nov 25, 2024
by
芋道源码
Committed by
Gitee
Nov 25, 2024
Browse files
Options
Browse Files
Download
Plain Diff
!600 bpm设计器适配Simple设计器
Merge pull request !600 from Lesan/feature/bpm
parents
4ffaa2dc
513ea33f
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
197 additions
and
14 deletions
+197
-14
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
+25
-0
src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue
+172
-3
src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
+0
-11
No files found.
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
View file @
929b67b9
...
...
@@ -1281,7 +1281,32 @@
"isBody"
:
true
}
]
},
{
"name"
:
"ButtonsSetting"
,
"superClass"
:
[
"Element"
],
"meta"
:
{
"allowedIn"
:
[
"bpmn:UserTask"
]
},
"properties"
:
[
{
"name"
:
"flowable:id"
,
"type"
:
"Integer"
,
"isAttr"
:
true
},
{
"name"
:
"flowable:enable"
,
"type"
:
"Boolean"
,
"isAttr"
:
true
},
{
"name"
:
"flowable:displayName"
,
"type"
:
"String"
,
"isAttr"
:
true
}
]
}
],
"emumerations"
:
[]
}
src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue
View file @
929b67b9
...
...
@@ -2,6 +2,7 @@
1. 审批人与提交人为同一人时
2. 审批人拒绝时
3. 审批人为空时
4. 操作按钮
-->
<
template
>
<div
class=
"panel-tab__content"
>
...
...
@@ -74,6 +75,35 @@
</div>
</div>
</el-radio-group>
<el-divider
content-position=
"left"
>
操作按钮
</el-divider>
<div
class=
"button-setting-pane"
>
<div
class=
"button-setting-title"
>
<div
class=
"button-title-label"
>
操作按钮
</div>
<div
class=
"pl-4 button-title-label"
>
显示名称
</div>
<div
class=
"button-title-label"
>
启用
</div>
</div>
<div
class=
"button-setting-item"
v-for=
"(item, index) in buttonsSettingEl"
:key=
"index"
>
<div
class=
"button-setting-item-label"
>
{{
OPERATION_BUTTON_NAME
.
get
(
item
.
id
)
}}
</div>
<div
class=
"button-setting-item-label"
>
<input
type=
"text"
class=
"editable-title-input"
@
blur=
"btnDisplayNameBlurEvent(index)"
v-mountedFocus
v-model=
"item.displayName"
:placeholder=
"item.displayName"
v-if=
"btnDisplayNameEdit[index]"
/>
<el-button
v-else
text
@
click=
"changeBtnDisplayName(index)"
>
{{
item
.
displayName
}}
<Icon
icon=
"ep:edit"
/></el-button>
</div>
<div
class=
"button-setting-item-label"
>
<el-switch
v-model=
"item.enable"
/>
</div>
</div>
</div>
</div>
</
template
>
...
...
@@ -83,7 +113,9 @@ import {
RejectHandlerType
,
REJECT_HANDLER_TYPES
,
ASSIGN_EMPTY_HANDLER_TYPES
,
AssignEmptyHandlerType
AssignEmptyHandlerType
,
OPERATION_BUTTON_NAME
,
DEFAULT_BUTTON_SETTING
}
from
'@/components/SimpleProcessDesignerV2/src/consts'
import
*
as
UserApi
from
'@/api/system/user'
...
...
@@ -111,6 +143,11 @@ const assignEmptyHandlerType = ref()
const
assignEmptyUserIdsEl
=
ref
()
const
assignEmptyUserIds
=
ref
()
// 操作按钮
const
buttonsSettingEl
=
ref
()
const
{
buttonsSetting
,
btnDisplayNameEdit
,
changeBtnDisplayName
,
btnDisplayNameBlurEvent
}
=
useButtonsSetting
()
const
elExtensionElements
=
ref
()
const
otherExtensions
=
ref
()
const
bpmnElement
=
ref
()
...
...
@@ -165,6 +202,22 @@ const resetCustomConfigList = () => {
return
num
>
Number
.
MAX_SAFE_INTEGER
||
num
<
-
Number
.
MAX_SAFE_INTEGER
?
item
:
num
})
// 操作按钮
buttonsSettingEl
.
value
=
elExtensionElements
.
value
.
values
?.
filter
(
(
ex
)
=>
ex
.
$type
===
`
${
prefix
}
:ButtonsSetting`
)
if
(
buttonsSettingEl
.
value
.
length
===
0
)
{
DEFAULT_BUTTON_SETTING
.
forEach
((
item
)
=>
{
buttonsSettingEl
.
value
.
push
(
bpmnInstances
().
moddle
.
create
(
`
${
prefix
}
:ButtonsSetting`
,
{
'flowable:id'
:
item
.
id
,
'flowable:displayName'
:
item
.
displayName
,
'flowable:enable'
:
item
.
enable
})
)
})
}
// 保留剩余扩展元素,便于后面更新该元素对应属性
otherExtensions
.
value
=
elExtensionElements
.
value
.
values
?.
filter
(
...
...
@@ -173,7 +226,8 @@ const resetCustomConfigList = () => {
ex
.
$type
!==
`
${
prefix
}
:RejectHandlerType`
&&
ex
.
$type
!==
`
${
prefix
}
:RejectReturnTaskId`
&&
ex
.
$type
!==
`
${
prefix
}
:AssignEmptyHandlerType`
&&
ex
.
$type
!==
`
${
prefix
}
:AssignEmptyUserIds`
ex
.
$type
!==
`
${
prefix
}
:AssignEmptyUserIds`
&&
ex
.
$type
!==
`
${
prefix
}
:ButtonsSetting`
)
??
[]
// 更新元素扩展属性,避免后续报错
...
...
@@ -221,7 +275,8 @@ const updateElementExtensions = () => {
rejectHandlerTypeEl
.
value
,
returnNodeIdEl
.
value
,
assignEmptyHandlerTypeEl
.
value
,
assignEmptyUserIdsEl
.
value
assignEmptyUserIdsEl
.
value
,
...
buttonsSettingEl
.
value
]
})
bpmnInstances
().
modeling
.
updateProperties
(
toRaw
(
bpmnElement
.
value
),
{
...
...
@@ -245,6 +300,7 @@ function findAllPredecessorsExcludingStart(elementId, modeler) {
const
elementRegistry
=
modeler
.
get
(
'elementRegistry'
)
const
allConnections
=
elementRegistry
.
filter
((
element
)
=>
element
.
type
===
'bpmn:SequenceFlow'
)
const
predecessors
=
new
Set
()
// 使用 Set 来避免重复节点
const
visited
=
new
Set
()
// 用于记录已访问的节点
// 检查是否是开始事件节点
function
isStartEvent
(
element
)
{
...
...
@@ -252,6 +308,14 @@ function findAllPredecessorsExcludingStart(elementId, modeler) {
}
function
findPredecessorsRecursively
(
element
)
{
// 如果该节点已经访问过,直接返回,避免循环
if
(
visited
.
has
(
element
))
{
return
}
// 标记当前节点为已访问
visited
.
add
(
element
)
// 获取与当前节点相连的所有连接
const
incomingConnections
=
allConnections
.
filter
((
connection
)
=>
connection
.
target
===
element
)
...
...
@@ -275,9 +339,114 @@ function findAllPredecessorsExcludingStart(elementId, modeler) {
return
Array
.
from
(
predecessors
)
// 返回前置节点数组
}
function
useButtonsSetting
()
{
const
buttonsSetting
=
ref
<
ButtonSetting
[]
>
()
// 操作按钮显示名称可编辑
const
btnDisplayNameEdit
=
ref
<
boolean
[]
>
([])
const
changeBtnDisplayName
=
(
index
:
number
)
=>
{
btnDisplayNameEdit
.
value
[
index
]
=
true
}
const
btnDisplayNameBlurEvent
=
(
index
:
number
)
=>
{
btnDisplayNameEdit
.
value
[
index
]
=
false
const
buttonItem
=
buttonsSetting
.
value
!
[
index
]
buttonItem
.
displayName
=
buttonItem
.
displayName
||
OPERATION_BUTTON_NAME
.
get
(
buttonItem
.
id
)
!
}
return
{
buttonsSetting
,
btnDisplayNameEdit
,
changeBtnDisplayName
,
btnDisplayNameBlurEvent
}
}
const
userOptions
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
onMounted
(
async
()
=>
{
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
})
</
script
>
<
style
lang=
"scss"
scoped
>
.button-setting-pane
{
display
:
flex
;
flex-direction
:
column
;
font-size
:
14px
;
margin-top
:
8px
;
.button-setting-desc
{
padding-right
:
8px
;
margin-bottom
:
16px
;
font-size
:
16px
;
font-weight
:
700
;
}
.button-setting-title
{
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
height
:
45px
;
padding-left
:
12px
;
background-color
:
#f8fafc0
a
;
border
:
1px
solid
#1f38581
a
;
&
>
:first-child
{
width
:
100px
!important
;
text-align
:
left
!important
;
}
&
>
:last-child
{
text-align
:
center
!important
;
}
.button-title-label
{
width
:
150px
;
font-size
:
13px
;
font-weight
:
700
;
color
:
#000
;
text-align
:
left
;
}
}
.button-setting-item
{
align-items
:
center
;
display
:
flex
;
justify-content
:
space-between
;
height
:
38px
;
padding-left
:
12px
;
border
:
1px
solid
#1f38581
a
;
border-top
:
0
;
&
>
:first-child
{
width
:
100px
!important
;
}
&
>
:last-child
{
text-align
:
center
!important
;
}
.button-setting-item-label
{
width
:
150px
;
overflow
:
hidden
;
text-align
:
left
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
.editable-title-input
{
height
:
24px
;
max-width
:
130px
;
margin-left
:
4px
;
line-height
:
24px
;
border
:
1px
solid
#d9d9d9
;
border-radius
:
4px
;
transition
:
all
0.3s
;
&:focus
{
border-color
:
#40a9ff
;
outline
:
0
;
box-shadow
:
0
0
0
2px
rgb
(
24
144
255
/
20%
);
}
}
}
}
</
style
>
src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue
View file @
929b67b9
...
...
@@ -77,17 +77,6 @@
:rules=
"genericRule"
label-width=
"100px"
>
<el-card
v-if=
"runningTask?.formId > 0"
class=
"mb-15px !-mt-10px"
>
<
template
#
header
>
<span
class=
"el-icon-picture-outline"
>
填写表单【
{{
runningTask
?.
formName
}}
】
</span>
</
template
>
<form-create
v-model=
"approveForm.value"
v-model:api=
"approveFormFApi"
:option=
"approveForm.option"
:rule=
"approveForm.rule"
/>
</el-card>
<el-form-item
label=
"审批意见"
prop=
"reason"
>
<el-input
v-model=
"genericForm.reason"
...
...
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