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
4c4d13cd
authored
Mar 24, 2024
by
jason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
改造审批设置. 整合系统中的任务的候选人策略
parent
ee12e691
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
539 additions
and
74 deletions
+539
-74
src/components/SimpleProcessDesigner/src/addNode.vue
+26
-13
src/components/SimpleProcessDesigner/src/consts.ts
+48
-0
src/components/SimpleProcessDesigner/src/drawer/approverDrawer.vue
+311
-0
src/components/SimpleProcessDesigner/src/nodeWrap.vue
+101
-56
src/components/SimpleProcessDesigner/src/util.ts
+29
-0
src/store/modules/simpleWorkflow.ts
+5
-1
src/views/bpm/simpleWorkflow/index.vue
+19
-4
No files found.
src/components/SimpleProcessDesigner/src/addNode.vue
View file @
4c4d13cd
...
...
@@ -32,7 +32,7 @@
</div>
</div>
</template>
<
script
setup
>
<
script
lang=
"ts"
setup
>
import
{
ref
}
from
'vue'
let
props
=
defineProps
({
childNodeP
:
{
...
...
@@ -47,23 +47,36 @@ const addType = (type) => {
if
(
type
!=
4
)
{
var
data
if
(
type
==
1
)
{
// data = {
// name: '审核人',
// error: true,
// type: 1,
// settype: 1,
// selectMode: 0,
// selectRange: 0,
// directorLevel: 1,
// examineMode: 1,
// noHanderAction: 1,
// examineEndDirectorLevel: 0,
// childNode: props.childNodeP,
// nodeUserList: []
// }
data
=
{
n
odeN
ame
:
'审核人'
,
name
:
'审核人'
,
error
:
true
,
type
:
1
,
settype
:
1
,
selectMode
:
0
,
selectRange
:
0
,
directorLevel
:
1
,
examineMode
:
1
,
noHanderAction
:
1
,
examineEndDirectorLevel
:
0
,
// 审批节点配置
attributes
:
{
approveMethod
:
undefined
,
candidateStrategy
:
undefined
,
candidateParam
:
[]
},
childNode
:
props
.
childNodeP
,
nodeUserList
:
[]
}
}
else
if
(
type
==
2
)
{
data
=
{
n
odeN
ame
:
'抄送人'
,
name
:
'抄送人'
,
type
:
2
,
ccSelfSelectFlag
:
1
,
childNode
:
props
.
childNodeP
,
...
...
@@ -73,12 +86,12 @@ const addType = (type) => {
emits
(
'update:childNodeP'
,
data
)
}
else
{
emits
(
'update:childNodeP'
,
{
n
odeN
ame
:
'路由'
,
name
:
'路由'
,
type
:
4
,
childNode
:
null
,
conditionNodes
:
[
{
n
odeN
ame
:
'条件1'
,
name
:
'条件1'
,
error
:
true
,
type
:
3
,
priorityLevel
:
1
,
...
...
@@ -87,7 +100,7 @@ const addType = (type) => {
childNode
:
props
.
childNodeP
},
{
n
odeN
ame
:
'条件2'
,
name
:
'条件2'
,
type
:
3
,
priorityLevel
:
2
,
conditionList
:
[],
...
...
src/components/SimpleProcessDesigner/src/consts.ts
0 → 100644
View file @
4c4d13cd
export
enum
NodeType
{
//// 0 发起人 1审批 2抄送 3条件 4路由
/**
* 发起人节点
*/
START_USER_NODE
=
0
,
/**
* 审批人节点
*/
APPROVE_USER_NODE
=
1
,
/**
* 抄送人节点
*/
CC_USER_NODE
=
2
,
/**
* 条件节点
*/
CONDITION_NODE
=
3
,
/**
* 路由节点
*/
ROUTER_NODE
=
4
}
export
const
NODE_BG_COLOR
=
new
Map
()
NODE_BG_COLOR
.
set
(
NodeType
.
START_USER_NODE
,
'#87, 106, 149'
)
NODE_BG_COLOR
.
set
(
NodeType
.
APPROVE_USER_NODE
,
'#255, 148, 62'
)
NODE_BG_COLOR
.
set
(
NodeType
.
CC_USER_NODE
,
'#50, 150, 250'
)
/**
* 节点的标题
*/
export
const
NODE_TITLE
=
new
Map
()
NODE_TITLE
.
set
(
NodeType
.
START_USER_NODE
,
'发起人'
)
NODE_TITLE
.
set
(
NodeType
.
APPROVE_USER_NODE
,
'审批人'
)
NODE_TITLE
.
set
(
NodeType
.
CC_USER_NODE
,
'抄送人'
)
export
type
WorkFlowNode
=
{
id
:
string
,
parentId
:
string
,
type
:
NodeType
,
name
:
string
,
attributes
:
Map
<
string
,
any
>
,
// 操作人
childNode
:
WorkFlowNode
,
conditionNodes
:
WorkFlowNode
[]
}
\ No newline at end of file
src/components/SimpleProcessDesigner/src/drawer/approverDrawer.vue
0 → 100644
View file @
4c4d13cd
<
template
>
<el-drawer
:append-to-body=
"true"
v-model=
"visible"
class=
"set_promoter"
:show-close=
"false"
:size=
"550"
:before-close=
"saveConfig"
>
<template
#
header
>
<div
class=
"user-task-header"
>
审批设置
</div>
</
template
>
<div>
<el-form
label-position=
"top"
label-width=
"100px"
>
<el-form-item
label=
"审批方式"
prop=
"approveMethod"
>
<el-select
v-model=
"candidateConfig.approveMethod"
style=
"width: 100%"
clearable
>
<el-option
v-for=
"dict in approveMethods"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"审批人规则类型"
prop=
"candidateStrategy"
>
<el-select
v-model=
"candidateConfig.candidateStrategy"
style=
"width: 100%"
clearable
@
change=
"changecandidateStrategy"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.BPM_TASK_CANDIDATE_STRATEGY)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"candidateConfig.candidateStrategy == 10"
label=
"指定角色"
prop=
"candidateParam"
>
<el-select
v-model=
"candidateConfig.candidateParam"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in roleOptions"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"candidateConfig.candidateStrategy == 20 || candidateConfig.candidateStrategy == 21"
label=
"指定部门"
prop=
"candidateParam"
span=
"24"
>
<el-tree-select
ref=
"treeRef"
v-model=
"candidateConfig.candidateParam"
:data=
"deptTreeOptions"
:props=
"defaultProps"
empty-text=
"加载中,请稍后"
multiple
node-key=
"id"
style=
"width: 100%"
show-checkbox
/>
</el-form-item>
<el-form-item
v-if=
"candidateConfig.candidateStrategy == 22"
label=
"指定岗位"
prop=
"candidateParam"
span=
"24"
>
<el-select
v-model=
"candidateConfig.candidateParam"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in postOptions"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"
candidateConfig.candidateStrategy == 30 ||
candidateConfig.candidateStrategy == 31 ||
candidateConfig.candidateStrategy == 32
"
label=
"指定用户"
prop=
"candidateParam"
span=
"24"
>
<el-select
v-model=
"candidateConfig.candidateParam"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in userOptions"
:key=
"item.id"
:label=
"item.nickname"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"candidateConfig.candidateStrategy === 40"
label=
"指定用户组"
prop=
"candidateParam"
>
<el-select
v-model=
"candidateConfig.candidateParam"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in userGroupOptions"
:key=
"item.id"
:label=
"item.name"
:value=
"item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"candidateConfig.candidateStrategy === 60"
label=
"流程表达式"
prop=
"candidateParam"
>
<el-input
type=
"textarea"
v-model=
"candidateConfig.candidateParam[0]"
clearable
style=
"width: 100%"
/>
</el-form-item>
</el-form>
</div>
<div
class=
"demo-drawer__footer clear"
>
<el-button
type=
"primary"
@
click=
"saveConfig"
>
确 定
</el-button>
<el-button
@
click=
"closeDrawer"
>
取 消
</el-button>
</div>
</el-drawer>
</template>
<
script
lang=
"ts"
setup
>
import
{
ref
,
watch
,
computed
,
toRaw
}
from
'vue'
import
{
approveMethods
,
setApproverStr
}
from
'../util'
import
{
useWorkFlowStoreWithOut
}
from
'@/store/modules/simpleWorkflow'
import
{
DICT_TYPE
,
getIntDictOptions
,
getDictLabel
}
from
'@/utils/dict'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
*
as
RoleApi
from
'@/api/system/role'
import
*
as
DeptApi
from
'@/api/system/dept'
import
*
as
PostApi
from
'@/api/system/post'
import
*
as
UserApi
from
'@/api/system/user'
import
*
as
UserGroupApi
from
'@/api/bpm/userGroup'
let
props
=
defineProps
({
directorMaxLevel
:
{
type
:
Number
,
default
:
0
}
})
const
roleOptions
=
ref
<
RoleApi
.
RoleVO
[]
>
([])
// 角色列表
const
postOptions
=
ref
<
PostApi
.
PostVO
[]
>
([])
// 岗位列表
const
userOptions
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
const
deptTreeOptions
=
ref
()
// 部门树
const
userGroupOptions
=
ref
<
UserGroupApi
.
UserGroupVO
[]
>
([])
// 用户组列表
const
candidateConfig
=
ref
({
candidateStrategy
:
undefined
,
candidateParam
:
[],
approveMethod
:
undefined
})
let
approverConfig
=
ref
({})
let
approverVisible
=
ref
(
false
)
let
approverRoleVisible
=
ref
(
false
)
let
checkedRoleList
=
ref
([])
let
checkedList
=
ref
([])
let
store
=
useWorkFlowStoreWithOut
()
let
{
setApproverConfig
,
setApprover
,
setUserTaskConfig
}
=
store
let
approverConfig1
=
computed
(()
=>
store
.
approverConfig1
)
let
approverDrawer
=
computed
(()
=>
store
.
approverDrawer
)
const
userTaskConfig
=
computed
(()
=>
store
.
userTaskConfig
)
let
visible
=
computed
({
get
()
{
return
approverDrawer
.
value
},
set
()
{
closeDrawer
()
}
})
watch
(
userTaskConfig
,
(
val
)
=>
{
if
(
val
.
value
.
attributes
)
{
candidateConfig
.
value
=
val
.
value
.
attributes
}
})
watch
(
approverConfig1
,
(
val
)
=>
{
approverConfig
.
value
=
val
.
value
})
let
changeRange
=
()
=>
{
approverConfig
.
value
.
nodeUserList
=
[]
}
const
changeType
=
(
val
)
=>
{
approverConfig
.
value
.
nodeUserList
=
[]
approverConfig
.
value
.
examineMode
=
1
approverConfig
.
value
.
noHanderAction
=
2
if
(
val
==
2
)
{
approverConfig
.
value
.
directorLevel
=
1
}
else
if
(
val
==
4
)
{
approverConfig
.
value
.
selectMode
=
1
approverConfig
.
value
.
selectRange
=
1
}
else
if
(
val
==
7
)
{
approverConfig
.
value
.
examineEndDirectorLevel
=
1
}
}
const
addApprover
=
()
=>
{
approverVisible
.
value
=
true
checkedList
.
value
=
approverConfig
.
value
.
nodeUserList
}
const
addRoleApprover
=
()
=>
{
approverRoleVisible
.
value
=
true
checkedRoleList
.
value
=
approverConfig
.
value
.
nodeUserList
}
const
sureApprover
=
(
data
)
=>
{
approverConfig
.
value
.
nodeUserList
=
data
approverVisible
.
value
=
false
}
const
sureRoleApprover
=
(
data
)
=>
{
approverConfig
.
value
.
nodeUserList
=
data
approverRoleVisible
.
value
=
false
}
const
saveApprover
=
()
=>
{
approverConfig
.
value
.
error
=
!
setApproverStr
(
approverConfig
.
value
)
setApproverConfig
({
value
:
approverConfig
.
value
,
flag
:
true
,
id
:
approverConfig1
.
value
.
id
})
closeDrawer
()
}
const
saveConfig
=
()
=>
{
console
.
log
(
'before userTaskConfig is '
,
userTaskConfig
.
value
.
id
)
const
rawConfig
=
toRaw
(
userTaskConfig
.
value
)
rawConfig
.
value
.
attributes
=
toRaw
(
candidateConfig
.
value
)
rawConfig
.
flag
=
true
// TODO 进行校验
// setApproverConfig({
// value: approverConfig.value,
// flag: true,
// id: approverConfig1.value.id
// })
const
showText
=
getApproverShowText
()
setUserTaskConfig
({
value
:
rawConfig
.
value
,
flag
:
true
,
id
:
userTaskConfig
.
value
.
id
,
showText
})
console
.
log
(
'after is userTaskConfig'
,
userTaskConfig
.
value
)
closeDrawer
()
}
const
getApproverShowText
=
()
=>
{
let
appoveMethodText
=
''
approveMethods
.
forEach
((
item
)
=>
{
if
(
item
.
value
==
candidateConfig
.
value
.
approveMethod
)
{
appoveMethodText
=
item
.
label
}
})
const
strategyText
=
getDictLabel
(
DICT_TYPE
.
BPM_TASK_CANDIDATE_STRATEGY
,
candidateConfig
.
value
.
candidateStrategy
)
return
`审批方式:
${
appoveMethodText
}
<br/>
审批人规则类型:按
${
strategyText
}
`
}
const
closeDrawer
=
()
=>
{
setApprover
(
false
)
}
const
changecandidateStrategy
=
()
=>
{
candidateConfig
.
value
.
candidateParam
=
[]
}
onMounted
(
async
()
=>
{
// 获得角色列表
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
postOptions
.
value
=
await
PostApi
.
getSimplePostList
()
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得部门列表
const
deptOptions
=
await
DeptApi
.
getSimpleDeptList
()
deptTreeOptions
.
value
=
handleTree
(
deptOptions
,
'id'
)
// 获得用户组列表
userGroupOptions
.
value
=
await
UserGroupApi
.
getUserGroupSimpleList
()
})
</
script
>
<
style
lang=
"scss"
scoped
>
.user-task-header
{
font-size
:
16px
!important
;
}
</
style
>
src/components/SimpleProcessDesigner/src/nodeWrap.vue
View file @
4c4d13cd
...
...
@@ -6,40 +6,48 @@
* @FilePath: /Workflow-Vue3/src/components/nodeWrap.vue
-->
<
template
>
<div
class=
"node-wrap"
v-if=
"nodeConfig.type
<
3
"
>
<div
class=
"node-wrap-box"
:class=
"(nodeConfig.type == 0 ? 'start-node ' : '') +(isTried && nodeConfig.error ? 'active error' : '')"
>
<div
class=
"title"
:style=
"`background: rgb($
{bgColors[nodeConfig.type]});`">
<span
v-if=
"nodeConfig.type == 0"
>
{{
nodeConfig
.
nodeName
}}
</span>
<template
v-else
>
<span
class=
"iconfont"
>
{{
nodeConfig
.
type
==
1
?
''
:
''
}}
</span>
<input
v-if=
"isInput"
type=
"text"
class=
"ant-input editable-title-input"
@
blur=
"blurEvent()"
@
focus=
"$event.currentTarget.select()"
v-focus
v-model=
"nodeConfig.nodeName"
:placeholder=
"defaultText"
/>
<span
v-else
class=
"editable-title"
@
click=
"clickEvent()"
>
{{
nodeConfig
.
nodeName
}}
</span>
<i
class=
"anticon anticon-close close"
@
click=
"delNode"
></i>
</
template
>
</div>
<div
class=
"content"
@
click=
"setPerson"
>
<div
class=
"text"
>
<span
class=
"placeholder"
v-if=
"!showText"
>
请选择{{defaultText}}
</span>
{{showText}}
</div>
<i
class=
"anticon anticon-right arrow"
></i>
</div>
<div
class=
"error_tip"
v-if=
"isTried && nodeConfig.error"
>
<i
class=
"anticon anticon-exclamation-circle"
></i>
</div>
<div
class=
"node-wrap"
v-if=
"nodeConfig.type
<
3
"
>
<div
class=
"node-wrap-box"
:class=
"
(nodeConfig.type == 0 ? 'start-node ' : '') +
(isTried && nodeConfig.error ? 'active error' : '')
"
>
<div
class=
"title"
:style=
"`background: rgb($
{bgColors[nodeConfig.type]});`">
<span
v-if=
"nodeConfig.type == 0"
>
{{
nodeConfig
.
name
}}
</span>
<template
v-else
>
<span
class=
"iconfont"
>
{{
nodeConfig
.
type
==
1
?
''
:
''
}}
</span>
<input
v-if=
"isInput"
type=
"text"
class=
"ant-input editable-title-input"
@
blur=
"blurEvent()"
@
focus=
"$event.currentTarget.select()"
v-model=
"nodeConfig.name"
:placeholder=
"defaultText"
/>
<span
v-else
class=
"editable-title"
@
click=
"clickEvent()"
>
{{
nodeConfig
.
name
}}
</span>
<i
class=
"anticon anticon-close close"
@
click=
"delNode"
></i>
</
template
>
</div>
<div
class=
"content"
@
click=
"setPerson"
>
<div
class=
"text"
>
<span
class=
"placeholder"
v-if=
"!showText"
>
请选择{{ defaultText }}
</span>
<span
v-html=
"showText"
class=
"ellipsis-text"
v-else
></span>
</div>
<div
class=
"icon-box"
>
<i
class=
"anticon anticon-edit"
@
click=
"editNode"
></i>
</div>
<i
class=
"anticon anticon-right arrow"
></i>
</div>
<div
class=
"error_tip"
v-if=
"isTried && nodeConfig.error"
>
<i
class=
"anticon anticon-exclamation-circle"
></i>
</div>
<addNode
v-model:childNodeP=
"nodeConfig.childNode"
/>
</div>
<div
class=
"branch-wrap"
v-if=
"nodeConfig.type == 4"
>
<addNode
v-model:childNodeP=
"nodeConfig.childNode"
/>
</div>
<div
class=
"branch-wrap"
v-if=
"nodeConfig.type == 4"
>
<div
class=
"branch-box-wrap"
>
<div
class=
"branch-box"
>
<button
class=
"add-branch"
@
click=
"addTerm"
>
添加条件
</button>
...
...
@@ -55,16 +63,27 @@
class=
"ant-input editable-title-input"
@
blur=
"blurEvent(index)"
@
focus=
"$event.currentTarget.select()"
v-model=
"item.n
odeN
ame"
v-model=
"item.name"
/>
<span
v-else
class=
"editable-title"
@
click=
"clickEvent(index)"
>
{{ item.nodeName }}
</span>
<span
class=
"priority-title"
@
click=
"setPerson(item.priorityLevel)"
>
优先级{{ item.priorityLevel }}
</span>
<span
v-else
class=
"editable-title"
@
click=
"clickEvent(index)"
>
{{
item.name
}}
</span>
<span
class=
"priority-title"
@
click=
"setPerson(item.priorityLevel)"
>
优先级{{ item.priorityLevel }}
</span
>
<i
class=
"anticon anticon-close close"
@
click=
"delTerm(index)"
></i>
</div>
<div
class=
"sort-right"
v-if=
"index != nodeConfig.conditionNodes.length - 1"
@
click=
"arrTransfer(index)"
>
>
</div>
<div
class=
"content"
@
click=
"setPerson(item.priorityLevel)"
>
{{ conditionStr(nodeConfig, index) }}
</div>
<div
class=
"sort-right"
v-if=
"index != nodeConfig.conditionNodes.length - 1"
@
click=
"arrTransfer(index)"
>
>
</div
>
<div
class=
"content"
@
click=
"setPerson(item.priorityLevel)"
>
{{
conditionStr(nodeConfig, index)
}}
</div>
<div
class=
"error_tip"
v-if=
"isTried && item.error"
>
<i
class=
"anticon anticon-exclamation-circle"
></i>
<i
class=
"anticon anticon-exclamation-circle"
></i>
</div>
</div>
<addNode
v-model:childNodeP=
"item.childNode"
/>
...
...
@@ -84,9 +103,9 @@
<addNode
v-model:childNodeP=
"nodeConfig.childNode"
/>
</div>
</div>
<nodeWrap
v-if=
"nodeConfig.childNode"
v-model:nodeConfig=
"nodeConfig.childNode"
/>
<nodeWrap
v-if=
"nodeConfig.childNode"
v-model:nodeConfig=
"nodeConfig.childNode"
/>
</template>
<
script
setup
>
<
script
lang=
"ts"
setup
>
import
addNode
from
'./addNode.vue'
import
{
onMounted
,
ref
,
watch
,
getCurrentInstance
,
computed
}
from
'vue'
import
{
...
...
@@ -95,7 +114,8 @@ import {
setApproverStr
,
copyerStr
,
bgColors
,
placeholderList
placeholderList
,
getApproverShowText
}
from
'./util'
import
{
useWorkFlowStoreWithOut
}
from
'@/store/modules/simpleWorkflow'
let
_uid
=
getCurrentInstance
().
uid
...
...
@@ -115,11 +135,6 @@ let props = defineProps({
let
defaultText
=
computed
(()
=>
{
return
placeholderList
[
props
.
nodeConfig
.
type
]
})
let
showText
=
computed
(()
=>
{
if
(
props
.
nodeConfig
.
type
==
0
)
return
arrToStr
(
props
.
flowPermission
)
||
'所有人'
if
(
props
.
nodeConfig
.
type
==
1
)
return
setApproverStr
(
props
.
nodeConfig
)
return
copyerStr
(
props
.
nodeConfig
)
})
let
isInputList
=
ref
([])
let
isInput
=
ref
(
false
)
...
...
@@ -152,13 +167,32 @@ let {
setFlowPermission
,
setApproverConfig
,
setCopyerConfig
,
setConditionsConfig
setConditionsConfig
,
setUserTaskConfig
}
=
store
// 审批节点的配置
const
userTaskConfig
=
computed
(()
=>
store
.
userTaskConfig
)
let
isTried
=
computed
(()
=>
store
.
isTried
)
let
flowPermission1
=
computed
(()
=>
store
.
flowPermission1
)
let
approverConfig1
=
computed
(()
=>
store
.
approverConfig1
)
let
copyerConfig1
=
computed
(()
=>
store
.
copyerConfig1
)
let
conditionsConfig1
=
computed
(()
=>
store
.
conditionsConfig1
)
const
showText
=
computed
(()
=>
{
if
(
props
.
nodeConfig
.
type
==
0
)
return
'发起人'
if
(
props
.
nodeConfig
.
type
==
1
)
{
if
(
props
.
nodeConfig
.
attributes
){
return
getApproverShowText
(
props
.
nodeConfig
.
attributes
.
approveMethod
,
props
.
nodeConfig
.
attributes
.
candidateStrategy
)
}
else
{
return
''
}
}
return
copyerStr
(
props
.
nodeConfig
)
})
watch
(
userTaskConfig
,
(
approver
)
=>
{
if
(
approver
.
flag
&&
approver
.
id
===
_uid
)
{
emits
(
'update:nodeConfig'
,
approver
.
value
)
}
})
watch
(
flowPermission1
,
(
flow
)
=>
{
if
(
flow
.
flag
&&
flow
.
id
===
_uid
)
{
emits
(
'update:flowPermission'
,
flow
.
value
)
...
...
@@ -191,12 +225,12 @@ const blurEvent = (index) => {
if
(
index
||
index
===
0
)
{
isInputList
.
value
[
index
]
=
false
// eslint-disable-next-line vue/no-mutating-props
props
.
nodeConfig
.
conditionNodes
[
index
].
n
odeN
ame
=
props
.
nodeConfig
.
conditionNodes
[
index
].
n
odeN
ame
||
'条件'
props
.
nodeConfig
.
conditionNodes
[
index
].
name
=
props
.
nodeConfig
.
conditionNodes
[
index
].
name
||
'条件'
}
else
{
isInput
.
value
=
false
// eslint-disable-next-line vue/no-mutating-props
props
.
nodeConfig
.
n
odeName
=
props
.
nodeConfig
.
nodeN
ame
||
defaultText
props
.
nodeConfig
.
n
ame
=
props
.
nodeConfig
.
n
ame
||
defaultText
}
}
const
delNode
=
()
=>
{
...
...
@@ -206,7 +240,7 @@ const addTerm = () => {
let
len
=
props
.
nodeConfig
.
conditionNodes
.
length
+
1
// eslint-disable-next-line vue/no-mutating-props
props
.
nodeConfig
.
conditionNodes
.
push
({
n
odeN
ame
:
'条件'
+
len
,
name
:
'条件'
+
len
,
type
:
3
,
priorityLevel
:
len
,
conditionList
:
[],
...
...
@@ -221,7 +255,7 @@ const delTerm = (index) => {
props
.
nodeConfig
.
conditionNodes
.
splice
(
index
,
1
)
props
.
nodeConfig
.
conditionNodes
.
map
((
item
,
index
)
=>
{
item
.
priorityLevel
=
index
+
1
item
.
n
odeN
ame
=
`条件
${
index
+
1
}
`
item
.
name
=
`条件
${
index
+
1
}
`
})
resetConditionNodesErr
()
emits
(
'update:nodeConfig'
,
props
.
nodeConfig
)
...
...
@@ -255,13 +289,17 @@ const setPerson = (priorityLevel) => {
})
}
else
if
(
type
==
1
)
{
setApprover
(
true
)
setApproverConfig
({
let
showText
=
undefined
;
if
(
_uid
===
userTaskConfig
.
value
.
id
)
{
showText
=
userTaskConfig
.
value
.
showText
}
setUserTaskConfig
({
value
:
{
...
JSON
.
parse
(
JSON
.
stringify
(
props
.
nodeConfig
)),
...{
settype
:
props
.
nodeConfig
.
settype
?
props
.
nodeConfig
.
settype
:
1
}
...
JSON
.
parse
(
JSON
.
stringify
(
props
.
nodeConfig
))
},
flag
:
false
,
id
:
_uid
id
:
_uid
,
showText
})
}
else
if
(
type
==
2
)
{
setCopyer
(
true
)
...
...
@@ -295,3 +333,10 @@ const arrTransfer = (index, type = 1) => {
emits
(
'update:nodeConfig'
,
props
.
nodeConfig
)
}
</
script
>
<
style
lang=
"scss"
scoped
>
.ellipsis-text
{
overflow
:
hidden
;
text-overflow
:
ellipsis
;
white-space
:
nowrap
;
}
</
style
>
src/components/SimpleProcessDesigner/src/util.ts
View file @
4c4d13cd
// @ts-ignore
import
{
DictDataVO
}
from
'@/api/system/dict/types'
import
{
DICT_TYPE
,
getDictLabel
}
from
'@/utils/dict'
/**
* todo
*/
...
...
@@ -51,6 +54,32 @@ export const setApproverStr = (nodeConfig: any) => {
}
}
export
const
approveMethods
:
DictDataVO
[]
=
[
{
label
:
'单人审批'
,
value
:
1
},
{
label
:
'多人审批(所有人审批通过)'
,
value
:
2
}
// TODO 更多的类型
];
export
const
getApproverShowText
=
(
approveMethod
:
number
,
candidateStrategy
:
number
)
=>
{
if
(
approveMethod
&&
candidateStrategy
)
{
let
appoveMethodText
=
''
approveMethods
.
forEach
((
item
)
=>
{
if
(
item
.
value
==
approveMethod
)
{
appoveMethodText
=
item
.
label
}
})
const
strategyText
=
getDictLabel
(
DICT_TYPE
.
BPM_TASK_CANDIDATE_STRATEGY
,
candidateStrategy
)
return
`审批方式:
${
appoveMethodText
}
<br/>
审批人规则类型:按
${
strategyText
}
`
}
else
{
return
''
}
}
export
const
copyerStr
=
(
nodeConfig
:
any
)
=>
{
if
(
nodeConfig
.
nodeUserList
.
length
!=
0
)
{
return
arrToStr
(
nodeConfig
.
nodeUserList
)
...
...
src/store/modules/simpleWorkflow.ts
View file @
4c4d13cd
...
...
@@ -14,7 +14,8 @@ export const useWorkFlowStore = defineStore('simpleWorkflow', {
conditionDrawer
:
false
,
conditionsConfig1
:
{
conditionNodes
:
[]
}
},
userTaskConfig
:
{}
}),
actions
:
{
setTableId
(
payload
)
{
...
...
@@ -46,6 +47,9 @@ export const useWorkFlowStore = defineStore('simpleWorkflow', {
},
setConditionsConfig
(
payload
)
{
this
.
conditionsConfig1
=
payload
},
setUserTaskConfig
(
payload
)
{
this
.
userTaskConfig
=
payload
}
}
})
...
...
src/views/bpm/simpleWorkflow/index.vue
View file @
4c4d13cd
<
template
>
<div>
<section
class=
"dingflow-design"
>
<el-row>
<el-col
:span=
"20"
/>
<el-col
:span=
"4"
>
<el-button
type=
"primary"
size=
"small"
@
click=
"test"
>
测试
</el-button>
</el-col>
</el-row>
<div
class=
"box-scale"
>
<nodeWrap
v-model:nodeConfig=
"nodeConfig"
/>
<div
class=
"end-node"
>
...
...
@@ -10,18 +17,26 @@
</div>
</section>
</div>
<approverDrawer
/>
</
template
>
<
script
lang=
"ts"
setup
>
import
nodeWrap
from
'@/components/SimpleProcessDesigner/src/nodeWrap.vue'
import
approverDrawer
from
'@/components/SimpleProcessDesigner/src/drawer/approverDrawer.vue'
import
{
ref
}
from
'vue'
defineOptions
({
name
:
'SimpleWorkflowDesignEditor'
})
le
t
nodeConfig
=
ref
({
n
odeN
ame
:
'发起人'
,
cons
t
nodeConfig
=
ref
({
name
:
'发起人'
,
type
:
0
,
id
:
'root'
,
formPerms
:
{},
nodeUserList
:
[],
childNode
:
{}
attributes
:
{
"candidateStrategy"
:
70
},
childNode
:
{},
})
const
test
=
()
=>
{
console
.
log
(
'json format'
,
toRaw
(
nodeConfig
.
value
))
}
</
script
>
<
style
>
@import
url('@/components/SimpleProcessDesigner/theme/workflow.css')
;
...
...
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