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(); } },