招标文件修改

This commit is contained in:
吴红兵
2026-03-15 17:29:31 +08:00
parent 74596fd81f
commit 9b60b7f29c

View File

@@ -202,13 +202,28 @@
<!-- 指定一人 --> <!-- 指定一人 -->
<el-form-item v-if="representorSelectMode === 'designate'" label="选择参与人"> <el-form-item v-if="representorSelectMode === 'designate'" label="选择参与人">
<el-select v-model="selectedRepresentor" placeholder="请选择参与人" filterable :disabled="isViewMode" style="width: 300px"> <el-select
v-model="selectedRepresentor"
placeholder="请输入姓名或工号搜索"
filterable
remote
clearable
reserve-keyword
:remote-method="searchRepresentor"
:loading="representorLoading"
:disabled="isViewMode"
style="width: 400px"
@change="onRepresentorChange"
>
<el-option <el-option
v-for="member in deptMembers" v-for="item in representorOptions"
:key="member.teacherNo" :key="item.teacherNo"
:label="`${member.realName} (${member.teacherNo})`" :label="(item.commonDeptName ? item.commonDeptName + ' - ' : '') + (item.realName || item.name) + ' (' + item.teacherNo + ')'"
:value="member.teacherNo" :value="item.teacherNo"
/> >
<span>{{ item.commonDeptName ? item.commonDeptName + ' - ' : '' }}{{ item.realName || item.name }}</span>
<span style="color: #999; font-size: 12px; margin-left: 8px">{{ item.teacherNo }}</span>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -216,18 +231,27 @@
<el-form-item v-if="representorSelectMode === 'random'" label="选择候选人"> <el-form-item v-if="representorSelectMode === 'random'" label="选择候选人">
<el-select <el-select
v-model="randomCandidates" v-model="randomCandidates"
placeholder="请选择参与随机抽取的人员(可多选)" placeholder="请输入姓名或工号搜索并选择参与随机抽取的人员(可多选)"
multiple multiple
filterable filterable
remote
clearable
reserve-keyword
:remote-method="searchCandidates"
:loading="candidatesLoading"
:disabled="isViewMode" :disabled="isViewMode"
style="width: 400px" style="width: 400px"
@change="onCandidatesChange"
> >
<el-option <el-option
v-for="member in deptMembers" v-for="item in candidatesOptions"
:key="member.teacherNo" :key="item.teacherNo"
:label="`${member.realName} (${member.teacherNo})`" :label="(item.commonDeptName ? item.commonDeptName + ' - ' : '') + (item.realName || item.name) + ' (' + item.teacherNo + ')'"
:value="member.teacherNo" :value="item.teacherNo"
/> >
<span>{{ item.commonDeptName ? item.commonDeptName + ' - ' : '' }}{{ item.realName || item.name }}</span>
<span style="color: #999; font-size: 12px; margin-left: 8px">{{ item.teacherNo }}</span>
</el-option>
</el-select> </el-select>
<el-button <el-button
type="primary" type="primary"
@@ -283,7 +307,7 @@ import {
} from '/@/api/purchase/bidfile'; } from '/@/api/purchase/bidfile';
import { getRequirementFiles } from '/@/api/purchase/purchasingfiles'; import { getRequirementFiles } from '/@/api/purchase/purchasingfiles';
import { currElTabIsSave } from '/@/api/order/order-key-vue'; import { currElTabIsSave } from '/@/api/order/order-key-vue';
import { getDeptMembers, randomSelectRepresentor } from '/@/api/purchase/purchasingrequisition'; import { searchTeachers, randomSelectRepresentor } from '/@/api/purchase/purchasingrequisition';
// ==================== Props & Emits ==================== // ==================== Props & Emits ====================
@@ -407,9 +431,11 @@ const flowTarget = ref<string>('');
// 部门参与人选择相关(部门负责人审核时使用) // 部门参与人选择相关(部门负责人审核时使用)
const representorSelectMode = ref<'designate' | 'random'>('designate'); const representorSelectMode = ref<'designate' | 'random'>('designate');
const deptMembers = ref<any[]>([]); const representorOptions = ref<any[]>([]);
const deptMembersLoading = ref(false); const representorLoading = ref(false);
const selectedRepresentor = ref<string>(''); const selectedRepresentor = ref<string>('');
const candidatesOptions = ref<any[]>([]);
const candidatesLoading = ref(false);
const randomCandidates = ref<string[]>([]); const randomCandidates = ref<string[]>([]);
const currentRepresentor = ref<any>(null); const currentRepresentor = ref<any>(null);
const representorType = ref<string>('purchase_rep'); const representorType = ref<string>('purchase_rep');
@@ -698,19 +724,59 @@ const registerFlowCallbacks = () => {
// ==================== 部门参与人选择 ==================== // ==================== 部门参与人选择 ====================
const loadDeptMembers = async () => { const searchRepresentor = async (query: string) => {
if (!showRepresentorSection.value) return; if (!query) {
representorOptions.value = [];
return;
}
representorLoading.value = true;
try { try {
deptMembersLoading.value = true; const res = await searchTeachers(query);
const res = await getDeptMembers(); representorOptions.value = res?.data || [];
if (res.code === 0 && res.data) { } catch (_) {
deptMembers.value = res.data; representorOptions.value = [];
}
} catch (e: any) {
ElMessage.error(e?.msg || '加载部门人员失败');
} finally { } 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<string, any>();
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) { if (isAgent.value) {
await loadRequirementFiles(); await loadRequirementFiles();
} }
if (showRepresentorSection.value) {
await loadDeptMembers();
}
registerFlowCallbacks(); registerFlowCallbacks();
}); });
@@ -759,9 +822,6 @@ watch(
if (isAgent.value) { if (isAgent.value) {
await loadRequirementFiles(); await loadRequirementFiles();
} }
if (showRepresentorSection.value) {
await loadDeptMembers();
}
registerFlowCallbacks(); registerFlowCallbacks();
} }
}, },