Skip to content

Commit 8b5740d

Browse files
committed
feat: 工作流发起页面-需要自定义选择审批人的节点改为在右侧timeline组件中跳出弹窗选择
1 parent 92314ee commit 8b5740d

File tree

4 files changed

+69
-162
lines changed

4 files changed

+69
-162
lines changed

src/components/UserSelectForm/index.vue

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
</el-col>
1616
<el-col :span="17" :offset="1">
1717
<el-transfer
18-
v-model="selectedUserList"
18+
v-model="selectedUserIdList"
1919
filterable
2020
filter-placeholder="搜索成员"
2121
:data="userList"
@@ -24,7 +24,12 @@
2424
</el-col>
2525
</el-row>
2626
<template #footer>
27-
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
27+
<el-button
28+
:disabled="formLoading || !selectedUserIdList?.length"
29+
type="primary"
30+
@click="submitForm"
31+
>确 定</el-button
32+
>
2833
<el-button @click="dialogVisible = false">取 消</el-button>
2934
</template>
3035
</Dialog>
@@ -36,21 +41,24 @@ import * as UserApi from '@/api/system/user'
3641
3742
defineOptions({ name: 'UserSelectForm' })
3843
const emit = defineEmits<{
39-
confirm: [userList: any[]]
44+
confirm: [id: any, userList: any[]]
4045
}>()
4146
const { t } = useI18n() // 国际
4247
const deptList = ref<Tree[]>([]) // 部门树形结构化
4348
const userList: any = ref([]) // 用户列表
4449
const message = useMessage() // 消息弹窗
45-
const selectedUserList: any = ref([]) // 选中的用户列表
50+
const selectedUserIdList: any = ref([]) // 选中的用户列表
4651
const dialogVisible = ref(false) // 弹窗的是否展示
4752
const formLoading = ref(false) // 表单的加载中
53+
const activityId = ref() // 主键id
4854
4955
/** 打开弹窗 */
50-
const open = async () => {
56+
const open = async (id, selectedList?) => {
57+
activityId.value = id
5158
resetForm()
5259
deptList.value = handleTree(await DeptApi.getSimpleDeptList())
5360
await getUserList()
61+
selectedUserIdList.value = selectedList?.map((item) => item.id)
5462
// 修改时,设置数据
5563
dialogVisible.value = true
5664
}
@@ -71,22 +79,22 @@ const submitForm = async () => {
7179
try {
7280
message.success(t('common.updateSuccess'))
7381
dialogVisible.value = false
82+
const emitUserList = userList.value.filter((user) => selectedUserIdList.value.includes(user.id))
7483
// 发送操作成功的事件
75-
emit('confirm', selectedUserList.value)
84+
emit('confirm', activityId.value, emitUserList)
7685
} finally {
7786
formLoading.value = false
7887
}
7988
}
8089
const resetForm = () => {
8190
deptList.value = []
8291
userList.value = []
83-
selectedUserList.value = []
92+
selectedUserIdList.value = []
8493
}
8594
8695
/** 处理部门被点击 */
8796
const handleNodeClick = async (row: { [key: string]: any }) => {
8897
getUserList(row.id)
8998
}
90-
9199
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
92100
</script>

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

Lines changed: 21 additions & 61 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">
@@ -62,6 +29,8 @@
6229
:activity-nodes="activityNodes"
6330
:show-status-icon="false"
6431
:startUserSelectTasks="startUserSelectTasks"
32+
:startUserSelectAssignees="startUserSelectAssignees"
33+
@select-user-confirm="selectUserConfirm"
6534
/>
6635
</el-col>
6736
</el-row>
@@ -104,8 +73,7 @@ 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'
108-
import { activityNodes as aN, startUserSelectTasks as sUs } from './mock'
76+
// import { activityNodes as aN, startUserSelectTasks as sUs } from './mock'
10977
11078
defineOptions({ name: 'ProcessDefinitionDetail' })
11179
const props = defineProps<{
@@ -122,11 +90,8 @@ const detailForm: any = ref({
12290
}) // 流程表单详情
12391
const fApi = ref<ApiAttrs>()
12492
// 指定审批人
125-
const startUserSelectAssigneesFormRef = ref() // 发起人选择审批人的表单 Ref
12693
const startUserSelectTasks: any = ref([]) // 发起人需要选择审批人的用户任务列表
12794
const startUserSelectAssignees = ref({}) // 发起人选择审批人的数据
128-
const startUserSelectAssigneesFormRules = ref({}) // 发起人选择审批人的表单 Rules
129-
// const userList = ref<any[]>([]) // 用户列表
13095
const bpmnXML: any = ref(null) // BPMN 数据
13196
/** 当前的Tab */
13297
const activeTab = ref('form')
@@ -139,7 +104,6 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
139104
// 重置指定审批人
140105
startUserSelectTasks.value = []
141106
startUserSelectAssignees.value = {}
142-
startUserSelectAssigneesFormRules.value = {}
143107
144108
// 情况一:流程表单
145109
if (row.formType == 10) {
@@ -164,25 +128,13 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
164128
if (processDefinitionDetail) {
165129
bpmnXML.value = processDefinitionDetail.bpmnXml
166130
startUserSelectTasks.value = processDefinitionDetail.startUserSelectTasks
167-
startUserSelectTasks.value = sUs
168131
// 设置指定审批人
169-
// if (startUserSelectTasks.value?.length > 0) {
170-
// detailForm.value.rule.push({
171-
// type: 'startUserSelect',
172-
// props: {
173-
// title: '指定审批人'
174-
// }
175-
// })
176-
// // 设置校验规则
177-
// for (const userTask of startUserSelectTasks.value) {
178-
// startUserSelectAssignees.value[userTask.id] = []
179-
// startUserSelectAssigneesFormRules.value[userTask.id] = [
180-
// { required: true, message: '请选择审批人', trigger: 'blur' }
181-
// ]
182-
// }
183-
// // 加载用户列表
184-
// userList.value = await UserApi.getSimpleUserList()
185-
// }
132+
if (startUserSelectTasks.value?.length > 0) {
133+
for (const userTask of startUserSelectTasks.value) {
134+
// 初始化数据
135+
startUserSelectAssignees.value[userTask.id] = []
136+
}
137+
}
186138
}
187139
// 情况二:业务表单
188140
} else if (row.formCustomCreatePath) {
@@ -206,19 +158,23 @@ const getApprovalDetail = async (row: any) => {
206158
}
207159
// 获取审批节点,显示 Timeline 的数据
208160
activityNodes.value = data.activityNodes
209-
activityNodes.value = aN
210161
} finally {
211162
}
212163
}
213164
/** 提交按钮 */
214165
const submitForm = async (formData: any) => {
215-
debugger
216166
if (!fApi.value || !props.selectProcessDefinition) {
217167
return
218168
}
219169
// 如果有指定审批人,需要校验
220170
if (startUserSelectTasks.value?.length > 0) {
221-
await startUserSelectAssigneesFormRef.value.validate()
171+
for (const userTask of startUserSelectTasks.value) {
172+
if (
173+
Array.isArray(startUserSelectAssignees.value[userTask.id]) &&
174+
startUserSelectAssignees.value[userTask.id].length === 0
175+
)
176+
return message.warning(`请选择${userTask.name}的审批人`)
177+
}
222178
}
223179
224180
// 提交请求
@@ -245,6 +201,10 @@ const handleCancel = () => {
245201
emit('cancel')
246202
}
247203
204+
const selectUserConfirm = (id, userList) => {
205+
startUserSelectAssignees.value[id] = userList?.map((item) => item.id)
206+
}
207+
248208
defineExpose({ initProcessInfo })
249209
</script>
250210

src/views/bpm/processInstance/create/mock.ts

Lines changed: 0 additions & 86 deletions
This file was deleted.

src/views/bpm/processInstance/detail/ProcessInstanceTimeline.vue

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,29 @@
3838
</div>
3939
<!-- 需要自定义选择审批人 -->
4040
<div
41-
v-if="startUserSelectTasks?.length > 0 && activity.nodeType === NodeType.USER_TASK_NODE"
41+
class="flex flex-wrap gap2 items-center"
42+
v-if="
43+
startUserSelectTasks?.length > 0 && Array.isArray(startUserSelectAssignees[activity.id])
44+
"
4245
>
43-
<el-button class="!px-8px" @click="handleSelectUser">
46+
<!-- && activity.nodeType === NodeType.USER_TASK_NODE -->
47+
<el-button
48+
class="!px-8px"
49+
@click="handleSelectUser(activity.id, customApprover[activity.id])"
50+
>
4451
<Icon icon="fa:user-plus" />
4552
</el-button>
53+
<div
54+
v-for="(user, idx1) in customApprover[activity.id]"
55+
:key="idx1"
56+
class="bg-gray-100 h-35px rounded-3xl flex items-center p-8px gap-2 dark:color-gray-600 position-relative"
57+
>
58+
<el-avatar :size="28" v-if="user.avatar" :src="user.avatar" />
59+
<el-avatar :size="28" v-else>
60+
{{ user.nickname.substring(0, 1) }}
61+
</el-avatar>
62+
{{ user.nickname }}
63+
</div>
4664
</div>
4765
<div v-else class="flex items-center flex-wrap mt-1 gap2">
4866
<!-- 情况一:遍历每个审批节点下的【进行中】task 任务 -->
@@ -152,10 +170,12 @@ withDefaults(
152170
activityNodes: ProcessInstanceApi.ApprovalNodeInfo[] // 审批节点信息
153171
showStatusIcon?: boolean // 是否显示头像右下角状态图标
154172
startUserSelectTasks?: any[] // 发起人需要选择审批人的用户任务列表
173+
startUserSelectAssignees?: any // 发起人选择审批人的数据
155174
}>(),
156175
{
157176
showStatusIcon: true, // 默认值为 true
158-
startUserSelectTasks: () => [] // 默认值为空数组
177+
startUserSelectTasks: () => [], // 默认值为空数组
178+
startUserSelectAssignees: () => {}
159179
}
160180
)
161181
@@ -256,11 +276,16 @@ const getApprovalNodeTime = (node: ProcessInstanceApi.ApprovalNodeInfo) => {
256276
257277
// 选择自定义审批人
258278
const userSelectFormRef = ref()
259-
const handleSelectUser = () => {
260-
userSelectFormRef.value.open()
279+
const handleSelectUser = (activityId, selectedList) => {
280+
userSelectFormRef.value.open(activityId, selectedList)
261281
}
282+
const emit = defineEmits<{
283+
selectUserConfirm: [id: any, userList: any[]]
284+
}>()
285+
const customApprover: any = ref({})
262286
// 选择完成
263-
const handleUserSelectConfirm = (userList) => {
264-
console.log('[ userList ] >', userList)
287+
const handleUserSelectConfirm = (activityId, userList) => {
288+
customApprover.value[activityId] = userList || []
289+
emit('selectUserConfirm', activityId, userList)
265290
}
266291
</script>

0 commit comments

Comments
 (0)