Skip to content

Commit 32d0093

Browse files
authored
Merge pull request #99 from GoldenZqqq/feature/bpm
发起流程界面功能点优化与bug修复
2 parents 5121d56 + 6dd6f9c commit 32d0093

File tree

5 files changed

+342
-158
lines changed

5 files changed

+342
-158
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<template>
2+
<Dialog v-model="dialogVisible" title="人员选择" width="900">
3+
<el-row>
4+
<el-col :span="6">
5+
<el-tree
6+
ref="treeRef"
7+
:data="deptList"
8+
:expand-on-click-node="false"
9+
:props="defaultProps"
10+
default-expand-all
11+
highlight-current
12+
node-key="id"
13+
@node-click="handleNodeClick"
14+
/>
15+
</el-col>
16+
<el-col :span="17" :offset="1">
17+
<el-transfer
18+
v-model="selectedUserIdList"
19+
filterable
20+
filter-placeholder="搜索成员"
21+
:data="userList"
22+
:props="{ label: 'nickname', key: 'id' }"
23+
/>
24+
</el-col>
25+
</el-row>
26+
<template #footer>
27+
<el-button
28+
:disabled="formLoading || !selectedUserIdList?.length"
29+
type="primary"
30+
@click="submitForm"
31+
>确 定</el-button
32+
>
33+
<el-button @click="dialogVisible = false">取 消</el-button>
34+
</template>
35+
</Dialog>
36+
</template>
37+
<script lang="ts" setup>
38+
import { defaultProps, handleTree } from '@/utils/tree'
39+
import * as DeptApi from '@/api/system/dept'
40+
import * as UserApi from '@/api/system/user'
41+
42+
defineOptions({ name: 'UserSelectForm' })
43+
const emit = defineEmits<{
44+
confirm: [id: any, userList: any[]]
45+
}>()
46+
const { t } = useI18n() // 国际
47+
const deptList = ref<Tree[]>([]) // 部门树形结构化
48+
const userList: any = ref([]) // 用户列表
49+
const message = useMessage() // 消息弹窗
50+
const selectedUserIdList: any = ref([]) // 选中的用户列表
51+
const dialogVisible = ref(false) // 弹窗的是否展示
52+
const formLoading = ref(false) // 表单的加载中
53+
const activityId = ref() // 主键id
54+
55+
/** 打开弹窗 */
56+
const open = async (id, selectedList?) => {
57+
activityId.value = id
58+
resetForm()
59+
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
60+
await getUserList()
61+
selectedUserIdList.value = selectedList?.map((item) => item.id)
62+
// 修改时,设置数据
63+
dialogVisible.value = true
64+
}
65+
66+
/* 获取用户列表 */
67+
const getUserList = async (deptId?) => {
68+
try {
69+
// @ts-ignore
70+
const data = await UserApi.getUserPage({ pageSize: 100, pageNo: 1, deptId })
71+
userList.value = data.list
72+
} finally {
73+
}
74+
}
75+
76+
const submitForm = async () => {
77+
// 提交请求
78+
formLoading.value = true
79+
try {
80+
message.success(t('common.updateSuccess'))
81+
dialogVisible.value = false
82+
const emitUserList = userList.value.filter((user) => selectedUserIdList.value.includes(user.id))
83+
// 发送操作成功的事件
84+
emit('confirm', activityId.value, emitUserList)
85+
} finally {
86+
formLoading.value = false
87+
}
88+
}
89+
const resetForm = () => {
90+
deptList.value = []
91+
userList.value = []
92+
selectedUserIdList.value = []
93+
}
94+
95+
/** 处理部门被点击 */
96+
const handleNodeClick = async (row: { [key: string]: any }) => {
97+
getUserList(row.id)
98+
}
99+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
100+
</script>

src/views/bpm/processInstance/create/ProcessDefinitionDetail.vue

Lines changed: 19 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,7 @@
1919
v-model="detailForm.value"
2020
:option="detailForm.option"
2121
@submit="submitForm"
22-
>
23-
<template #type-startUserSelect>
24-
<el-col :span="24">
25-
<el-card class="mb-10px">
26-
<template #header>指定审批人</template>
27-
<el-form
28-
:model="startUserSelectAssignees"
29-
:rules="startUserSelectAssigneesFormRules"
30-
ref="startUserSelectAssigneesFormRef"
31-
>
32-
<el-form-item
33-
v-for="userTask in startUserSelectTasks"
34-
:key="userTask.id"
35-
:label="`任务【${userTask.name}】`"
36-
:prop="userTask.id"
37-
>
38-
<el-select
39-
v-model="startUserSelectAssignees[userTask.id]"
40-
multiple
41-
placeholder="请选择审批人"
42-
>
43-
<el-option
44-
v-for="user in userList"
45-
:key="user.id"
46-
:label="user.nickname"
47-
:value="user.id"
48-
/>
49-
</el-select>
50-
</el-form-item>
51-
</el-form>
52-
</el-card>
53-
</el-col>
54-
</template>
55-
</form-create>
22+
/>
5623
</el-col>
5724

