Merge branch 'developer'

This commit is contained in:
吴红兵
2026-03-09 00:43:58 +08:00
5 changed files with 283 additions and 48 deletions

View File

@@ -252,6 +252,19 @@ export function saveRepresentor(id: number, representorTeacherNo?: string, repre
}); });
} }
/**
* 随机抽取部门参与人
* @param applyId 采购申请ID
* @param memberTeacherNos 参与随机抽取的人员工号列表(逗号分隔)
*/
export function randomSelectRepresentor(applyId: string, memberTeacherNos: string) {
return request({
url: '/purchase/purchasingapply/randomSelectRepresentor',
method: 'post',
data: { applyId, memberTeacherNos },
});
}
/** /**
* 文件归档按文件类型打包下载该申请单下所有附件的下载地址GET 请求,浏览器直接下载 zip * 文件归档按文件类型打包下载该申请单下所有附件的下载地址GET 请求,浏览器直接下载 zip
* @param purchaseId 采购申请ID * @param purchaseId 采购申请ID

View File

@@ -9,8 +9,8 @@
</div> </div>
</template> </template>
<el-row :gutter="16"> <el-row :gutter="24">
<el-col :span="8"> <el-col :span="16">
<el-card shadow="never" class="info-card"> <el-card shadow="never" class="info-card">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
@@ -38,11 +38,19 @@
<span class="card-title">招标文件</span> <span class="card-title">招标文件</span>
</div> </div>
</template> </template>
<el-table :data="docList" border stripe size="small" v-if="docList.length > 0" max-height="300"> <el-table :data="docList" border stripe size="small" v-if="docList.length > 0" max-height="300">
<el-table-column type="index" label="序号" width="50" /> <!-- <el-table-column type="index" label="序号" width="50" />-->
<el-table-column prop="version" label="版本" width="60" align="center">
<template #default="scope">
<el-tag v-if="scope.row.isCurrent === '1'" type="success" size="small">{{ scope.row.version || '-' }}</el-tag>
<span v-else>{{ scope.row.version || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="fileName" label="文件名称" show-overflow-tooltip /> <el-table-column prop="fileName" label="文件名称" show-overflow-tooltip />
<el-table-column prop="createTime" label="上传时间" width="160" /> <el-table-column prop="uploadUserName" label="上传" width="100" />
<el-table-column label="操作" width="120" align="center"> <el-table-column prop="createTime" label="上传时间" width="150" />
<el-table-column prop="comment" label="批注" width="150" show-overflow-tooltip />
<el-table-column label="操作" width="120" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link size="small" icon="View" @click="handlePreview(scope.row)">预览</el-button> <el-button type="primary" link size="small" icon="View" @click="handlePreview(scope.row)">预览</el-button>
<el-button type="success" link size="small" icon="Download" @click="handleDownload(scope.row)">下载</el-button> <el-button type="success" link size="small" icon="Download" @click="handleDownload(scope.row)">下载</el-button>
@@ -53,7 +61,7 @@
</el-card> </el-card>
</el-col> </el-col>
<el-col :span="16"> <el-col :span="8">
<el-card shadow="never" class="flow-card"> <el-card shadow="never" class="flow-card">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
@@ -85,6 +93,7 @@ import { ref, computed } from 'vue';
import { DocumentChecked } from '@element-plus/icons-vue'; import { DocumentChecked } from '@element-plus/icons-vue';
import { useMessage } from '/@/hooks/message'; import { useMessage } from '/@/hooks/message';
import { getObj, getDocList, previewFileById, downloadFileById } from '/@/api/purchase/purchasingrequisition'; import { getObj, getDocList, previewFileById, downloadFileById } from '/@/api/purchase/purchasingrequisition';
import { getFlowPurchaseDetail } from '/@/api/purchase/bidfile';
const FlowCommentTimeline = defineAsyncComponent(() => import('/@/views/jsonflow/comment/timeline.vue')); const FlowCommentTimeline = defineAsyncComponent(() => import('/@/views/jsonflow/comment/timeline.vue'));
@@ -93,6 +102,10 @@ interface DocItem {
fileName: string; fileName: string;
fileUrl: string; fileUrl: string;
createTime?: string; createTime?: string;
version?: string;
isCurrent?: string;
uploadUserName?: string;
comment?: string;
} }
const visible = ref(false); const visible = ref(false);
@@ -117,10 +130,14 @@ const open = async (id: string, row?: any) => {
docList.value = []; docList.value = [];
applyData.value = row || {}; applyData.value = row || {};
if (!row || !row.fileFlowInstId) { // 使用专门的招标文件审批详情接口获取数据,确保包含 agentName
if (!row || !row.fileFlowInstId || !row.agentName) {
try { try {
const res = await getObj(id); const res = await getFlowPurchaseDetail(id);
applyData.value = res?.data || {}; if (res?.code === 0 && res?.data) {
// 合并数据,确保 agentName 等字段正确返回
applyData.value = { ...applyData.value, ...res.data };
}
} catch (e) { } catch (e) {
console.error('获取采购申请详情失败', e); console.error('获取采购申请详情失败', e);
useMessage().error('获取采购申请详情失败'); useMessage().error('获取采购申请详情失败');
@@ -134,11 +151,15 @@ const open = async (id: string, row?: any) => {
const docsRes = await getDocList(applyData.value.id); const docsRes = await getDocList(applyData.value.id);
const docs = docsRes?.data || []; const docs = docsRes?.data || [];
if (Array.isArray(docs) && docs.length > 0) { if (Array.isArray(docs) && docs.length > 0) {
docList.value = docs.map((d: any) => ({ docList.value = docs.map((d: any) => ({
id: d.id || d.fileId, id: d.id || d.fileId,
fileName: d.fileName || d.fileTitle || '招标文件', fileName: d.fileName || d.fileTitle || '招标文件',
fileUrl: d.fileUrl, fileUrl: d.fileUrl,
createTime: d.createTime, createTime: d.createTime,
version: d.version,
isCurrent: d.isCurrent,
uploadUserName: d.uploadUserName,
comment: d.comment,
})); }));
} }
} catch (e) { } catch (e) {

View File

@@ -11,9 +11,9 @@
</div> </div>
</template> </template>
<div v-loading="loading" style="padding-bottom: 20px"> <div v-loading="loading" style="padding-bottom: 20px">
<div class="form-toolbar mb12" style="text-align: right"> <!-- <div class="form-toolbar mb12" style="text-align: right">-->
<el-button type="primary" link icon="QuestionFilled" @click="helpDialogVisible = true"> 帮助 </el-button> <!-- <el-button type="primary" link icon="QuestionFilled" @click="helpDialogVisible = true"> 帮助 </el-button>-->
</div> <!-- </div>-->
<el-form <el-form
ref="formRef" ref="formRef"
:model="dataForm" :model="dataForm"
@@ -375,8 +375,8 @@ upload-file-url="/purchase/purchasingfiles/upload"
<div class="step-title mb12">学校统一采购</div> <div class="step-title mb12">学校统一采购</div>
<el-row :gutter="16"> <el-row :gutter="16">
<el-col :span="8" class="mb12"> <el-col :span="8" class="mb12">
<el-form-item label="采购形式" prop="purchaseMode" :required="isPurchaseModeRequired"> <el-form-item label="组织采购形式" prop="purchaseSchool" :required="isPurchaseSchoolRequired">
<el-radio-group v-model="dataForm.purchaseMode" :disabled="schoolUnifiedPurchaseFormDisabled"> <el-radio-group v-model="dataForm.purchaseSchool" :disabled="schoolUnifiedPurchaseFormDisabled">
<el-radio v-for="item in purchaseModeSchoolList" :key="item.value" :label="item.value"> <el-radio v-for="item in purchaseModeSchoolList" :key="item.value" :label="item.value">
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
@@ -841,7 +841,7 @@ upload-file-url="/purchase/purchasingfiles/upload"
</template> </template>
<template v-else> <template v-else>
<el-button v-if="!isFlowEmbed" @click="handleCancel">取消</el-button> <el-button v-if="!isFlowEmbed" @click="handleCancel">取消</el-button>
<el-button v-if="!flowSubmitDisabled" type="warning" @click="handleTempStore" :disabled="loading"> 暂存 </el-button> <el-button v-if="!isFlowEmbed && !flowSubmitDisabled" type="warning" @click="handleTempStore" :disabled="loading"> 暂存 </el-button>
<!-- <el-button --> <!-- <el-button -->
<!-- type="primary" --> <!-- type="primary" -->
<!-- @click="handleSubmit" --> <!-- @click="handleSubmit" -->
@@ -963,6 +963,7 @@ const dataForm = reactive({
isSpecial: '', isSpecial: '',
hasAssets: '0', hasAssets: '0',
purchaseMode: '', purchaseMode: '',
purchaseSchool:'',
purchaseType: '', purchaseType: '',
purchaseTypeUnion: '', purchaseTypeUnion: '',
purchaseChannel: '', purchaseChannel: '',
@@ -1199,8 +1200,8 @@ const isPurchaseTypeUnionRequired = computed(() => {
return false; return false;
}); });
// 学校统一采购 - 采购形式是否必填 // 学校统一采购 - 组织采购形式是否必填
const isPurchaseModeRequired = computed(() => { const isPurchaseSchoolRequired = computed(() => {
// 审核阶段:采购中心必填 // 审核阶段:采购中心必填
if (isFlowEmbed.value && isPurchaseCenter.value) { if (isFlowEmbed.value && isPurchaseCenter.value) {
return true; return true;
@@ -1231,20 +1232,7 @@ const showPurchaseDetailBlocks = computed(() => {
return !!isViewMode.value || !!isFlowEmbed.value || !!dataForm.id || isPurchaseTypeDetermined.value; return !!isViewMode.value || !!isFlowEmbed.value || !!dataForm.id || isPurchaseTypeDetermined.value;
}); });
// 学校统一采购时采购形式默认值(不由用户选择):>=100万→政府采购('1')5万~100万且集采=否→学校自主('2')5万~100万且集采=政府集中采购→政府采购('1')5万~100万且集采=学校集中采购→学校自主('2') // 学校统一采购时组织采购形式是否禁用
const schoolUnifiedPurchaseFormDefault = computed(() => {
if (isDeptPurchase.value || dataForm.budget == null) return null;
const budget = Number(dataForm.budget);
if (budget >= BUDGET_GOV_PURCHASE_THRESHOLD.value) return '1'; // 政府采购
if (budget >= BUDGET_DEPT_PURCHASE_THRESHOLD.value && budget < BUDGET_GOV_PURCHASE_THRESHOLD.value) {
if (dataForm.isCentralized === '0') return '2'; // 集采=否 → 学校自主采购
if (dataForm.isCentralized === '1') return '1'; // 政府集中采购 → 政府采购
if (dataForm.isCentralized === '2') return '2'; // 学校集中采购 → 学校自主采购
}
return null;
});
// 学校统一采购时采购形式是否禁用
// 申请阶段:始终可选(根据默认值自动选中后,允许用户自行修改) // 申请阶段:始终可选(根据默认值自动选中后,允许用户自行修改)
// 流程嵌入:采购中心节点可编辑,其他节点只读 // 流程嵌入:采购中心节点可编辑,其他节点只读
const schoolUnifiedPurchaseFormDisabled = computed(() => { const schoolUnifiedPurchaseFormDisabled = computed(() => {
@@ -1587,15 +1575,11 @@ watch(
{ immediate: true } { immediate: true }
); );
// 学校统一采购:采购形式由规则默认选择,随预算与集采变化自动更新 // 学校统一采购:组织采购形式由规则默认选择,随预算与集采变化自动更新
watch( watch(
[() => schoolUnifiedPurchaseFormDefault.value, () => isDeptPurchase.value], [ () => isDeptPurchase.value],
() => { () => {
if (isDeptPurchase.value) return; if (isDeptPurchase.value) return;
const def = schoolUnifiedPurchaseFormDefault.value;
if (def != null && dataForm.purchaseMode !== def) {
dataForm.purchaseMode = def;
}
}, },
{ immediate: true } { immediate: true }
); );
@@ -1745,12 +1729,12 @@ const dataRules = reactive({
}, },
], ],
// 学校统一采购 + 采购中心审核:采购形式必填 // 学校统一采购 + 采购中心审核:采购形式必填
purchaseMode: [ purchaseSchool: [
{ {
validator: (_rule: any, value: string, callback: (e?: Error) => void) => { validator: (_rule: any, value: string, callback: (e?: Error) => void) => {
if (!isDeptPurchase.value && isFlowEmbed.value && isPurchaseCenter.value) { if (!isDeptPurchase.value && isFlowEmbed.value && isPurchaseCenter.value) {
if (!value || String(value).trim() === '') { if (!value || String(value).trim() === '') {
callback(new Error('请选择采购形式')); callback(new Error('请选择组织采购形式'));
return; return;
} }
} }
@@ -1877,6 +1861,7 @@ async function loadDetail(applyId: string | number) {
isCentralized: detail.isCentralized != null ? String(detail.isCentralized) : '', isCentralized: detail.isCentralized != null ? String(detail.isCentralized) : '',
isSpecial: detail.isSpecial != null ? String(detail.isSpecial) : '', isSpecial: detail.isSpecial != null ? String(detail.isSpecial) : '',
purchaseMode: detail.purchaseMode != null ? String(detail.purchaseMode) : '', purchaseMode: detail.purchaseMode != null ? String(detail.purchaseMode) : '',
purchaseSchool: detail.purchaseSchool != null ? String(detail.purchaseSchool) : '',
purchaseType: purchaseType:
detail.purchaseType === DEPT_PURCHASE_TYPE.ENTRUST_CENTER detail.purchaseType === DEPT_PURCHASE_TYPE.ENTRUST_CENTER
? '' ? ''

View File

@@ -208,13 +208,109 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<!-- 部门参与人选择部门负责人审核时显示 -->
<el-card v-if="showRepresentorSection" shadow="never" class="representor-card">
<template #header>
<div class="card-header">
<span class="card-title">
<el-icon><User /></el-icon>
部门参与人
</span>
<el-tag v-if="applyData.representorTeacherNo" type="success">已设置</el-tag>
<el-tag v-else type="warning">待设置</el-tag>
</div>
</template>
<el-form label-width="120px">
<el-form-item label="选择方式">
<el-radio-group v-model="representorSelectMode" :disabled="isViewMode">
<el-radio label="designate">指定一人</el-radio>
<el-radio label="random">随机抽取</el-radio>
</el-radio-group>
</el-form-item>
<!-- 指定一人 -->
<el-form-item v-if="representorSelectMode === 'designate'" label="选择参与人">
<el-select
v-model="selectedRepresentor"
placeholder="请选择参与人"
filterable
:disabled="isViewMode"
style="width: 300px"
>
<el-option
v-for="member in deptMembers"
:key="member.teacherNo"
:label="`${member.realName} (${member.teacherNo})`"
:value="member.teacherNo"
/>
</el-select>
</el-form-item>
<!-- 随机抽取 -->
<el-form-item v-if="representorSelectMode === 'random'" label="选择候选人">
<el-select
v-model="randomCandidates"
placeholder="请选择参与随机抽取的人员(可多选)"
multiple
filterable
:disabled="isViewMode"
style="width: 400px"
>
<el-option
v-for="member in deptMembers"
:key="member.teacherNo"
:label="`${member.realName} (${member.teacherNo})`"
:value="member.teacherNo"
/>
</el-select>
<el-button
type="primary"
:loading="randomSelectLoading"
:disabled="randomCandidates.length < 2 || isViewMode"
style="margin-left: 12px"
@click="handleRandomSelect"
>
随机抽取
</el-button>
</el-form-item>
<!-- 已选中的参与人 -->
<el-form-item v-if="currentRepresentor" label="已选中参与人">
<el-tag type="success" size="large">
{{ currentRepresentor.realName }} ({{ currentRepresentor.teacherNo }})
</el-tag>
</el-form-item>
<!-- 参与人身份 -->
<el-form-item label="参与人身份" required>
<el-radio-group v-model="representorType" :disabled="isViewMode">
<el-radio label="purchase_rep">采购代表</el-radio>
<el-radio label="judge">评委</el-radio>
</el-radio-group>
</el-form-item>
<!-- 保存按钮 -->
<el-form-item>
<el-button
type="primary"
:loading="saveRepresentorLoading"
:disabled="!canSaveRepresentor || isViewMode"
@click="handleSaveRepresentor"
>
保存参与人信息
</el-button>
</el-form-item>
</el-form>
</el-card>
</div> </div>
</template> </template>
<script setup lang="ts" name="BidFileAudit"> <script setup lang="ts" name="BidFileAudit">
import { ref, reactive, computed, onMounted, watch } from 'vue'; import { ref, reactive, computed, onMounted, watch } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import { Document, FolderOpened, Upload, Link, Guide } from '@element-plus/icons-vue'; import { Document, FolderOpened, Upload, Link, Guide, User } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { Session } from '/@/utils/storage'; import { Session } from '/@/utils/storage';
import { useUserInfo } from '/@/stores/userInfo'; import { useUserInfo } from '/@/stores/userInfo';
@@ -232,6 +328,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, saveRepresentor, randomSelectRepresentor } from '/@/api/purchase/purchasingrequisition';
// ==================== Props & Emits ==================== // ==================== Props & Emits ====================
@@ -252,7 +349,8 @@ const currentUserRoleCodes = computed(() => userStore.userInfos.roleCodes || [])
const ROLE_LABEL_MAP: Record<string, string> = { const ROLE_LABEL_MAP: Record<string, string> = {
PURCHASE_AGENT: '招标代理', PURCHASE_AGENT: '招标代理',
PURCHASE_ASSET: '资产管理处', PURCHASE_ASSET: '资产管理处',
PURCHASE_DEPT_APPLY: '部门负责人', PURCHASE_DEPT_APPLY: '部门经办人',
PURCHASE_DEPT_AUDIT: '部门负责人',
PURCHASE_FILE_AUDIT: '内审部门', PURCHASE_FILE_AUDIT: '内审部门',
PURCHASE_CENTER: '采购中心', PURCHASE_CENTER: '采购中心',
}; };
@@ -295,6 +393,7 @@ const isViewMode = computed(() => {
const isAgent = computed(() => currentUserRoleCodes.value.includes('PURCHASE_AGENT')); const isAgent = computed(() => currentUserRoleCodes.value.includes('PURCHASE_AGENT'));
const isAsset = computed(() => currentUserRoleCodes.value.includes('PURCHASE_ASSET')); const isAsset = computed(() => currentUserRoleCodes.value.includes('PURCHASE_ASSET'));
const isDeptApply = computed(() => currentUserRoleCodes.value.includes('PURCHASE_DEPT_APPLY')); const isDeptApply = computed(() => currentUserRoleCodes.value.includes('PURCHASE_DEPT_APPLY'));
const isDeptAudit = computed(() => currentUserRoleCodes.value.includes('PURCHASE_DEPT_AUDIT'));
const isFileAudit = computed(() => currentUserRoleCodes.value.includes('PURCHASE_FILE_AUDIT')); const isFileAudit = computed(() => currentUserRoleCodes.value.includes('PURCHASE_FILE_AUDIT'));
// 是否显示上传区域 // 是否显示上传区域
@@ -311,6 +410,12 @@ const showFlowTargetSection = computed(() => {
return isAsset.value && isFlowEmbed.value; return isAsset.value && isFlowEmbed.value;
}); });
// 是否显示部门参与人选择区域(仅部门负责人在审核时显示)
const showRepresentorSection = computed(() => {
if (isViewMode.value) return false;
return isDeptAudit.value && isFlowEmbed.value;
});
// 采购申请数据 // 采购申请数据
const applyData = ref<any>({}); const applyData = ref<any>({});
const purchaseTypeLabel = computed(() => { const purchaseTypeLabel = computed(() => {
@@ -351,6 +456,24 @@ const uploadRules = {
// 流转去向(资产管理处审核时使用) // 流转去向(资产管理处审核时使用)
const flowTarget = ref<string>(''); const flowTarget = ref<string>('');
// 部门参与人选择相关(部门负责人审核时使用)
const representorSelectMode = ref<'designate' | 'random'>('designate');
const deptMembers = ref<any[]>([]);
const deptMembersLoading = ref(false);
const selectedRepresentor = ref<string>('');
const randomCandidates = ref<string[]>([]);
const currentRepresentor = ref<any>(null);
const representorType = ref<string>('purchase_rep');
const saveRepresentorLoading = ref(false);
const randomSelectLoading = ref(false);
const canSaveRepresentor = computed(() => {
if (representorSelectMode.value === 'designate') {
return !!selectedRepresentor.value;
}
return !!currentRepresentor.value;
});
// ==================== 计算属性 ==================== // ==================== 计算属性 ====================
const BID_FILE_TYPE = '130'; const BID_FILE_TYPE = '130';
@@ -634,6 +757,93 @@ 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;
}
} catch (e: any) {
ElMessage.error(e?.msg || '加载部门人员失败');
} finally {
deptMembersLoading.value = false;
}
};
const handleRandomSelect = async () => {
if (randomCandidates.value.length < 2) {
ElMessage.warning('请至少选择2名候选人');
return;
}
try {
randomSelectLoading.value = true;
const res = await randomSelectRepresentor(
effectivePurchaseId.value,
randomCandidates.value.join(',')
);
if (res.code === 0 && res.data) {
currentRepresentor.value = res.data;
ElMessage.success(`随机抽取成功:${res.data.realName}`);
} else {
ElMessage.error(res.msg || '随机抽取失败');
}
} catch (e: any) {
ElMessage.error(e?.msg || '随机抽取失败');
} finally {
randomSelectLoading.value = false;
}
};
const handleSaveRepresentor = async () => {
if (!canSaveRepresentor.value) {
ElMessage.warning('请先选择参与人');
return;
}
if (!representorType.value) {
ElMessage.warning('请选择参与人身份');
return;
}
try {
saveRepresentorLoading.value = true;
let res: any;
if (representorSelectMode.value === 'designate') {
res = await saveRepresentor(
Number(effectivePurchaseId.value),
selectedRepresentor.value,
undefined,
representorType.value
);
} else {
res = await saveRepresentor(
Number(effectivePurchaseId.value),
currentRepresentor.value?.teacherNo,
randomCandidates.value.join(','),
representorType.value
);
}
if (res.code === 0) {
ElMessage.success('保存参与人信息成功');
await loadApplyData();
} else {
ElMessage.error(res.msg || '保存失败');
}
} catch (e: any) {
ElMessage.error(e?.msg || '保存失败');
} finally {
saveRepresentorLoading.value = false;
}
};
// ==================== 生命周期 ==================== // ==================== 生命周期 ====================
onMounted(async () => { onMounted(async () => {
@@ -642,6 +852,9 @@ onMounted(async () => {
if (isAgent.value) { if (isAgent.value) {
await loadRequirementFiles(); await loadRequirementFiles();
} }
if (showRepresentorSection.value) {
await loadDeptMembers();
}
registerFlowCallbacks(); registerFlowCallbacks();
}); });
@@ -654,6 +867,9 @@ watch(
if (isAgent.value) { if (isAgent.value) {
await loadRequirementFiles(); await loadRequirementFiles();
} }
if (showRepresentorSection.value) {
await loadDeptMembers();
}
registerFlowCallbacks(); registerFlowCallbacks();
} }
}, },

View File

@@ -55,7 +55,7 @@
采购申请管理 采购申请管理
</span> </span>
<div class="header-actions"> <div class="header-actions">
<el-button icon="Files" link type="primary"> 采购申请汇总</el-button> <!-- <el-button icon="QuestionFilled" link type="primary"> 采购申请操作说明文档下载</el-button>-->
<el-button icon="FolderAdd" type="primary" @click="handleAdd"> 新增</el-button> <el-button icon="FolderAdd" type="primary" @click="handleAdd"> 新增</el-button>
<right-toolbar v-model:showSearch="showSearch" class="ml10" @queryTable="getDataList" /> <right-toolbar v-model:showSearch="showSearch" class="ml10" @queryTable="getDataList" />
</div> </div>
@@ -72,14 +72,14 @@
:header-cell-style="tableStyle.headerCellStyle" :header-cell-style="tableStyle.headerCellStyle"
class="modern-table" class="modern-table"
> >
<el-table-column type="index" label="序号" width="70" align="center"> <el-table-column type="index" label="序号" width="50" align="center">
<template #header> <template #header>
<el-icon> <el-icon>
<List /> <List />
</el-icon> </el-icon>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="purchaseNo" label="申请单编号" min-width="180"> <el-table-column prop="purchaseNo" label="申请单编号" min-width="170">
<template #header> <template #header>
<el-icon> <el-icon>
<DocumentCopy /> <DocumentCopy />
@@ -130,7 +130,7 @@
<span style="margin-left: 4px">需求部门</span> <span style="margin-left: 4px">需求部门</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="projectType" label="项目类别" min-width="200" align="left" show-overflow-tooltip> <el-table-column prop="projectType" label="项目类别" min-width="100" align="left" show-overflow-tooltip>
<template #header> <template #header>
<el-icon> <el-icon>
<Collection /> <Collection />
@@ -151,7 +151,7 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="budget" label="项目预算(元)" width="130" align="right"> <el-table-column prop="budget" label="项目预算(元)" width="120" align="right">
<template #header> <template #header>
<el-icon> <el-icon>
<Money /> <Money />