Merge branch 'developer' of ssh://code.cyweb.top:30033/scj/zhxy/v3/cloud-ui into developer
This commit is contained in:
BIN
src/assets/file/江苏省常州技师学院商务洽谈纪要.docx
Normal file
BIN
src/assets/file/江苏省常州技师学院商务洽谈纪要.docx
Normal file
Binary file not shown.
BIN
src/assets/file/部门自行采购市场采购纪要.docx
Normal file
BIN
src/assets/file/部门自行采购市场采购纪要.docx
Normal file
Binary file not shown.
BIN
src/assets/file/部门采购询价模版.docx
Normal file
BIN
src/assets/file/部门采购询价模版.docx
Normal file
Binary file not shown.
@@ -22,45 +22,74 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 默认上传组件 -->
|
||||
<el-upload
|
||||
ref="fileUpload"
|
||||
v-if="props.type === 'default' && !props.disabled"
|
||||
:action="baseUrl + other.adaptationUrl(props.uploadFileUrl)"
|
||||
:before-upload="handleBeforeUpload"
|
||||
:file-list="fileList"
|
||||
:headers="headers"
|
||||
:limit="limit"
|
||||
:on-error="handleUploadError"
|
||||
:on-remove="handleRemove"
|
||||
:on-preview="handlePreview"
|
||||
:on-exceed="handleExceed"
|
||||
:data="formData"
|
||||
:auto-upload="autoUpload"
|
||||
:on-success="handleUploadSuccess"
|
||||
:accept="fileAccept"
|
||||
class="upload-file-uploader"
|
||||
drag
|
||||
multiple
|
||||
>
|
||||
<i class="el-icon-upload"></i>
|
||||
<div class="el-upload__text">
|
||||
{{ $t('excel.operationNotice') }}
|
||||
<em>{{ $t('excel.clickUpload') }}</em>
|
||||
</div>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip" v-if="props.isShowTip">
|
||||
{{ $t('excel.pleaseUpload') }}
|
||||
<template v-if="props.fileSize">
|
||||
{{ $t('excel.size') }} <b style="color: #f56c6c">{{ props.fileSize }}MB</b></template
|
||||
<!-- 默认上传组件 - 简洁模式 -->
|
||||
<div v-if="props.type === 'default' && !props.disabled" class="upload-file-default">
|
||||
<el-upload
|
||||
ref="fileUpload"
|
||||
:action="baseUrl + other.adaptationUrl(props.uploadFileUrl)"
|
||||
:before-upload="handleBeforeUpload"
|
||||
:file-list="[]"
|
||||
:headers="headers"
|
||||
:limit="limit"
|
||||
:on-error="handleUploadError"
|
||||
:on-exceed="handleExceed"
|
||||
:data="formData"
|
||||
:auto-upload="autoUpload"
|
||||
:on-success="handleUploadSuccess"
|
||||
:accept="fileAccept"
|
||||
class="upload-file-uploader-simple"
|
||||
multiple
|
||||
>
|
||||
<el-button type="primary" size="small">
|
||||
<el-icon class="mr-1"><Upload /></el-icon>
|
||||
{{ $t('excel.clickUpload') }}
|
||||
</el-button>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip" v-if="props.isShowTip" style="margin-top: 8px; font-size: 12px; color: #909399;">
|
||||
{{ $t('excel.pleaseUpload') }}
|
||||
<template v-if="props.fileSize">
|
||||
{{ $t('excel.size') }} <b style="color: #f56c6c">{{ props.fileSize }}MB</b></template
|
||||
>
|
||||
<template v-if="props.fileType">
|
||||
{{ $t('excel.format') }} <b style="color: #f56c6c">{{ props.fileType.join('/') }}</b>
|
||||
</template>
|
||||
{{ $t('excel.file') }}
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
<!-- 已上传文件列表 -->
|
||||
<div v-if="fileList.length > 0" class="uploaded-files-list" style="margin-top: 12px;">
|
||||
<div
|
||||
v-for="(file, index) in fileList"
|
||||
:key="index"
|
||||
class="uploaded-file-item"
|
||||
style="display: flex; align-items: center; padding: 8px 12px; margin-bottom: 8px; background: #f5f7fa; border-radius: 4px;"
|
||||
>
|
||||
<el-icon class="mr-2" style="color: #409eff;"><Document /></el-icon>
|
||||
<span class="file-name" style="flex: 1; font-size: 14px; color: #606266; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
|
||||
{{ getFileName(file) }}
|
||||
</span>
|
||||
<el-button
|
||||
type="danger"
|
||||
link
|
||||
size="small"
|
||||
@click="handleRemove(file)"
|
||||
style="margin-left: 8px;"
|
||||
>
|
||||
<template v-if="props.fileType">
|
||||
{{ $t('excel.format') }} <b style="color: #f56c6c">{{ props.fileType.join('/') }}</b>
|
||||
</template>
|
||||
{{ $t('excel.file') }}
|
||||
<el-icon><Delete /></el-icon>
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
size="small"
|
||||
@click="handlePreview(file)"
|
||||
style="margin-left: 4px;"
|
||||
>
|
||||
<el-icon><Download /></el-icon>
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 简单上传组件 -->
|
||||
<el-upload
|
||||
ref="fileUpload"
|
||||
@@ -103,7 +132,7 @@ import { Session } from '/@/utils/storage';
|
||||
import other from '/@/utils/other';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { ref, computed, watch } from 'vue';
|
||||
import { Document, Download } from '@element-plus/icons-vue';
|
||||
import { Document, Download, Upload, Delete } from '@element-plus/icons-vue';
|
||||
|
||||
// 定义基础URL
|
||||
const baseUrl = import.meta.env.VITE_API_URL || '';
|
||||
|
||||
@@ -145,17 +145,17 @@
|
||||
clearable
|
||||
:disabled="isAutoSelectPurchaseType"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in purchaseTypeDeptList"
|
||||
:key="item.id"
|
||||
:label="item.label"
|
||||
:value="item.value" />
|
||||
<el-option
|
||||
v-for="item in purchaseTypeDeptList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 商务洽谈 -->
|
||||
<el-form-item
|
||||
v-if="dataForm.purchaseType === PURCHASE_TYPE_IDS.BUSINESS_NEGOTIATION"
|
||||
v-if="isPurchaseType(PURCHASE_TYPE_IDS.BUSINESS_NEGOTIATION)"
|
||||
label="商务洽谈表"
|
||||
prop="businessNegotiationTable"
|
||||
class="mb20">
|
||||
@@ -170,12 +170,14 @@
|
||||
<upload-file
|
||||
v-model="dataForm.businessNegotiationTable"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.businessNegotiationTable }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 市场采购 -->
|
||||
<el-form-item
|
||||
v-if="dataForm.purchaseType === PURCHASE_TYPE_IDS.MARKET_PURCHASE"
|
||||
v-if="isPurchaseType(PURCHASE_TYPE_IDS.MARKET_PURCHASE)"
|
||||
label="市场采购纪要"
|
||||
prop="marketPurchaseMinutes"
|
||||
class="mb20">
|
||||
@@ -190,27 +192,27 @@
|
||||
<upload-file
|
||||
v-model="dataForm.marketPurchaseMinutes"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.marketPurchaseMinutes }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 网上商城 -->
|
||||
<el-form-item
|
||||
v-if="dataForm.purchaseType === PURCHASE_TYPE_IDS.ONLINE_MALL"
|
||||
v-if="isPurchaseType(PURCHASE_TYPE_IDS.ONLINE_MALL)"
|
||||
label="网上商城采购相关材料"
|
||||
prop="onlineMallMaterials"
|
||||
class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.onlineMallMaterials"
|
||||
:limit="1"
|
||||
accept=".zip"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.onlineMallMaterials }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
<div class="template-note mt5">
|
||||
<el-text type="info" size="small">请上传zip格式的压缩包</el-text>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 委托采购中心 -->
|
||||
<template v-if="dataForm.purchaseType === PURCHASE_TYPE_IDS.ENTRUST_CENTER">
|
||||
<template v-if="isPurchaseType(PURCHASE_TYPE_IDS.ENTRUST_CENTER)">
|
||||
<el-form-item label="委托采购中心方式" prop="entrustCenterType" class="mb20">
|
||||
<el-radio-group v-model="dataForm.entrustCenterType">
|
||||
<el-radio label="service_online">服务类网上商城</el-radio>
|
||||
@@ -258,6 +260,8 @@
|
||||
<upload-file
|
||||
v-model="dataForm.serviceDirectSelect"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.serviceDirectSelect }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -277,6 +281,8 @@
|
||||
<upload-file
|
||||
v-model="dataForm.serviceInviteSelect"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.serviceInviteSelect }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -298,6 +304,8 @@
|
||||
<upload-file
|
||||
v-model="dataForm.purchaseRequirementTemplate"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.purchaseRequirementTemplate }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -339,6 +347,8 @@
|
||||
<upload-file
|
||||
v-model="dataForm.serviceInviteSelect"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.serviceInviteSelect }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -359,9 +369,22 @@
|
||||
<upload-file
|
||||
v-model="dataForm.servicePublicSelectAuto"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.servicePublicSelectAuto }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<!-- 其他材料(zip压缩包) -->
|
||||
<el-form-item label="其他材料" prop="otherMaterials" class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.otherMaterials"
|
||||
:limit="5"
|
||||
:file-type="['zip']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.otherMaterials }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
<div class="template-note">支持上传zip格式的压缩包文件</div>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
<!-- 分支二:学校统一采购 -->
|
||||
@@ -395,6 +418,40 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 业务分管处室 -->
|
||||
<el-form-item label="业务分管处室" prop="deptClassifyId" class="mb20">
|
||||
<el-select
|
||||
v-model="dataForm.deptClassifyId"
|
||||
placeholder="请选择业务分管处室"
|
||||
clearable
|
||||
filterable
|
||||
@change="handleBusinessDeptChange"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in businessDeptList"
|
||||
:key="item.id"
|
||||
:label="item.deptName"
|
||||
:value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 分管校领导 -->
|
||||
<el-form-item label="分管校领导" prop="schoolLeaderUserId" class="mb20">
|
||||
<el-select
|
||||
v-model="dataForm.schoolLeaderUserId"
|
||||
placeholder="请选择分管校领导"
|
||||
clearable
|
||||
filterable
|
||||
@change="handleSchoolLeaderChange"
|
||||
style="width: 100%">
|
||||
<el-option
|
||||
v-for="item in schoolLeaderList"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.userId" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 金额>=30万,显示可行性论证报告和会议纪要 -->
|
||||
<template v-if="dataForm.budget && dataForm.budget >= 300000">
|
||||
<el-form-item
|
||||
@@ -412,12 +469,16 @@
|
||||
<upload-file
|
||||
v-model="dataForm.feasibilityReport"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.feasibilityReport }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
<el-form-item label="会议纪要" prop="meetingMinutes" class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.meetingMinutes"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.meetingMinutes }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
@@ -428,12 +489,14 @@
|
||||
<upload-file
|
||||
v-model="dataForm.meetingMinutesUrgent"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.meetingMinutesUrgent }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<!-- 特殊情况:单一来源 -->
|
||||
<template v-if="dataForm.isSpecial === '2'">
|
||||
<template v-if="isSpecialType('2')">
|
||||
<el-form-item
|
||||
label="单一来源论专家证附件"
|
||||
prop="singleSourceProof"
|
||||
@@ -449,18 +512,22 @@
|
||||
<upload-file
|
||||
v-model="dataForm.singleSourceProof"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.singleSourceProof }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
<el-form-item label="会议纪要" prop="meetingMinutesSingle" class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.meetingMinutesSingle"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.meetingMinutesSingle }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<!-- 特殊情况:进口 -->
|
||||
<template v-if="dataForm.isSpecial === '3'">
|
||||
<template v-if="isSpecialType('3')">
|
||||
<el-form-item
|
||||
label="进口产品申请及专家论证意见表"
|
||||
prop="importApplication"
|
||||
@@ -476,32 +543,20 @@
|
||||
<upload-file
|
||||
v-model="dataForm.importApplication"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.importApplication }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
<el-form-item label="会议纪要" prop="meetingMinutesImport" class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.meetingMinutesImport"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.meetingMinutesImport }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<!-- 需求文件(默认) -->
|
||||
<el-form-item label="需求文件" prop="purchaseRequirement" class="mb20">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('purchase_requirement')"
|
||||
class="mb10">
|
||||
下载《采购需求填报模板》模版
|
||||
</el-button>
|
||||
<upload-file
|
||||
v-model="dataForm.purchaseRequirement"
|
||||
:limit="5"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 特殊规则:5万<=金额<40万,服务类目(isMallService=1、isProjectService=1),自动使用邀请比选模版 -->
|
||||
<template v-if="showAutoInviteSelectSchool">
|
||||
<el-form-item label="是否有推荐供应商" prop="hasRecommendedSupplierSchool" class="mb20">
|
||||
@@ -510,79 +565,107 @@
|
||||
<el-radio label="no">无</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<!-- 有推荐供应商:显示推荐供应商输入框和邀请比选模板 -->
|
||||
<template v-if="dataForm.hasRecommendedSupplierSchool === 'yes'">
|
||||
<el-form-item
|
||||
label="推荐供应商"
|
||||
prop="recommendedSuppliersSchool"
|
||||
class="mb20">
|
||||
<el-input
|
||||
v-model="dataForm.recommendedSuppliersSchool"
|
||||
type="textarea"
|
||||
:rows="3"
|
||||
placeholder="请输入三家供应商名称,用逗号或分号分隔"
|
||||
clearable />
|
||||
<div class="template-note mt5">
|
||||
<el-text type="info" size="small">请输入三家供应商名称,用逗号或分号分隔</el-text>
|
||||
<!-- 有推荐供应商:显示推荐供应商输入框 -->
|
||||
<el-form-item
|
||||
v-if="dataForm.hasRecommendedSupplierSchool === 'yes'"
|
||||
label="推荐供应商"
|
||||
prop="recommendedSuppliersSchool"
|
||||
class="mb20">
|
||||
<el-input
|
||||
v-model="dataForm.recommendedSuppliersSchool"
|
||||
type="textarea"
|
||||
:rows="3"
|
||||
placeholder="请输入三家供应商名称,用逗号或分号分隔"
|
||||
clearable />
|
||||
<div class="template-note mt5">
|
||||
<el-text type="info" size="small">请输入三家供应商名称,用逗号或分号分隔</el-text>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</template>
|
||||
|
||||
<!-- 需求文件 -->
|
||||
<el-form-item label="需求文件" :prop="getRequirementFileProp()" class="mb20">
|
||||
<!-- 特殊规则:5万<=金额<40万,服务类目(isMallService=1、isProjectService=1),自动使用邀请比选模版 -->
|
||||
<template v-if="showAutoInviteSelectSchool">
|
||||
<!-- 有推荐供应商:显示邀请比选模板 -->
|
||||
<template v-if="dataForm.hasRecommendedSupplierSchool === 'yes'">
|
||||
<div class="mb10">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('invite_select')"
|
||||
class="mb10">
|
||||
下载《服务商城项目需求模板(邀请比选)》模版
|
||||
</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="服务商城项目需求模板(邀请比选)"
|
||||
prop="serviceInviteSelectSchool"
|
||||
class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.serviceInviteSelectSchool"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.serviceInviteSelectSchool }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</template>
|
||||
<!-- 无推荐供应商:显示公开比选模板 -->
|
||||
<template v-else-if="dataForm.hasRecommendedSupplierSchool === 'no'">
|
||||
<div class="mb10">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('public_select')"
|
||||
class="mb10">
|
||||
下载《服务商城项目需求模板(公开比选)》模版
|
||||
</el-button>
|
||||
</div>
|
||||
<upload-file
|
||||
v-model="dataForm.servicePublicSelectSchoolAuto"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.servicePublicSelectSchoolAuto }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!-- 特殊规则:40万<=金额<100万,服务类目,自动使用公开比选需求模版 -->
|
||||
<template v-else-if="showAutoPublicSelect">
|
||||
<div class="mb10">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('invite_select')"
|
||||
@click="downloadTemplate('public_select')"
|
||||
class="mb10">
|
||||
下载《服务商城项目需求模板(邀请比选)》模版
|
||||
下载《服务商城项目需求模板(公开比选)》模版
|
||||
</el-button>
|
||||
<upload-file
|
||||
v-model="dataForm.serviceInviteSelectSchool"
|
||||
:limit="5"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
<!-- 无推荐供应商:显示公开比选模板 -->
|
||||
<el-form-item
|
||||
v-if="dataForm.hasRecommendedSupplierSchool === 'no'"
|
||||
label="服务商城项目需求模板(公开比选)"
|
||||
prop="servicePublicSelectSchoolAuto"
|
||||
class="mb20">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('public_select')"
|
||||
class="mb10">
|
||||
下载《服务商城项目需求模板(公开比选)》模版
|
||||
</el-button>
|
||||
</div>
|
||||
<upload-file
|
||||
v-model="dataForm.servicePublicSelectSchoolAuto"
|
||||
v-model="dataForm.servicePublicSelectSchool"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.servicePublicSelectSchool }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<!-- 特殊规则:40万<=金额<100万,服务类目,自动使用公开比选需求模版 -->
|
||||
<el-form-item
|
||||
v-if="showAutoPublicSelect"
|
||||
label="服务商城项目需求模板(公开比选)"
|
||||
prop="servicePublicSelectSchool"
|
||||
class="mb20">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('public_select')"
|
||||
class="mb10">
|
||||
下载《服务商城项目需求模板(公开比选)》模版
|
||||
</el-button>
|
||||
<upload-file
|
||||
v-model="dataForm.servicePublicSelectSchool"
|
||||
:limit="5"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
<!-- 默认:采购需求填报模板 -->
|
||||
<template v-else>
|
||||
<div class="mb10">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Download"
|
||||
@click="downloadTemplate('purchase_requirement')"
|
||||
class="mb10">
|
||||
下载《采购需求填报模板》模版
|
||||
</el-button>
|
||||
</div>
|
||||
<upload-file
|
||||
v-model="dataForm.purchaseRequirement"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.purchaseRequirement }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</template>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 金额>=100万,政府采购意向表 -->
|
||||
@@ -594,8 +677,21 @@
|
||||
<upload-file
|
||||
v-model="dataForm.governmentPurchaseIntent"
|
||||
:limit="5"
|
||||
:file-type="['doc', 'docx', 'pdf']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.governmentPurchaseIntent }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
</el-form-item>
|
||||
|
||||
<!-- 其他材料(zip压缩包) -->
|
||||
<el-form-item label="其他材料" prop="otherMaterials" class="mb20">
|
||||
<upload-file
|
||||
v-model="dataForm.otherMaterials"
|
||||
:limit="5"
|
||||
:file-type="['zip']"
|
||||
:data="{ fileType: FILE_TYPE_MAP.otherMaterials }"
|
||||
upload-file-url="/purchase/purchasingfiles/upload" />
|
||||
<div class="template-note">支持上传zip格式的压缩包文件</div>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -651,6 +747,8 @@ import { useMessage } from '/@/hooks/message';
|
||||
import UploadFile from '/@/components/Upload/index.vue';
|
||||
import other from '/@/utils/other';
|
||||
import { Document, Download } from '@element-plus/icons-vue';
|
||||
import { fetchList as getBusinessDeptList } from '/@/api/purchase/purchasingBusinessDept';
|
||||
import { getPage as getSchoolLeaderPage } from '/@/api/finance/purchasingschoolleader';
|
||||
|
||||
// 路由
|
||||
const router = useRouter();
|
||||
@@ -704,6 +802,13 @@ const dataForm = reactive({
|
||||
recommendedSuppliersSchool: '',
|
||||
serviceInviteSelectSchool: '',
|
||||
servicePublicSelectSchoolAuto: '',
|
||||
// 业务分管处室和分管校领导
|
||||
deptClassifyId: '',
|
||||
deptClassifyName: '',
|
||||
schoolLeaderUserId: '',
|
||||
schoolLeaderName: '',
|
||||
// 其他材料(zip压缩包)
|
||||
otherMaterials: '',
|
||||
});
|
||||
const categoryTreeData = ref<any[]>([]);
|
||||
const categoryCodePath = ref<string[]>([]); // 级联选择器的路径数组
|
||||
@@ -713,6 +818,8 @@ const isSpecialList = ref<any[]>([]);
|
||||
const purchaseTypeDeptList = ref<any[]>([]);
|
||||
const purchaseModeSchoolList = ref<any[]>([]);
|
||||
const purchaseTypeUnionList = ref<any[]>([]);
|
||||
const businessDeptList = ref<any[]>([]);
|
||||
const schoolLeaderList = ref<any[]>([]);
|
||||
const loading = ref(false);
|
||||
|
||||
// 采购方式ID常量
|
||||
@@ -723,16 +830,75 @@ const PURCHASE_TYPE_IDS = {
|
||||
ENTRUST_CENTER: '981bf052a0b30b028a4a89ae490c9b1d' // 委托采购中心
|
||||
};
|
||||
|
||||
// 文件类型映射(对应数据库 file_type 字段)
|
||||
// 10:商务洽谈纪要 20:市场采购纪要 30:网上商城采购相关材料 40:可行性论证报告 50:会议记录 60:其他材料 70:单一来源专家论证表 80:进口产品申请表 90:进口产品专家论证表 100:政府采购意向表 110:履约验收单
|
||||
const FILE_TYPE_MAP: Record<string, string> = {
|
||||
businessNegotiationTable: '10', // 商务洽谈纪要
|
||||
marketPurchaseMinutes: '20', // 市场采购纪要
|
||||
onlineMallMaterials: '30', // 网上商城采购相关材料
|
||||
feasibilityReport: '40', // 可行性论证报告
|
||||
meetingMinutes: '50', // 会议记录
|
||||
meetingMinutesUrgent: '50', // 会议记录
|
||||
meetingMinutesSingle: '50', // 会议记录
|
||||
meetingMinutesImport: '50', // 会议记录
|
||||
otherMaterials: '60', // 其他材料
|
||||
singleSourceProof: '70', // 单一来源专家论证表
|
||||
importApplication: '80', // 进口产品申请表
|
||||
governmentPurchaseIntent: '100', // 政府采购意向表
|
||||
// 需求文件相关(暂时使用默认值,可根据实际需求调整)
|
||||
serviceDirectSelect: '30', // 服务商城项目需求模板(直选)- 归类到网上商城采购相关材料
|
||||
serviceInviteSelect: '30', // 服务商城项目需求模板(邀请比选)
|
||||
servicePublicSelect: '30', // 服务商城项目需求模板(公开比选)
|
||||
servicePublicSelectAuto: '30', // 服务商城项目需求模板(公开比选-自动)
|
||||
purchaseRequirementTemplate: '30', // 采购需求填报模板
|
||||
purchaseRequirement: '30', // 采购需求填报模板
|
||||
serviceInviteSelectSchool: '30', // 服务商城项目需求模板(邀请比选-学校)
|
||||
servicePublicSelectSchoolAuto: '30', // 服务商城项目需求模板(公开比选-学校-自动)
|
||||
servicePublicSelectSchool: '30', // 服务商城项目需求模板(公开比选-学校)
|
||||
};
|
||||
|
||||
// 辅助函数:判断当前采购方式是否为指定类型(通过 id 或 value 匹配)
|
||||
const isPurchaseType = (purchaseTypeId: string) => {
|
||||
if (!dataForm.purchaseType) return false;
|
||||
// 在字典中查找匹配的项
|
||||
const item = purchaseTypeDeptList.value.find(item =>
|
||||
item.id === purchaseTypeId || item.value === purchaseTypeId
|
||||
);
|
||||
if (item) {
|
||||
return dataForm.purchaseType === item.value;
|
||||
}
|
||||
// 如果字典中找不到,直接比较 value(兼容性处理)
|
||||
return dataForm.purchaseType === purchaseTypeId;
|
||||
};
|
||||
|
||||
// 辅助函数:判断特殊情况是否为指定类型(通过 id 或 value 匹配)
|
||||
const isSpecialType = (specialIdOrValue: string) => {
|
||||
if (!dataForm.isSpecial) return false;
|
||||
// 在字典中查找匹配的项
|
||||
const item = isSpecialList.value.find(item =>
|
||||
item.id === specialIdOrValue || item.value === specialIdOrValue
|
||||
);
|
||||
if (item) {
|
||||
return dataForm.isSpecial === item.value;
|
||||
}
|
||||
// 如果字典中找不到,直接比较 value(兼容性处理)
|
||||
return dataForm.isSpecial === specialIdOrValue;
|
||||
};
|
||||
|
||||
// 判断是否为部门自行采购
|
||||
// 条件:特殊情况=否 且 集采=否 且 预算金额<5万 → 部门自行采购
|
||||
// 其他情况 → 学校统一采购
|
||||
const isDeptPurchase = computed(() => {
|
||||
// 检查是否特殊情况是否为"否"(id: "1799c07f3a3b8a484f60c495ab9227b6")
|
||||
const isSpecialNo = isSpecialList.value.find(item => item.id === '1799c07f3a3b8a484f60c495ab9227b6');
|
||||
// 检查是否特殊情况是否为"否"(通过 id 或 value 查找,value 为 '0')
|
||||
const isSpecialNo = isSpecialList.value.find(item =>
|
||||
item.id === '1799c07f3a3b8a484f60c495ab9227b6' || item.value === '0'
|
||||
);
|
||||
const isSpecialNoValue = isSpecialNo ? isSpecialNo.value : null;
|
||||
|
||||
// 检查是否集采是否为"否"(id: "8e60f8860c1ea2459a41a8ae64fe5518")
|
||||
const isCentralizedNo = isCentralizedList.value.find(item => item.id === '8e60f8860c1ea2459a41a8ae64fe5518');
|
||||
// 检查是否集采是否为"否"(通过 id 或 value 查找,value 为 '0')
|
||||
const isCentralizedNo = isCentralizedList.value.find(item =>
|
||||
item.id === '8e60f8860c1ea2459a41a8ae64fe5518' || item.value === '0'
|
||||
);
|
||||
const isCentralizedNoValue = isCentralizedNo ? isCentralizedNo.value : null;
|
||||
|
||||
// 三个条件必须同时满足:特殊情况=否 且 集采=否 且 预算金额<5万
|
||||
@@ -746,9 +912,12 @@ const isDeptPurchase = computed(() => {
|
||||
return false;
|
||||
});
|
||||
|
||||
// 判断是否为紧急情况(ID: 6509b59e24c1c6568f4277e544f3e55e)
|
||||
// 判断是否为紧急情况(通过 id 或 value 查找,value 为 '1')
|
||||
const isUrgentSpecial = computed(() => {
|
||||
const urgentItem = isSpecialList.value.find(item => item.id === '6509b59e24c1c6568f4277e544f3e55e');
|
||||
const urgentItem = isSpecialList.value.find(item =>
|
||||
item.id === '6509b59e24c1c6568f4277e544f3e55e' ||
|
||||
(item.value === '1' && (item.label?.includes('紧急') || item.dictLabel?.includes('紧急')))
|
||||
);
|
||||
if (!urgentItem) return false;
|
||||
return dataForm.isSpecial === urgentItem.value;
|
||||
});
|
||||
@@ -860,6 +1029,20 @@ const showAutoPublicSelect = computed(() => {
|
||||
return budget >= 400000 && budget < 1000000 && isSpecialServiceCategory.value;
|
||||
});
|
||||
|
||||
// 获取需求文件的 prop 名称(用于表单验证)
|
||||
const getRequirementFileProp = () => {
|
||||
if (showAutoInviteSelectSchool.value) {
|
||||
if (dataForm.hasRecommendedSupplierSchool === 'yes') {
|
||||
return 'serviceInviteSelectSchool';
|
||||
} else if (dataForm.hasRecommendedSupplierSchool === 'no') {
|
||||
return 'servicePublicSelectSchoolAuto';
|
||||
}
|
||||
} else if (showAutoPublicSelect.value) {
|
||||
return 'servicePublicSelectSchool';
|
||||
}
|
||||
return 'purchaseRequirement';
|
||||
};
|
||||
|
||||
// 判断学校统一采购是否需要自动设置采购方式(5万<=金额<40万,服务类目,特殊服务类目)
|
||||
const isAutoSelectPurchaseTypeUnion = computed(() => {
|
||||
if (isDeptPurchase.value) return false;
|
||||
@@ -872,11 +1055,13 @@ const isAutoSelectPurchaseTypeUnion = computed(() => {
|
||||
watch([() => dataForm.categoryCode, () => dataForm.budget], () => {
|
||||
// 部门自行采购:自动设置网上商城
|
||||
if (isAutoSelectPurchaseType.value && isDeptPurchase.value) {
|
||||
// 查找网上商城选项(通过id或value匹配)
|
||||
const onlineMallOption = purchaseTypeDeptList.value.find(item =>
|
||||
item.id === PURCHASE_TYPE_IDS.ONLINE_MALL ||
|
||||
item.value === PURCHASE_TYPE_IDS.ONLINE_MALL
|
||||
);
|
||||
// 查找网上商城选项(通过 id、value 或 label 匹配)
|
||||
const onlineMallOption = purchaseTypeDeptList.value.find(item => {
|
||||
const label = item.label || item.dictLabel || item.name || '';
|
||||
return item.id === PURCHASE_TYPE_IDS.ONLINE_MALL ||
|
||||
item.value === PURCHASE_TYPE_IDS.ONLINE_MALL ||
|
||||
label.includes('网上商城') || label.includes('商城');
|
||||
});
|
||||
if (onlineMallOption && dataForm.purchaseType !== onlineMallOption.value) {
|
||||
dataForm.purchaseType = onlineMallOption.value;
|
||||
}
|
||||
@@ -1036,6 +1221,7 @@ const getFundSourceDict = async () => {
|
||||
fundSourceList.value = [];
|
||||
if (res.data && Array.isArray(res.data)) {
|
||||
fundSourceList.value = res.data.map((item: any) => ({
|
||||
id: item.id,
|
||||
label: item.label || item.dictLabel || item.name,
|
||||
value: item.value || item.dictValue || item.code
|
||||
}));
|
||||
@@ -1134,7 +1320,7 @@ const getPurchaseTypeDeptDict = async () => {
|
||||
purchaseTypeDeptList.value = res.data.map((item: any) => ({
|
||||
id: item.id,
|
||||
label: item.label || item.dictLabel || item.name,
|
||||
value: item.id || item.dictValue || item.code
|
||||
value: item.value || item.dictValue || item.code
|
||||
}));
|
||||
}
|
||||
} catch (err) {
|
||||
@@ -1149,6 +1335,7 @@ const getPurchaseModeSchoolDict = async () => {
|
||||
purchaseModeSchoolList.value = [];
|
||||
if (res.data && Array.isArray(res.data)) {
|
||||
purchaseModeSchoolList.value = res.data.map((item: any) => ({
|
||||
id: item.id,
|
||||
label: item.label || item.dictLabel || item.name,
|
||||
value: item.value || item.dictValue || item.code
|
||||
}));
|
||||
@@ -1173,6 +1360,7 @@ const getPurchaseTypeUnionDict = async () => {
|
||||
purchaseTypeUnionList.value = [];
|
||||
if (res.data && Array.isArray(res.data)) {
|
||||
purchaseTypeUnionList.value = res.data.map((item: any) => ({
|
||||
id: item.id,
|
||||
label: item.label || item.dictLabel || item.name,
|
||||
value: item.value || item.dictValue || item.code
|
||||
}));
|
||||
@@ -1182,7 +1370,74 @@ const getPurchaseTypeUnionDict = async () => {
|
||||
}
|
||||
};
|
||||
|
||||
// 获取业务分管处室列表
|
||||
const getBusinessDeptListData = async () => {
|
||||
try {
|
||||
const res = await getBusinessDeptList({ records: 1000 }); // 获取所有数据
|
||||
if (res.data && res.data.records) {
|
||||
businessDeptList.value = res.data.records.map((item: any) => ({
|
||||
id: item.id,
|
||||
deptId: item.deptId,
|
||||
deptName: item.deptName,
|
||||
userId: item.userId,
|
||||
name: item.name,
|
||||
username: item.username
|
||||
}));
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('获取业务分管处室列表失败:', err);
|
||||
businessDeptList.value = [];
|
||||
}
|
||||
};
|
||||
|
||||
// 获取分管校领导列表
|
||||
const getSchoolLeaderListData = async () => {
|
||||
try {
|
||||
const res = await getSchoolLeaderPage({ records: 1000 }); // 获取所有数据
|
||||
if (res.data && res.data.records) {
|
||||
schoolLeaderList.value = res.data.records.map((item: any) => ({
|
||||
id: item.id,
|
||||
userId: item.userId,
|
||||
name: item.name,
|
||||
username: item.username
|
||||
}));
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('获取分管校领导列表失败:', err);
|
||||
schoolLeaderList.value = [];
|
||||
}
|
||||
};
|
||||
|
||||
// 处理业务分管处室选择变化
|
||||
const handleBusinessDeptChange = (value: string) => {
|
||||
if (value) {
|
||||
const selected = businessDeptList.value.find(item => item.id === value);
|
||||
if (selected) {
|
||||
dataForm.deptClassifyId = selected.id;
|
||||
dataForm.deptClassifyName = selected.deptName || '';
|
||||
}
|
||||
} else {
|
||||
dataForm.deptClassifyId = '';
|
||||
dataForm.deptClassifyName = '';
|
||||
}
|
||||
};
|
||||
|
||||
// 处理分管校领导选择变化
|
||||
const handleSchoolLeaderChange = (value: string) => {
|
||||
if (value) {
|
||||
const selected = schoolLeaderList.value.find(item => item.userId === value);
|
||||
if (selected) {
|
||||
dataForm.schoolLeaderUserId = selected.userId;
|
||||
dataForm.schoolLeaderName = selected.name || '';
|
||||
}
|
||||
} else {
|
||||
dataForm.schoolLeaderUserId = '';
|
||||
dataForm.schoolLeaderName = '';
|
||||
}
|
||||
};
|
||||
|
||||
// 处理文件ID字符串转数组
|
||||
// 从上传返回的URL中提取文件ID,拼成数组格式:["id1", "id2"]
|
||||
const getFileIdsArray = (fileIds: string | string[]): string[] => {
|
||||
if (!fileIds) return [];
|
||||
if (Array.isArray(fileIds)) return fileIds;
|
||||
@@ -1192,19 +1447,41 @@ const getFileIdsArray = (fileIds: string | string[]): string[] => {
|
||||
|
||||
urls.forEach(url => {
|
||||
try {
|
||||
// 尝试解析为URL
|
||||
const urlObj = new URL(url, window.location.origin);
|
||||
const id = urlObj.searchParams.get('id') || urlObj.searchParams.get('fileName');
|
||||
// 优先从URL参数中获取id
|
||||
let id = urlObj.searchParams.get('id');
|
||||
|
||||
// 如果没有id参数,尝试从路径中提取(可能是直接的文件ID)
|
||||
if (!id) {
|
||||
const pathParts = urlObj.pathname.split('/').filter(p => p);
|
||||
// 检查最后一个路径段是否是32位十六进制字符串(文件ID格式)
|
||||
const lastPart = pathParts[pathParts.length - 1];
|
||||
if (lastPart && /^[a-f0-9]{32}$/i.test(lastPart)) {
|
||||
id = lastPart;
|
||||
} else if (lastPart) {
|
||||
id = lastPart;
|
||||
}
|
||||
}
|
||||
|
||||
if (id) {
|
||||
ids.push(id);
|
||||
} else {
|
||||
const pathParts = urlObj.pathname.split('/');
|
||||
const lastPart = pathParts[pathParts.length - 1];
|
||||
if (lastPart) {
|
||||
ids.push(lastPart);
|
||||
// 如果URL解析失败,检查原始字符串是否是ID格式
|
||||
if (/^[a-f0-9]{32}$/i.test(url.trim())) {
|
||||
ids.push(url.trim());
|
||||
} else {
|
||||
ids.push(url);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
ids.push(url);
|
||||
// URL解析失败,检查是否是直接的ID格式(32位十六进制)
|
||||
if (/^[a-f0-9]{32}$/i.test(url.trim())) {
|
||||
ids.push(url.trim());
|
||||
} else {
|
||||
// 否则直接使用原始字符串
|
||||
ids.push(url);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1234,7 +1511,8 @@ const handleSubmit = async () => {
|
||||
'serviceInviteSelect', 'servicePublicSelectAuto', 'purchaseRequirement',
|
||||
'meetingMinutes', 'feasibilityReport', 'meetingMinutesUrgent',
|
||||
'meetingMinutesSingle', 'meetingMinutesImport', 'singleSourceProof', 'importApplication',
|
||||
'governmentPurchaseIntent', 'servicePublicSelectSchool'
|
||||
'governmentPurchaseIntent', 'servicePublicSelectSchool', 'serviceInviteSelectSchool',
|
||||
'servicePublicSelectSchoolAuto', 'otherMaterials'
|
||||
];
|
||||
|
||||
fileFields.forEach(field => {
|
||||
@@ -1283,7 +1561,8 @@ const handleTempStore = async () => {
|
||||
'serviceInviteSelect', 'servicePublicSelectAuto', 'purchaseRequirement',
|
||||
'meetingMinutes', 'feasibilityReport', 'meetingMinutesUrgent',
|
||||
'meetingMinutesSingle', 'meetingMinutesImport', 'singleSourceProof', 'importApplication',
|
||||
'governmentPurchaseIntent', 'servicePublicSelectSchool'
|
||||
'governmentPurchaseIntent', 'servicePublicSelectSchool', 'serviceInviteSelectSchool',
|
||||
'servicePublicSelectSchoolAuto', 'otherMaterials'
|
||||
];
|
||||
|
||||
fileFields.forEach(field => {
|
||||
@@ -1366,7 +1645,26 @@ onMounted(async () => {
|
||||
getPurchaseTypeDeptDict(),
|
||||
getPurchaseModeSchoolDict(),
|
||||
getPurchaseTypeUnionDict(),
|
||||
getBusinessDeptListData(),
|
||||
getSchoolLeaderListData(),
|
||||
]);
|
||||
|
||||
// 新增模式下设置默认值(只有在没有 id 的情况下才设置)
|
||||
if (!dataForm.id) {
|
||||
// 填报日期默认为当天
|
||||
const today = new Date();
|
||||
const year = today.getFullYear();
|
||||
const month = String(today.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(today.getDate()).padStart(2, '0');
|
||||
dataForm.applyDate = `${year}-${month}-${day}`;
|
||||
|
||||
// 是否集采默认为"否"(value: '0')
|
||||
dataForm.isCentralized = '0';
|
||||
|
||||
// 是否特殊情况默认为"否"(value: '0')
|
||||
dataForm.isSpecial = '0';
|
||||
}
|
||||
|
||||
// 如果有 categoryCode,设置回显路径
|
||||
if (dataForm.categoryCode) {
|
||||
setCategoryCodePath();
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
{label:'高校教师资格证',value:'highCer_高校教师资格证'},
|
||||
{label:'中等教师资格证',value:'midCer_中等教师资格证'},
|
||||
{label:'教师上岗证',value:'priCer_教师上岗证'},
|
||||
{label:'共同居住人',value:'livewith_共同居住人'},
|
||||
// {label:'共同居住人',value:'livewith_共同居住人'},
|
||||
]
|
||||
|
||||
// 导出文件函数
|
||||
@@ -169,7 +169,7 @@
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
const blob = new Blob([res.data])
|
||||
const blob = new Blob([res])
|
||||
const fileName = fileNameStr
|
||||
const elink = document.createElement('a')
|
||||
elink.download = fileName
|
||||
@@ -239,7 +239,7 @@
|
||||
"teacherBaseDTO": searchData
|
||||
}
|
||||
|
||||
await exportForModel(params, "教职工信息.xls", "/professional/teacherbase/exportTeacherInfoBySelf")
|
||||
await exportForModel(params, "教职工信息.xls", "/professional/file/exportTeacherInfoBySelf")
|
||||
|
||||
setTimeout(() => {
|
||||
exportLoading.value = false
|
||||
|
||||
Reference in New Issue
Block a user