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
feadd022
authored
Mar 13, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
BPM:重构审批人的分配规则实现,移除 bpm_task_assign_rule 表,存储在 bpmn 的 userTask 中
parent
c89941d4
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
208 additions
and
528 deletions
+208
-528
src/api/bpm/taskAssignRule/index.ts
+0
-29
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json
+10
-0
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json
+10
-0
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
+10
-0
src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
+2
-2
src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue
+2
-0
src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue
+2
-1
src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue
+172
-59
src/router/modules/remaining.ts
+0
-11
src/views/bpm/definition/index.vue
+0
-22
src/views/bpm/model/index.vue
+0
-18
src/views/bpm/taskAssignRule/TaskAssignRuleForm.vue
+0
-250
src/views/bpm/taskAssignRule/index.vue
+0
-136
No files found.
src/api/bpm/taskAssignRule/index.ts
deleted
100644 → 0
View file @
c89941d4
import
request
from
'@/config/axios'
export
type
TaskAssignVO
=
{
id
:
number
modelId
:
string
processDefinitionId
:
string
taskDefinitionKey
:
string
taskDefinitionName
:
string
options
:
string
[]
type
:
number
}
export
const
getTaskAssignRuleList
=
async
(
params
)
=>
{
return
await
request
.
get
({
url
:
'/bpm/task-assign-rule/list'
,
params
})
}
export
const
createTaskAssignRule
=
async
(
data
:
TaskAssignVO
)
=>
{
return
await
request
.
post
({
url
:
'/bpm/task-assign-rule/create'
,
data
:
data
})
}
export
const
updateTaskAssignRule
=
async
(
data
:
TaskAssignVO
)
=>
{
return
await
request
.
put
({
url
:
'/bpm/task-assign-rule/update'
,
data
:
data
})
}
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/activitiDescriptor.json
View file @
feadd022
...
...
@@ -332,6 +332,16 @@
"name"
:
"multiinstance_condition"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignType"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignOptions"
,
"isAttr"
:
true
,
"type"
:
"String"
}
]
},
...
...
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/camundaDescriptor.json
View file @
feadd022
...
...
@@ -319,6 +319,16 @@
"name"
:
"priority"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignType"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignOptions"
,
"isAttr"
:
true
,
"type"
:
"String"
}
]
},
...
...
src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json
View file @
feadd022
...
...
@@ -319,6 +319,16 @@
"name"
:
"priority"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignType"
,
"isAttr"
:
true
,
"type"
:
"String"
},
{
"name"
:
"assignOptions"
,
"isAttr"
:
true
,
"type"
:
"String"
}
]
},
...
...
src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue
View file @
feadd022
...
...
@@ -32,7 +32,7 @@
替代,提供更好的表单设计功能
</el-collapse-item>
<el-collapse-item
name=
"task"
v-if=
"elementType.indexOf('Task') !== -1"
key=
"task"
>
<
template
#
title
><Icon
icon=
"ep:checked"
/>
任务
</
template
>
<
template
#
title
><Icon
icon=
"ep:checked"
/>
任务
(审批人)
</
template
>
<element-task
:id=
"elementId"
:type=
"elementType"
/>
</el-collapse-item>
<el-collapse-item
...
...
@@ -40,7 +40,7 @@
v-if=
"elementType.indexOf('Task') !== -1"
key=
"multiInstance"
>
<
template
#
title
><Icon
icon=
"ep:help-filled"
/>
多实例
</
template
>
<
template
#
title
><Icon
icon=
"ep:help-filled"
/>
多实例
(会签配置)
</
template
>
<element-multi-instance
:business-object=
"elementBusinessObject"
:type=
"elementType"
/>
</el-collapse-item>
<el-collapse-item
name=
"listeners"
key=
"listeners"
>
...
...
src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue
View file @
feadd022
...
...
@@ -138,6 +138,8 @@ const updateBaseInfo = (key) => {
bpmnInstances
().
modeling
.
updateProperties
(
toRaw
(
bpmnElement
.
value
),
attrObj
)
}
}
// TODO 芋艿:这里延迟,可能存在覆盖 userTask 的问题。。例如说,打开的时候,立马选中某个 usertask,则它的 id 会被覆盖。。。
onMounted
(()
=>
{
// 针对上传的 bpmn 流程图时,需要延迟 1 秒的时间,保证 key 和 name 的更新
setTimeout
(()
=>
{
...
...
src/components/bpmnProcessDesigner/package/penal/task/ElementTask.vue
View file @
feadd022
<
template
>
<div
class=
"panel-tab__content"
>
<el-form
size=
"small"
label-width=
"90px"
>
<el-form-item
label=
"异步延续"
>
<!-- add by 芋艿:由于「异步延续」暂时用不到,所以这里 display 为 none -->
<el-form-item
label=
"异步延续"
style=
"display: none"
>
<el-checkbox
v-model=
"taskConfigForm.asyncBefore"
label=
"异步前"
...
...
src/components/bpmnProcessDesigner/package/penal/task/task-components/UserTask.vue
View file @
feadd022
<
template
>
<div
style=
"margin-top: 16px"
>
<!--
<el-form-item
label=
"处理用户"
>
-->
<!--
<el-select
v-model=
"userTaskForm.assignee"
@
change=
"updateElementTask('assignee')"
>
-->
<!--
<el-option
v-for=
"ak in mockData"
:key=
"'ass-' + ak"
:label=
"`用户$
{ak}`" :value="`user${ak}`" />-->
<!--
</el-select>
-->
<!--
</el-form-item>
-->
<!--
<el-form-item
label=
"候选用户"
>
-->
<!--
<el-select
v-model=
"userTaskForm.candidateUsers"
multiple
collapse-tags
@
change=
"updateElementTask('candidateUsers')"
>
-->
<!--
<el-option
v-for=
"uk in mockData"
:key=
"'user-' + uk"
:label=
"`用户$
{uk}`" :value="`user${uk}`" />-->
<!--
</el-select>
-->
<!--
</el-form-item>
-->
<!--
<el-form-item
label=
"候选分组"
>
-->
<!--
<el-select
v-model=
"userTaskForm.candidateGroups"
multiple
collapse-tags
@
change=
"updateElementTask('candidateGroups')"
>
-->
<!--
<el-option
v-for=
"gk in mockData"
:key=
"'ass-' + gk"
:label=
"`分组$
{gk}`" :value="`group${gk}`" />-->
<!--
</el-select>
-->
<!--
</el-form-item>
-->
<el-form-item
label=
"到期时间"
>
<el-input
v-model=
"userTaskForm.dueDate"
clearable
@
change=
"updateElementTask('dueDate')"
/>
<el-form
label-width=
"100px"
>
<el-form-item
label=
"规则类型"
prop=
"assignType"
>
<el-select
v-model=
"userTaskForm.assignType"
clearable
style=
"width: 100%"
@
change=
"changeAssignType"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"跟踪时间
"
>
<el-
inpu
t
v-model=
"userTaskForm.
followUpDate
"
<el-form-item
v-if=
"userTaskForm.assignType == 10"
label=
"指定角色"
prop=
"assignOptions
"
>
<el-
selec
t
v-model=
"userTaskForm.
assignOptions
"
clearable
@
change=
"updateElementTask('followUpDate')"
multiple
style=
"width: 100%"
@
change=
"updateElementTask"
>
<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=
"userTaskForm.assignType == 20 || userTaskForm.assignType == 21"
label=
"指定部门"
prop=
"assignOptions"
span=
"24"
>
<el-tree-select
ref=
"treeRef"
v-model=
"userTaskForm.assignOptions"
:data=
"deptTreeOptions"
:props=
"defaultProps"
empty-text=
"加载中,请稍后"
multiple
node-key=
"id"
show-checkbox
@
change=
"updateElementTask"
/>
</el-form-item>
<el-form-item
label=
"优先级"
>
<el-input
v-model=
"userTaskForm.priority"
clearable
@
change=
"updateElementTask('priority')"
/>
<el-form-item
v-if=
"userTaskForm.assignType == 22"
label=
"指定岗位"
prop=
"assignOptions"
span=
"24"
>
<el-select
v-model=
"userTaskForm.assignOptions"
clearable
multiple
style=
"width: 100%"
@
change=
"updateElementTask"
>
<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=
"
userTaskForm.assignType == 30 ||
userTaskForm.assignType == 31 ||
userTaskForm.assignType == 32
"
label=
"指定用户"
prop=
"assignOptions"
span=
"24"
>
<el-select
v-model=
"userTaskForm.assignOptions"
clearable
multiple
style=
"width: 100%"
@
change=
"updateElementTask"
>
<el-option
v-for=
"item in userOptions"
:key=
"item.id"
:label=
"item.nickname"
:value=
"item.id"
/>
</el-select>
</el-form-item>
友情提示:任务的分配规则,使用
<router-link
target=
"_blank"
:to=
"
{ path: '/bpm/manager/model' }"
>
<el-link
type=
"danger"
>
流程模型
</el-link>
</router-link>
下的【分配规则】替代,提供指定角色、部门负责人、部门成员、岗位、工作组、自定义脚本等 7
种维护的任务分配维度,更加灵活!
</div>
<el-form-item
v-if=
"userTaskForm.assignType === 40"
label=
"指定用户组"
prop=
"assignOptions"
>
<el-select
v-model=
"userTaskForm.assignOptions"
clearable
multiple
style=
"width: 100%"
@
change=
"updateElementTask"
>
<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=
"userTaskForm.assignType === 50"
label=
"指定脚本"
prop=
"assignOptions"
>
<el-select
v-model=
"userTaskForm.assignOptions"
clearable
multiple
style=
"width: 100%"
@
change=
"updateElementTask"
>
<el-option
v-for=
"dict in taskAssignScriptDictDatas"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
</el-form>
</
template
>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
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'
defineOptions
({
name
:
'UserTask'
})
const
props
=
defineProps
({
id
:
String
,
type
:
String
})
const
defaultTaskForm
=
ref
({
assignee
:
''
,
candidateUsers
:
[],
candidateGroups
:
[],
dueDate
:
''
,
followUpDate
:
''
,
priority
:
''
const
userTaskForm
=
ref
({
assignType
:
undefined
,
// 分配规则
assignOptions
:
[]
// 分配选项
})
const
userTaskForm
=
ref
<
any
>
({})
// const mockData=ref([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
const
bpmnElement
=
ref
()
const
bpmnInstances
=
()
=>
(
window
as
any
)?.
bpmnInstances
const
roleOptions
=
ref
<
RoleApi
.
RoleVO
[]
>
([])
// 角色列表
const
deptTreeOptions
=
ref
()
// 部门树
const
postOptions
=
ref
<
PostApi
.
PostVO
[]
>
([])
// 岗位列表
const
userOptions
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
const
userGroupOptions
=
ref
<
UserGroupApi
.
UserGroupVO
[]
>
([])
// 用户组列表
const
taskAssignScriptDictDatas
=
getIntDictOptions
(
DICT_TYPE
.
BPM_TASK_ASSIGN_SCRIPT
)
const
resetTaskForm
=
()
=>
{
for
(
let
key
in
defaultTaskForm
.
value
)
{
let
value
if
(
key
===
'candidateUsers'
||
key
===
'candidateGroups'
)
{
value
=
bpmnElement
.
value
?.
businessObject
[
key
]
?
bpmnElement
.
value
.
businessObject
[
key
].
split
(
','
)
:
[]
}
else
{
value
=
bpmnElement
.
value
?.
businessObject
[
key
]
||
defaultTaskForm
.
value
[
key
]
}
userTaskForm
.
value
[
key
]
=
value
const
businessObject
=
bpmnElement
.
value
.
businessObject
if
(
!
businessObject
)
{
return
}
}
const
updateElementTask
=
(
key
)
=>
{
const
taskAttr
=
Object
.
create
(
null
)
if
(
key
===
'candidateUsers'
||
key
===
'candidateGroups'
)
{
taskAttr
[
key
]
=
userTaskForm
.
value
[
key
]
&&
userTaskForm
.
value
[
key
].
length
?
userTaskForm
.
value
[
key
].
join
()
:
null
if
(
businessObject
.
assignType
!=
undefined
)
{
userTaskForm
.
value
.
assignType
=
parseInt
(
businessObject
.
assignType
)
as
any
}
else
{
userTaskForm
.
value
.
assignType
=
undefined
}
if
(
businessObject
.
assignOptions
&&
businessObject
.
assignOptions
.
length
>
0
)
{
userTaskForm
.
value
.
assignOptions
=
businessObject
.
assignOptions
?.
split
(
','
).
map
((
item
)
=>
+
item
)
}
else
{
taskAttr
[
key
]
=
userTaskForm
.
value
[
key
]
||
null
userTaskForm
.
value
.
assignOptions
=
[]
}
bpmnInstances
().
modeling
.
updateProperties
(
toRaw
(
bpmnElement
.
value
),
taskAttr
)
}
/** 更新 assignType 字段时,需要清空 assignOptions,并触发 bpmn 图更新 */
const
changeAssignType
=
()
=>
{
userTaskForm
.
value
.
assignOptions
=
[]
updateElementTask
()
}
/** 选中某个 options 时候,更新 bpmn 图 */
const
updateElementTask
=
()
=>
{
bpmnInstances
().
modeling
.
updateProperties
(
toRaw
(
bpmnElement
.
value
),
{
assignType
:
userTaskForm
.
value
.
assignType
,
assignOptions
:
userTaskForm
.
value
.
assignOptions
.
join
(
','
)
})
}
watch
(
...
...
@@ -92,6 +190,21 @@ watch(
},
{
immediate
:
true
}
)
onMounted
(
async
()
=>
{
// 获得角色列表
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
// 获得部门列表
const
deptOptions
=
await
DeptApi
.
getSimpleDeptList
()
deptTreeOptions
.
value
=
handleTree
(
deptOptions
,
'id'
)
// 获得岗位列表
postOptions
.
value
=
await
PostApi
.
getSimplePostList
()
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得用户组列表
userGroupOptions
.
value
=
await
UserGroupApi
.
getSimpleUserGroupList
()
})
onBeforeUnmount
(()
=>
{
bpmnElement
.
value
=
null
})
...
...
src/router/modules/remaining.ts
View file @
feadd022
...
...
@@ -279,17 +279,6 @@ const remainingRouter: AppRouteRecordRaw[] = [
}
},
{
path
:
'/manager/task-assign-rule'
,
component
:
()
=>
import
(
'@/views/bpm/taskAssignRule/index.vue'
),
name
:
'BpmTaskAssignRuleList'
,
meta
:
{
noCache
:
true
,
hidden
:
true
,
canTo
:
true
,
title
:
'任务分配规则'
}
},
{
path
:
'/process-instance/create'
,
component
:
()
=>
import
(
'@/views/bpm/processInstance/create/index.vue'
),
name
:
'BpmProcessInstanceCreate'
,
...
...
src/views/bpm/definition/index.vue
View file @
feadd022
...
...
@@ -57,18 +57,6 @@
width=
"300"
show-overflow-tooltip
/>
<el-table-column
label=
"操作"
align=
"center"
width=
"150"
fixed=
"right"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"handleAssignRule(scope.row)"
v-hasPermi=
"['bpm:task-assign-rule:query']"
>
分配规则
</el-button>
</
template
>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
...
...
@@ -129,16 +117,6 @@ const getList = async () => {
}
}
/** 点击任务分配按钮 */
const
handleAssignRule
=
(
row
)
=>
{
push
({
name
:
'BpmTaskAssignRuleList'
,
query
:
{
modelId
:
row
.
id
}
})
}
/** 流程表单的详情按钮操作 */
const
formDetailVisible
=
ref
(
false
)
const
formDetailPreview
=
ref
({
...
...
src/views/bpm/model/index.vue
View file @
feadd022
...
...
@@ -164,14 +164,6 @@
<el-button
link
type=
"primary"
@
click=
"handleAssignRule(scope.row)"
v-hasPermi=
"['bpm:task-assign-rule:query']"
>
分配规则
</el-button>
<el-button
link
type=
"primary"
@
click=
"handleDeploy(scope.row)"
v-hasPermi=
"['bpm:model:deploy']"
>
...
...
@@ -347,16 +339,6 @@ const handleDeploy = async (row) => {
}
catch
{}
}
/** 点击任务分配按钮 */
const
handleAssignRule
=
(
row
)
=>
{
push
({
name
:
'BpmTaskAssignRuleList'
,
query
:
{
modelId
:
row
.
id
}
})
}
/** 跳转到指定流程定义列表 */
const
handleDefinitionList
=
(
row
)
=>
{
push
({
...
...
src/views/bpm/taskAssignRule/TaskAssignRuleForm.vue
deleted
100644 → 0
View file @
c89941d4
<
template
>
<Dialog
v-model=
"dialogVisible"
title=
"修改任务规则"
width=
"600"
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
label-width=
"80px"
>
<el-form-item
label=
"任务名称"
prop=
"taskDefinitionName"
>
<el-input
v-model=
"formData.taskDefinitionName"
disabled
placeholder=
"请输入流标标识"
/>
</el-form-item>
<el-form-item
label=
"任务标识"
prop=
"taskDefinitionKey"
>
<el-input
v-model=
"formData.taskDefinitionKey"
disabled
placeholder=
"请输入任务标识"
/>
</el-form-item>
<el-form-item
label=
"规则类型"
prop=
"type"
>
<el-select
v-model=
"formData.type"
clearable
style=
"width: 100%"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"formData.type === 10"
label=
"指定角色"
prop=
"roleIds"
>
<el-select
v-model=
"formData.roleIds"
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=
"formData.type === 20 || formData.type === 21"
label=
"指定部门"
prop=
"deptIds"
span=
"24"
>
<el-tree-select
ref=
"treeRef"
v-model=
"formData.deptIds"
:data=
"deptTreeOptions"
:props=
"defaultProps"
empty-text=
"加载中,请稍后"
multiple
node-key=
"id"
show-checkbox
/>
</el-form-item>
<el-form-item
v-if=
"formData.type === 22"
label=
"指定岗位"
prop=
"postIds"
span=
"24"
>
<el-select
v-model=
"formData.postIds"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in postOptions"
:key=
"parseInt(item.id)"
:label=
"item.name"
:value=
"parseInt(item.id)"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"formData.type === 30 || formData.type === 31 || formData.type === 32"
label=
"指定用户"
prop=
"userIds"
span=
"24"
>
<el-select
v-model=
"formData.userIds"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in userOptions"
:key=
"parseInt(item.id)"
:label=
"item.nickname"
:value=
"parseInt(item.id)"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"formData.type === 40"
label=
"指定用户组"
prop=
"userGroupIds"
>
<el-select
v-model=
"formData.userGroupIds"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"item in userGroupOptions"
:key=
"parseInt(item.id)"
:label=
"item.name"
:value=
"parseInt(item.id)"
/>
</el-select>
</el-form-item>
<el-form-item
v-if=
"formData.type === 50"
label=
"指定脚本"
prop=
"scripts"
>
<el-select
v-model=
"formData.scripts"
clearable
multiple
style=
"width: 100%"
>
<el-option
v-for=
"dict in taskAssignScriptDictDatas"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<!-- 操作按钮 -->
<template
#
footer
>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
*
as
TaskAssignRuleApi
from
'@/api/bpm/taskAssignRule'
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'
defineOptions
({
name
:
'BpmTaskAssignRuleForm'
})
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formData
=
ref
({
type
:
Number
(
undefined
),
modelId
:
''
,
options
:
[],
roleIds
:
[],
deptIds
:
[],
postIds
:
[],
userIds
:
[],
userGroupIds
:
[],
scripts
:
[]
})
const
formRules
=
reactive
({
type
:
[{
required
:
true
,
message
:
'规则类型不能为空'
,
trigger
:
'change'
}],
roleIds
:
[{
required
:
true
,
message
:
'指定角色不能为空'
,
trigger
:
'change'
}],
deptIds
:
[{
required
:
true
,
message
:
'指定部门不能为空'
,
trigger
:
'change'
}],
postIds
:
[{
required
:
true
,
message
:
'指定岗位不能为空'
,
trigger
:
'change'
}],
userIds
:
[{
required
:
true
,
message
:
'指定用户不能为空'
,
trigger
:
'change'
}],
userGroupIds
:
[{
required
:
true
,
message
:
'指定用户组不能为空'
,
trigger
:
'change'
}],
scripts
:
[{
required
:
true
,
message
:
'指定脚本不能为空'
,
trigger
:
'change'
}]
})
const
formRef
=
ref
()
// 表单 Ref
const
roleOptions
=
ref
<
RoleApi
.
RoleVO
[]
>
([])
// 角色列表
const
deptOptions
=
ref
<
DeptApi
.
DeptVO
[]
>
([])
// 部门列表
const
deptTreeOptions
=
ref
()
// 部门树
const
postOptions
=
ref
<
PostApi
.
PostVO
[]
>
([])
// 岗位列表
const
userOptions
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
const
userGroupOptions
=
ref
<
UserGroupApi
.
UserGroupVO
[]
>
([])
// 用户组列表
const
taskAssignScriptDictDatas
=
getIntDictOptions
(
DICT_TYPE
.
BPM_TASK_ASSIGN_SCRIPT
)
/** 打开弹窗 */
const
open
=
async
(
modelId
:
string
,
row
:
TaskAssignRuleApi
.
TaskAssignVO
)
=>
{
// 1. 先重置表单
resetForm
()
// 2. 再设置表单
formData
.
value
=
{
...
row
,
modelId
:
modelId
,
options
:
[],
roleIds
:
[],
deptIds
:
[],
postIds
:
[],
userIds
:
[],
userGroupIds
:
[],
scripts
:
[]
}
// 将 options 赋值到对应的 roleIds 等选项
if
(
row
.
type
===
10
)
{
formData
.
value
.
roleIds
.
push
(...
row
.
options
)
}
else
if
(
row
.
type
===
20
||
row
.
type
===
21
)
{
formData
.
value
.
deptIds
.
push
(...
row
.
options
)
}
else
if
(
row
.
type
===
22
)
{
formData
.
value
.
postIds
.
push
(...
row
.
options
)
}
else
if
(
row
.
type
===
30
||
row
.
type
===
31
||
row
.
type
===
32
)
{
formData
.
value
.
userIds
.
push
(...
row
.
options
)
}
else
if
(
row
.
type
===
40
)
{
formData
.
value
.
userGroupIds
.
push
(...
row
.
options
)
}
else
if
(
row
.
type
===
50
)
{
formData
.
value
.
scripts
.
push
(...
row
.
options
)
}
// 打开弹窗
dialogVisible
.
value
=
true
// 获得角色列表
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
// 获得部门列表
deptOptions
.
value
=
await
DeptApi
.
getSimpleDeptList
()
deptTreeOptions
.
value
=
handleTree
(
deptOptions
.
value
,
'id'
)
// 获得岗位列表
postOptions
.
value
=
await
PostApi
.
getSimplePostList
()
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得用户组列表
userGroupOptions
.
value
=
await
UserGroupApi
.
getSimpleUserGroupList
()
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
/** 提交表单 */
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
submitForm
=
async
()
=>
{
// 校验表单
if
(
!
formRef
)
return
const
valid
=
await
formRef
.
value
.
validate
()
if
(
!
valid
)
return
// 构建表单
const
form
=
{
...
formData
.
value
,
taskDefinitionName
:
undefined
}
// 将 roleIds 等选项赋值到 options 中
if
(
form
.
type
===
10
)
{
form
.
options
=
form
.
roleIds
}
else
if
(
form
.
type
===
20
||
form
.
type
===
21
)
{
form
.
options
=
form
.
deptIds
}
else
if
(
form
.
type
===
22
)
{
form
.
options
=
form
.
postIds
}
else
if
(
form
.
type
===
30
||
form
.
type
===
31
||
form
.
type
===
32
)
{
form
.
options
=
form
.
userIds
}
else
if
(
form
.
type
===
40
)
{
form
.
options
=
form
.
userGroupIds
}
else
if
(
form
.
type
===
50
)
{
form
.
options
=
form
.
scripts
}
form
.
roleIds
=
undefined
form
.
deptIds
=
undefined
form
.
postIds
=
undefined
form
.
userIds
=
undefined
form
.
userGroupIds
=
undefined
form
.
scripts
=
undefined
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
form
as
unknown
as
TaskAssignRuleApi
.
TaskAssignVO
if
(
!
data
.
id
)
{
await
TaskAssignRuleApi
.
createTaskAssignRule
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
await
TaskAssignRuleApi
.
updateTaskAssignRule
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
}
dialogVisible
.
value
=
false
// 发送操作成功的事件
emit
(
'success'
)
}
finally
{
formLoading
.
value
=
false
}
}
/** 重置表单 */
const
resetForm
=
()
=>
{
formRef
.
value
?.
resetFields
()
}
</
script
>
src/views/bpm/taskAssignRule/index.vue
deleted
100644 → 0
View file @
c89941d4
<
template
>
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"任务名"
align=
"center"
prop=
"taskDefinitionName"
/>
<el-table-column
label=
"任务标识"
align=
"center"
prop=
"taskDefinitionKey"
/>
<el-table-column
label=
"规则类型"
align=
"center"
prop=
"type"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE"
:value=
"scope.row.type"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"规则范围"
align=
"center"
prop=
"options"
>
<
template
#
default=
"scope"
>
<el-tag
class=
"mr-5px"
:key=
"option"
v-for=
"option in scope.row.options"
>
{{
getAssignRuleOptionName
(
scope
.
row
.
type
,
option
)
}}
</el-tag>
</
template
>
</el-table-column>
<el-table-column
v-if=
"queryParams.modelId"
label=
"操作"
align=
"center"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"openForm(scope.row)"
v-hasPermi=
"['bpm:task-assign-rule:update']"
>
修改
</el-button>
</
template
>
</el-table-column>
</el-table>
</ContentWrap>
<!-- 添加/修改弹窗 -->
<TaskAssignRuleForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
*
as
TaskAssignRuleApi
from
'@/api/bpm/taskAssignRule'
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'
import
TaskAssignRuleForm
from
'./TaskAssignRuleForm.vue'
defineOptions
({
name
:
'BpmTaskAssignRule'
})
const
{
query
}
=
useRoute
()
// 查询参数
const
loading
=
ref
(
true
)
// 列表的加载中
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
modelId
:
query
.
modelId
,
// 流程模型的编号。如果 modelId 非空,则用于流程模型的查看与配置
processDefinitionId
:
query
.
processDefinitionId
// 流程定义的编号。如果 processDefinitionId 非空,则用于流程定义的查看,不支持配置
})
const
roleOptions
=
ref
<
RoleApi
.
RoleVO
[]
>
([])
// 角色列表
const
deptOptions
=
ref
<
DeptApi
.
DeptVO
[]
>
([])
// 部门列表
const
postOptions
=
ref
<
PostApi
.
PostVO
[]
>
([])
// 岗位列表
const
userOptions
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 用户列表
const
userGroupOptions
=
ref
<
UserGroupApi
.
UserGroupVO
[]
>
([])
// 用户组列表
const
taskAssignScriptDictDatas
=
getIntDictOptions
(
DICT_TYPE
.
BPM_TASK_ASSIGN_SCRIPT
)
/** 查询列表 */
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
list
.
value
=
await
TaskAssignRuleApi
.
getTaskAssignRuleList
(
queryParams
)
}
finally
{
loading
.
value
=
false
}
}
/** 翻译规则范围 */
// TODO 芋艿:各种 ts 报错
const
getAssignRuleOptionName
=
(
type
,
option
)
=>
{
if
(
type
===
10
)
{
for
(
const
roleOption
of
roleOptions
.
value
)
{
if
(
roleOption
.
id
===
option
)
{
return
roleOption
.
name
}
}
}
else
if
(
type
===
20
||
type
===
21
)
{
for
(
const
deptOption
of
deptOptions
.
value
)
{
if
(
deptOption
.
id
===
option
)
{
return
deptOption
.
name
}
}
}
else
if
(
type
===
22
)
{
for
(
const
postOption
of
postOptions
.
value
)
{
if
(
postOption
.
id
===
option
)
{
return
postOption
.
name
}
}
}
else
if
(
type
===
30
||
type
===
31
||
type
===
32
)
{
for
(
const
userOption
of
userOptions
.
value
)
{
if
(
userOption
.
id
===
option
)
{
return
userOption
.
nickname
}
}
}
else
if
(
type
===
40
)
{
for
(
const
userGroupOption
of
userGroupOptions
.
value
)
{
if
(
userGroupOption
.
id
===
option
)
{
return
userGroupOption
.
name
}
}
}
else
if
(
type
===
50
)
{
option
=
option
+
''
// 转换成 string
for
(
const
dictData
of
taskAssignScriptDictDatas
)
{
if
(
dictData
.
value
===
option
)
{
return
dictData
.
label
}
}
}
return
'未知('
+
option
+
')'
}
/** 添加/修改操作 */
const
formRef
=
ref
()
const
openForm
=
(
row
:
TaskAssignRuleApi
.
TaskAssignVO
)
=>
{
formRef
.
value
.
open
(
queryParams
.
modelId
,
row
)
}
/** 初始化 */
onMounted
(
async
()
=>
{
await
getList
()
// 获得角色列表
roleOptions
.
value
=
await
RoleApi
.
getSimpleRoleList
()
// 获得部门列表
deptOptions
.
value
=
await
DeptApi
.
getSimpleDeptList
()
// 获得岗位列表
postOptions
.
value
=
await
PostApi
.
getSimplePostList
()
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
// 获得用户组列表
userGroupOptions
.
value
=
await
UserGroupApi
.
getSimpleUserGroupList
()
})
</
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