From e462eeaa09dc2339e466469afd34838ff3e7fb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E5=BA=86=E6=B3=B0?= <12369755+htcloud1@user.noreply.gitee.com> Date: Thu, 20 Aug 2026 22:31:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(projects):=20=E6=9C=8D=E5=8A=A1=E6=9C=BA?= =?UTF-8?q?=E6=9E=84=E7=AD=9B=E9=80=89=E6=94=B9=E5=A4=9A=E9=80=89=20remote?= =?UTF-8?q?=20el-select=20(=E5=89=8D=E7=AB=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 服务机构 el-input → 多选 remote el-select (跟 sponsor 镜像) - q.execOrgName → q.execAdminUserIds (List) - 新增 executorOrgOptions / execSearching / _executorFilterTimer - 新增 searchExecutorOrgsForFilter (200ms debounce + 已选 userId 重拉回保证 label) --- ry-vue3/src/views/manager/Projects.vue | 53 ++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/ry-vue3/src/views/manager/Projects.vue b/ry-vue3/src/views/manager/Projects.vue index ece7eda..c44ff5c 100644 --- a/ry-vue3/src/views/manager/Projects.vue +++ b/ry-vue3/src/views/manager/Projects.vue @@ -20,7 +20,23 @@ - + + + + + @@ -304,7 +320,7 @@ const userStore = useUserStore() const router = useRouter() const route = useRoute() -const q = ref({ sponsorAdminUserIds: [], execOrgName: '', projectNo: '', projectName: '', projectForm: '', startTime: '', endTime: '', isFinished: '', isSettled: '', managerScore: '' }) +const q = ref({ sponsorAdminUserIds: [], execAdminUserIds: [], projectNo: '', projectName: '', projectForm: '', startTime: '', endTime: '', isFinished: '', isSettled: '', managerScore: '' }) const rows = ref([]) const loading = ref(false) const page = reactive({ pageNum: 1, pageSize: 10, total: 0 }) @@ -354,7 +370,7 @@ async function doDelete(row) { } } -function reset() { q.value = { sponsorAdminUserIds:[], execOrgName:'', projectNo:'', projectName:'', projectForm:'', startTime:'', endTime:'', isFinished:'', isSettled:'', managerScore:'' }; page.pageNum = 1; load() } +function reset() { q.value = { sponsorAdminUserIds:[], execAdminUserIds:[], projectNo:'', projectName:'', projectForm:'', startTime:'', endTime:'', isFinished:'', isSettled:'', managerScore:'' }; page.pageNum = 1; load() } // 导出 function exportProjects() { ElMessage.info('导出项目功能开发中') } @@ -646,6 +662,10 @@ const sponsorOrgOptions = ref([]) const sponsorSearching = ref(false) let _supporterTimer = null let _supporterFilterTimer = null +// 顶部筛选区专用: 与 assignForm.row._options 隔离 (row 级是每行一个 _options) +const executorOrgOptions = ref([]) +const execSearching = ref(false) +let _executorFilterTimer = null // 已分配场次合计 (实时) @@ -747,6 +767,33 @@ function searchSponsorOrgsForFilter(query) { }, 200) } +// 顶部筛选区远程搜索 (服务机构多选 el-select, 加 loading + 已选项重拉回) +function searchExecutorOrgsForFilter(query) { + if (_executorFilterTimer) clearTimeout(_executorFilterTimer) + execSearching.value = true + _executorFilterTimer = setTimeout(async () => { + try { + const params = {} + if (query) params.orgName = query + const r = await listExecutorOrgs(params) + executorOrgOptions.value = r.data || [] + // 已选项不在结果里时按 userId 单独拉回 (multi-select 必须保证每个已选 tag 都有 label) + const ids = q.value.execAdminUserIds || [] + for (const uid of ids) { + if (!executorOrgOptions.value.find(u => u.userId === uid)) { + const r2 = await listExecutorOrgs({ userId: uid }) + const sel = (r2.data || []).find(u => u.userId === uid) + if (sel) executorOrgOptions.value = [sel, ...executorOrgOptions.value] + } + } + } catch (e) { + executorOrgOptions.value = [] + } finally { + execSearching.value = false + } + }, 200) +} + // 选中支持方后回填 user_name (缓存到 biz_project.sponsor_admin_user_name) function onSponsorOrgPick(userId) { const u = sponsorOrgOptions.value.find(x => x.userId === userId)