5825
<el-col :span="6" :offset="1">
@@ -61,7 +28,9 @@
6128
ref="timelineRef"
6229
:activity-nodes="activityNodes"
6330
:show-status-icon="false"
64-
candidateField="candidateUserList"
31+
:startUserSelectTasks="startUserSelectTasks"
32+
:startUserSelectAssignees="startUserSelectAssignees"
33+
@select-user-confirm="selectUserConfirm"
6534
/>
6635
</el-col>
6736
</el-row>
@@ -104,7 +73,6 @@ import type { ApiAttrs } from '@form-create/element-ui/types/config'
10473
import { useTagsViewStore } from '@/store/modules/tagsView'
10574
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
10675
import * as DefinitionApi from '@/api/bpm/definition'
107-
import * as UserApi from '@/api/system/user'
10876
10977
defineOptions({ name: 'ProcessDefinitionDetail' })
11078
const props = defineProps<{
@@ -121,11 +89,8 @@ const detailForm: any = ref({
12189
}) // 流程表单详情
12290
const fApi = ref<ApiAttrs>()
12391
// 指定审批人
124-
const startUserSelectAssigneesFormRef = ref() // 发起人选择审批人的表单 Ref
12592
const startUserSelectTasks: any = ref([]) // 发起人需要选择审批人的用户任务列表
12693
const startUserSelectAssignees = ref({}) // 发起人选择审批人的数据
127-
const startUserSelectAssigneesFormRules = ref({}) // 发起人选择审批人的表单 Rules
128-
const userList = ref<any[]>([]) // 用户列表
12994
const bpmnXML: any = ref(null) // BPMN 数据
13095
/** 当前的Tab */
13196
const activeTab = ref('form')
@@ -138,7 +103,6 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
138103
// 重置指定审批人
139104
startUserSelectTasks.value = []
140105
startUserSelectAssignees.value = {}
141-
startUserSelectAssigneesFormRules.value = {}
142106
143107
// 情况一:流程表单
144108
if (row.formType == 10) {
@@ -163,24 +127,12 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
163127
if (processDefinitionDetail) {
164128
bpmnXML.value = processDefinitionDetail.bpmnXml
165129
startUserSelectTasks.value = processDefinitionDetail.startUserSelectTasks
166-
167130
// 设置指定审批人
168131
if (startUserSelectTasks.value?.length > 0) {
169-
detailForm.value.rule.push({
170-
type: 'startUserSelect',
171-
props: {
172-
title: '指定审批人'
173-
}
174-
})
175-
// 设置校验规则
176132
for (const userTask of startUserSelectTasks.value) {
133+
// 初始化数据
177134
startUserSelectAssignees.value[userTask.id] = []
178-
startUserSelectAssigneesFormRules.value[userTask.id] = [
179-
{ required: true, message: '请选择审批人', trigger: 'blur' }
180-
]
181135
}
182-
// 加载用户列表
183-
userList.value = await UserApi.getSimpleUserList()
184136
}
185137
}
186138
// 情况二:业务表单
@@ -209,22 +161,27 @@ const getApprovalDetail = async (row: any) => {
209161
}
210162
}
211163
/** 提交按钮 */
212-
const submitForm = async (formData: any) => {
213-
debugger
164+
const submitForm = async () => {
214165
if (!fApi.value || !props.selectProcessDefinition) {
215166
return
216167
}
217168
// 如果有指定审批人,需要校验
218169
if (startUserSelectTasks.value?.length > 0) {
219-
await startUserSelectAssigneesFormRef.value.validate()
170+
for (const userTask of startUserSelectTasks.value) {
171+
if (
172+
Array.isArray(startUserSelectAssignees.value[userTask.id]) &&
173+
startUserSelectAssignees.value[userTask.id].length === 0
174+
)
175+
return message.warning(`请选择${userTask.name}的审批人`)
176+
}
220177
}
221178
222179
// 提交请求
223180
fApi.value.btn.loading(true)
224181
try {
225182
await ProcessInstanceApi.createProcessInstance({
226183
processDefinitionId: props.selectProcessDefinition.id,
227-
variables: formData || detailForm.value.value,
184+
variables: detailForm.value.value,
228185
startUserSelectAssignees: startUserSelectAssignees.value
229186
})
230187
// 提示
@@ -243,14 +200,18 @@ const handleCancel = () => {
243200
emit('cancel')
244201
}
245202
203+
const selectUserConfirm = (id, userList) => {
204+
startUserSelectAssignees.value[id] = userList?.map((item) => item.id)
205+
}
206+
246207
defineExpose({ initProcessInfo })
247208
</script>
248209

249210
<style lang="scss" scoped>
250211
$wrap-padding-height: 20px;
251212
$wrap-margin-height: 15px;
252213
$button-height: 51px;
253-
$process-header-height: 194px;
214+
$process-header-height: 105px;
254215
255216
.processInstance-wrap-main {
256217
height: calc(

0 commit comments

Comments
 (0)