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