From 9b60b7f29cd78eef58dee03f265828f08d5b2726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E7=BA=A2=E5=85=B5?= <374362909@qq.com> Date: Sun, 15 Mar 2026 17:29:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=9B=E6=A0=87=E6=96=87=E4=BB=B6=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purchasingrequisition/bidfile-audit.vue | 124 +++++++++++++----- 1 file changed, 92 insertions(+), 32 deletions(-) diff --git a/src/views/purchase/purchasingrequisition/bidfile-audit.vue b/src/views/purchase/purchasingrequisition/bidfile-audit.vue index 6bbee4a..e43a639 100644 --- a/src/views/purchase/purchasingrequisition/bidfile-audit.vue +++ b/src/views/purchase/purchasingrequisition/bidfile-audit.vue @@ -202,13 +202,28 @@ - + + v-for="item in representorOptions" + :key="item.teacherNo" + :label="(item.commonDeptName ? item.commonDeptName + ' - ' : '') + (item.realName || item.name) + ' (' + item.teacherNo + ')'" + :value="item.teacherNo" + > + {{ item.commonDeptName ? item.commonDeptName + ' - ' : '' }}{{ item.realName || item.name }} + {{ item.teacherNo }} + @@ -216,18 +231,27 @@ + v-for="item in candidatesOptions" + :key="item.teacherNo" + :label="(item.commonDeptName ? item.commonDeptName + ' - ' : '') + (item.realName || item.name) + ' (' + item.teacherNo + ')'" + :value="item.teacherNo" + > + {{ item.commonDeptName ? item.commonDeptName + ' - ' : '' }}{{ item.realName || item.name }} + {{ item.teacherNo }} + (''); // 部门参与人选择相关(部门负责人审核时使用) const representorSelectMode = ref<'designate' | 'random'>('designate'); -const deptMembers = ref([]); -const deptMembersLoading = ref(false); +const representorOptions = ref([]); +const representorLoading = ref(false); const selectedRepresentor = ref(''); +const candidatesOptions = ref([]); +const candidatesLoading = ref(false); const randomCandidates = ref([]); const currentRepresentor = ref(null); const representorType = ref('purchase_rep'); @@ -698,19 +724,59 @@ const registerFlowCallbacks = () => { // ==================== 部门参与人选择 ==================== -const loadDeptMembers = async () => { - if (!showRepresentorSection.value) return; - +const searchRepresentor = async (query: string) => { + if (!query) { + representorOptions.value = []; + return; + } + representorLoading.value = true; try { - deptMembersLoading.value = true; - const res = await getDeptMembers(); - if (res.code === 0 && res.data) { - deptMembers.value = res.data; - } - } catch (e: any) { - ElMessage.error(e?.msg || '加载部门人员失败'); + const res = await searchTeachers(query); + representorOptions.value = res?.data || []; + } catch (_) { + representorOptions.value = []; } finally { - deptMembersLoading.value = false; + representorLoading.value = false; + } +}; + +const onRepresentorChange = (teacherNo: string) => { + if (!teacherNo) { + selectedRepresentor.value = ''; + } +}; + +const searchCandidates = async (query: string) => { + if (!query) { + candidatesOptions.value = []; + return; + } + candidatesLoading.value = true; + try { + const res = await searchTeachers(query); + candidatesOptions.value = res?.data || []; + } catch (_) { + candidatesOptions.value = []; + } finally { + candidatesLoading.value = false; + } +}; + +const onCandidatesChange = (teacherNos: string[]) => { + // 保留已选中的选项,防止清空搜索时选项丢失 + const selectedMap = new Map(); + randomCandidates.value.forEach((no) => { + const existing = candidatesOptions.value.find((item) => item.teacherNo === no); + if (existing) { + selectedMap.set(no, existing); + } + }); + // 如果新选中的选项中有不在当前选项列表中的,需要从之前的结果中找 + if (teacherNos.length > 0 && currentRepresentor.value) { + const currentNo = currentRepresentor.value.teacherNo; + if (teacherNos.includes(currentNo)) { + selectedMap.set(currentNo, currentRepresentor.value); + } } }; @@ -744,9 +810,6 @@ onMounted(async () => { if (isAgent.value) { await loadRequirementFiles(); } - if (showRepresentorSection.value) { - await loadDeptMembers(); - } registerFlowCallbacks(); }); @@ -759,9 +822,6 @@ watch( if (isAgent.value) { await loadRequirementFiles(); } - if (showRepresentorSection.value) { - await loadDeptMembers(); - } registerFlowCallbacks(); } },