Skip to content

Commit 295a43d

Browse files
committed
feat: 流程模型新增/修改弹窗-变更“谁可以发起“、”流程管理员”字段的选择逻辑与人员展示样式
1 parent 8f7a75b commit 295a43d

File tree

1 file changed

+155
-19
lines changed

1 file changed

+155
-19
lines changed

src/views/bpm/model/ModelForm.vue

Lines changed: 155 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -123,36 +123,77 @@
123123
</el-radio>
124124
</el-radio-group>
125125
</el-form-item>
126-
<el-form-item label="谁可以发起" prop="startUserIds">
126+
<el-form-item label="谁可以发起" prop="startUserType">
127127
<el-select
128-
v-model="formData.startUserIds"
129-
multiple
130-
placeholder="请选择可发起人,默认(不选择)则所有人都可以发起"
128+
v-model="formData.startUserType"
129+
placeholder="请选择谁可以发起"
130+
@change="handleStartUserTypeChange"
131131
>
132-
<el-option
133-
v-for="user in userList"
134-
:key="user.id"
135-
:label="user.nickname"
136-
:value="user.id"
137-
/>
132+
<el-option label="全员" :value="0" />
133+
<el-option label="指定人员" :value="1" />
134+
<el-option label="均不可提交" :value="2" />
138135
</el-select>
139-
</el-form-item>
140-
<el-form-item label="流程管理员" prop="managerUserIds">
141-
<el-select v-model="formData.managerUserIds" multiple placeholder="请选择流程管理员">
142-
<el-option
143-
v-for="user in userList"
136+
<div v-if="formData.startUserType === 1" class="mt-2 flex flex-wrap gap-2">
137+
<div
138+
v-for="user in selectedStartUsers"
144139
:key="user.id"
145-
:label="user.nickname"
146-
:value="user.id"
147-
/>
140+
class="bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
141+
>
142+
<el-avatar class="!m-5px" :size="28" v-if="user.avatar" :src="user.avatar" />
143+
<el-avatar class="!m-5px" :size="28" v-else>
144+
{{ user.nickname.substring(0, 1) }}
145+
</el-avatar>
146+
{{ user.nickname }}
147+
<Icon
148+
icon="ep:close"
149+
class="ml-2 cursor-pointer hover:text-red-500"
150+
@click="handleRemoveStartUser(user)"
151+
/>
152+
</div>
153+
<el-button type="primary" link @click="openStartUserSelect">
154+
<Icon icon="ep:plus" />选择人员
155+
</el-button>
156+
</div>
157+
</el-form-item>
158+
<el-form-item label="流程管理员" prop="managerUserType">
159+
<el-select
160+
v-model="formData.managerUserType"
161+
placeholder="请选择流程管理员"
162+
@change="handleManagerUserTypeChange"
163+
>
164+
<el-option label="全员" :value="0" />
165+
<el-option label="指定人员" :value="1" />
166+
<el-option label="均不可提交" :value="2" />
148167
</el-select>
168+
<div v-if="formData.managerUserType === 1" class="mt-2 flex flex-wrap gap-2">
169+
<div
170+
v-for="user in selectedManagerUsers"
171+
:key="user.id"
172+
class="bg-gray-100 h-35px rounded-3xl flex items-center pr-8px dark:color-gray-600 position-relative"
173+
>
174+
<el-avatar class="!m-5px" :size="28" v-if="user.avatar" :src="user.avatar" />
175+
<el-avatar class="!m-5px" :size="28" v-else>
176+
{{ user.nickname.substring(0, 1) }}
177+
</el-avatar>
178+
{{ user.nickname }}
179+
<Icon
180+
icon="ep:close"
181+
class="ml-2 cursor-pointer hover:text-red-500"
182+
@click="handleRemoveManagerUser(user)"
183+
/>
184+
</div>
185+
<el-button type="primary" link @click="openManagerUserSelect">
186+
<Icon icon="ep:plus" />选择人员
187+
</el-button>
188+
</div>
149189
</el-form-item>
150190
</el-form>
151191
<template #footer>
152192
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
153193
<el-button @click="dialogVisible = false">取 消</el-button>
154194
</template>
155195
</Dialog>
196+
<UserSelectForm ref="userSelectFormRef" @confirm="handleUserSelectConfirm" />
156197
</template>
157198
<script lang="ts" setup>
158199
import { propTypes } from '@/utils/propTypes'
@@ -178,7 +219,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
178219
const dialogTitle = ref('') // 弹窗的标题
179220
const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
180221
const formType = ref('') // 表单的类型:create - 新增;update - 修改
181-
const formData = ref({
222+
const formData: any = ref({
182223
id: undefined,
183224
name: '',
184225
key: '',
@@ -191,6 +232,8 @@ const formData = ref({
191232
formCustomCreatePath: '',
192233
formCustomViewPath: '',
193234
visible: true,
235+
startUserType: undefined,
236+
managerUserType: undefined,
194237
startUserIds: [],
195238
managerUserIds: []
196239
})
@@ -211,6 +254,10 @@ const formRef = ref() // 表单 Ref
211254
const formList = ref([]) // 流程表单的下拉框的数据
212255
const categoryList = ref([]) // 流程分类列表
213256
const userList = ref<UserVO[]>([]) // 用户列表
257+
const selectedStartUsers = ref<UserVO[]>([]) // 已选择的发起人列表
258+
const selectedManagerUsers = ref<UserVO[]>([]) // 已选择的管理员列表
259+
const userSelectFormRef = ref() // 用户选择弹窗ref
260+
const currentSelectType = ref<'start' | 'manager'>('start') // 当前选择的是发起人还是管理员
214261
215262
/** 打开弹窗 */
216263
const open = async (type: string, id?: string) => {
@@ -226,6 +273,19 @@ const open = async (type: string, id?: string) => {
226273
} finally {
227274
formLoading.value = false
228275
}
276+
// 加载数据时,根据已有的用户ID列表初始化已选用户
277+
if (formData.value.startUserIds?.length) {
278+
formData.value.startUserType = 1
279+
selectedStartUsers.value = userList.value.filter((user) =>
280+
formData.value.startUserIds.includes(user.id)
281+
)
282+
}
283+
if (formData.value.managerUserIds?.length) {
284+
formData.value.managerUserType = 1
285+
selectedManagerUsers.value = userList.value.filter((user) =>
286+
formData.value.managerUserIds.includes(user.id)
287+
)
288+
}
229289
} else {
230290
formData.value.managerUserIds.push(userStore.getUser.id)
231291
}
@@ -293,9 +353,85 @@ const resetForm = () => {
293353
formCustomCreatePath: '',
294354
formCustomViewPath: '',
295355
visible: true,
356+
startUserType: undefined,
357+
managerUserType: undefined,
296358
startUserIds: [],
297359
managerUserIds: []
298360
}
299361
formRef.value?.resetFields()
362+
selectedStartUsers.value = []
363+
selectedManagerUsers.value = []
364+
}
365+
366+
// 处理发起人类型变化
367+
const handleStartUserTypeChange = (value: number) => {
368+
if (value !== 1) {
369+
selectedStartUsers.value = []
370+
formData.value.startUserIds = []
371+
}
372+
}
373+
374+
// 处理管理员类型变化
375+
const handleManagerUserTypeChange = (value: number) => {
376+
if (value !== 1) {
377+
selectedManagerUsers.value = []
378+
formData.value.managerUserIds = []
379+
}
380+
}
381+
382+
// 打开发起人选择
383+
const openStartUserSelect = () => {
384+
currentSelectType.value = 'start'
385+
userSelectFormRef.value.open(0, selectedStartUsers.value)
386+
}
387+
388+
// 打开管理员选择
389+
const openManagerUserSelect = () => {
390+
currentSelectType.value = 'manager'
391+
userSelectFormRef.value.open(0, selectedManagerUsers.value)
392+
}
393+
394+
// 处理用户选择确认
395+
const handleUserSelectConfirm = (_, users: UserVO[]) => {
396+
if (currentSelectType.value === 'start') {
397+
selectedStartUsers.value = users
398+
formData.value.startUserIds = users.map((u) => u.id)
399+
} else {
400+
selectedManagerUsers.value = users
401+
formData.value.managerUserIds = users.map((u) => u.id)
402+
}
403+
}
404+
405+
// 移除发起人
406+
const handleRemoveStartUser = (user: UserVO) => {
407+
selectedStartUsers.value = selectedStartUsers.value.filter((u) => u.id !== user.id)
408+
formData.value.startUserIds = formData.value.startUserIds.filter((id) => id !== user.id)
409+
}
410+
411+
// 移除管理员
412+
const handleRemoveManagerUser = (user: UserVO) => {
413+
selectedManagerUsers.value = selectedManagerUsers.value.filter((u) => u.id !== user.id)
414+
formData.value.managerUserIds = formData.value.managerUserIds.filter((id) => id !== user.id)
300415
}
301416
</script>
417+
418+
<style lang="scss" scoped>
419+
.bg-gray-100 {
420+
background-color: #f5f7fa;
421+
transition: all 0.3s;
422+
423+
&:hover {
424+
background-color: #e6e8eb;
425+
}
426+
427+
.ep-close {
428+
font-size: 14px;
429+
color: #909399;
430+
transition: color 0.3s;
431+
432+
&:hover {
433+
color: #f56c6c;
434+
}
435+
}
436+
}
437+
</style>

0 commit comments

Comments
 (0)