|
@@ -9,78 +9,76 @@
|
|
|
>
|
|
>
|
|
|
<template #default>
|
|
<template #default>
|
|
|
<div class="drawer-body" v-loading="loading">
|
|
<div class="drawer-body" v-loading="loading">
|
|
|
- <el-form ref="formRef" :model="form" :rules="rules" label-width="110px" class="selection-form" label-position="left">
|
|
|
|
|
|
|
+ <el-form ref="formRef" :model="form" :rules="rules" label-width="140px" class="selection-form" label-position="left">
|
|
|
<!-- 基本信息 -->
|
|
<!-- 基本信息 -->
|
|
|
<div class="section-block">
|
|
<div class="section-block">
|
|
|
<div class="section-title">基本信息</div>
|
|
<div class="section-title">基本信息</div>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="24">
|
|
|
|
|
+ <el-form-item label="项目名称" prop="projectName">
|
|
|
|
|
+ <el-input v-model="form.projectName" placeholder="请输入项目名称" maxlength="200" show-word-limit />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
<el-row :gutter="24">
|
|
<el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="归属公司" prop="companyNo">
|
|
<el-form-item label="归属公司" prop="companyNo">
|
|
|
- <el-select v-model="form.companyNo" placeholder="请选择" style="width: 100%" clearable filterable>
|
|
|
|
|
|
|
+ <el-select v-model="form.companyNo" placeholder="请选择" style="width: 100%" clearable filterable disabled>
|
|
|
<el-option v-for="item in computedCompanyOptions" :key="item.companyCode || item.id"
|
|
<el-option v-for="item in computedCompanyOptions" :key="item.companyCode || item.id"
|
|
|
:label="item.companyName" :value="String(item.companyCode || item.id)" />
|
|
:label="item.companyName" :value="String(item.companyCode || item.id)" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ <el-col :span="16">
|
|
|
|
|
+ <el-form-item label="客户名称" prop="customName">
|
|
|
|
|
+ <el-input :model-value="form.customName ? ((form.customNo || form.customerNo) + '、' + form.customName) : ''" disabled />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="客户名称" prop="customerName">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="form.customNo"
|
|
|
|
|
- placeholder="搜索客户"
|
|
|
|
|
- style="width: 100%"
|
|
|
|
|
- filterable
|
|
|
|
|
- clearable
|
|
|
|
|
- @change="handleCustomerChange"
|
|
|
|
|
- >
|
|
|
|
|
- <el-option
|
|
|
|
|
- v-for="item in computedCustomerOptions"
|
|
|
|
|
- :key="item.id || item.customerNo"
|
|
|
|
|
- :label="item.customerName || item.customName"
|
|
|
|
|
- :value="String(item.customerNo || item.id)"
|
|
|
|
|
- />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item label="行业" prop="industryName">
|
|
|
|
|
+ <el-input v-model="form.industryName" placeholder="无" disabled style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="项目类型" prop="businessType">
|
|
|
|
|
- <el-select v-model="form.businessType" placeholder="请选择" style="width: 100%" clearable>
|
|
|
|
|
- <el-option v-for="item in projectTypeOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item label="部门" prop="deptName">
|
|
|
|
|
+ <el-input v-model="form.deptName" placeholder="无" disabled style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="24">
|
|
<el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="项目类别" prop="projectLevel">
|
|
|
|
|
- <el-select v-model="form.projectLevel" placeholder="请选择" style="width: 100%" clearable>
|
|
|
|
|
- <el-option v-for="item in projectLevelOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item label="项目状态" prop="projectStatus">
|
|
|
|
|
+ <el-input :model-value="saleStatusOptions?.find(i => String(i.value) === String(form.projectStatus))?.label || (String(form.projectStatus) === '2' ? '进行中' : (String(form.projectStatus) === '0' || String(form.projectStatus) === '1' ? '跟进中' : (form.statusName || form.projectStatus || '无')))" disabled style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="项目负责人" prop="leader">
|
|
|
|
|
- <el-select v-model="form.leader" placeholder="请选择" style="width: 100%" clearable filterable @change="handleLeaderChange">
|
|
|
|
|
- <el-option v-for="item in computedUserOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item label="项目级别" prop="projectLevel">
|
|
|
|
|
+ <el-select v-model="form.projectLevel" placeholder="请选择" style="width: 100%" clearable>
|
|
|
|
|
+ <el-option v-for="item in projectLevelOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="产品支持" prop="productSupport">
|
|
|
|
|
- <el-select v-model="form.productSupport" placeholder="请选择" style="width: 100%" clearable filterable @change="handleProductSupportChange">
|
|
|
|
|
- <el-option v-for="item in computedProductSupportOptions" :key="item.staffId || item.userId" :label="(item.staffCode || item.userName ? '(' + (item.staffCode || item.userName) + ') ' : '') + (item.staffName || item.nickName)" :value="String(item.staffId || item.userId)" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
|
|
+ <el-form-item label="项目类型" prop="businessType">
|
|
|
|
|
+ <el-select v-model="form.businessType" placeholder="请选择" style="width: 100%" clearable>
|
|
|
|
|
+ <el-option v-for="item in projectTypeOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
|
|
|
+ </el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
- <el-form-item label="项目名称" prop="projectName">
|
|
|
|
|
- <el-input v-model="form.projectName" placeholder="请输入项目名称" maxlength="200" show-word-limit />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 项目情况 -->
|
|
<!-- 项目情况 -->
|
|
|
<div class="section-block">
|
|
<div class="section-block">
|
|
|
<div class="section-title">项目情况</div>
|
|
<div class="section-title">项目情况</div>
|
|
|
<el-row :gutter="24">
|
|
<el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="登记日期" prop="createTimeStr">
|
|
|
|
|
+ <el-input v-model="form.createTimeStr" placeholder="无" disabled style="width: 100%" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="金额(万)" prop="amount">
|
|
<el-form-item label="金额(万)" prop="amount">
|
|
|
<el-input-number v-model="form.amount" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
<el-input-number v-model="form.amount" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
@@ -91,18 +89,16 @@
|
|
|
<el-input-number v-model="form.entryFee" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
<el-input-number v-model="form.entryFee" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="投标保证金" prop="bidBond">
|
|
<el-form-item label="投标保证金" prop="bidBond">
|
|
|
<el-input-number v-model="form.bidBond" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
<el-input-number v-model="form.bidBond" :precision="2" :step="1" :min="0" controls-position="right" style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="24">
|
|
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="赢单率(%)" prop="winningRate">
|
|
<el-form-item label="赢单率(%)" prop="winningRate">
|
|
|
- <el-input v-model="form.winningRate" placeholder="请输入" type="number">
|
|
|
|
|
- <template #append>%</template>
|
|
|
|
|
- </el-input>
|
|
|
|
|
|
|
+ <el-input v-model="form.winningRate" placeholder="请输入" type="number" maxlength="6" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
@@ -110,24 +106,31 @@
|
|
|
<el-date-picker v-model="form.signUpDeadline" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
<el-date-picker v-model="form.signUpDeadline" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="投标截止时间" prop="tenderDeadline">
|
|
<el-form-item label="投标截止时间" prop="tenderDeadline">
|
|
|
<el-date-picker v-model="form.tenderDeadline" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
<el-date-picker v-model="form.tenderDeadline" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- </el-row>
|
|
|
|
|
- <el-row :gutter="24">
|
|
|
|
|
- <el-col :span="8">
|
|
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="标书汇编完成时间" prop="compilationTime">
|
|
|
|
|
+ <el-date-picker v-model="form.compilationTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="8">
|
|
|
<el-form-item label="服务期(年)" prop="standardPeriod">
|
|
<el-form-item label="服务期(年)" prop="standardPeriod">
|
|
|
<el-input v-model="form.standardPeriod" placeholder="请输入" maxlength="50" />
|
|
<el-input v-model="form.standardPeriod" placeholder="请输入" maxlength="50" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="服务时间段" prop="serviceTime">
|
|
<el-form-item label="服务时间段" prop="serviceTime">
|
|
|
<el-input v-model="form.serviceTime" placeholder="请输入" maxlength="100" />
|
|
<el-input v-model="form.serviceTime" placeholder="请输入" maxlength="100" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8">
|
|
|
|
|
|
|
+ <el-col :span="16">
|
|
|
<el-form-item label="入围类型" prop="shortlistedType">
|
|
<el-form-item label="入围类型" prop="shortlistedType">
|
|
|
<el-select v-model="form.shortlistedType" placeholder="请选择" style="width: 100%" clearable>
|
|
<el-select v-model="form.shortlistedType" placeholder="请选择" style="width: 100%" clearable>
|
|
|
<el-option v-for="item in shortlistedTypeOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
<el-option v-for="item in shortlistedTypeOptions" :key="item.value" :label="item.label" :value="String(item.value)" />
|
|
@@ -136,64 +139,67 @@
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
<el-row :gutter="24">
|
|
<el-row :gutter="24">
|
|
|
- <el-col :span="8">
|
|
|
|
|
|
|
+ <el-col :span="16">
|
|
|
<el-form-item label="物资类目" prop="profession">
|
|
<el-form-item label="物资类目" prop="profession">
|
|
|
- <el-select v-model="form.profession" placeholder="请选择" style="width: 100%" clearable>
|
|
|
|
|
- <el-option v-for="item in professionOptions" :key="item.id" :label="item.industryCategoryName" :value="String(item.id)" />
|
|
|
|
|
|
|
+ <el-select v-model="form.profession" placeholder="请选择" style="width: 100%" clearable multiple>
|
|
|
|
|
+ <el-option v-for="item in professionOptions" :key="item.id || item.value" :label="item.industryCategoryName || item.label" :value="String(item.id || item.value)" />
|
|
|
</el-select>
|
|
</el-select>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
<el-col :span="8">
|
|
<el-col :span="8">
|
|
|
<el-form-item label="招标代理机构" prop="biddingAgency">
|
|
<el-form-item label="招标代理机构" prop="biddingAgency">
|
|
|
<el-input v-model="form.biddingAgency" placeholder="请输入" maxlength="100" />
|
|
<el-input v-model="form.biddingAgency" placeholder="请输入" maxlength="100" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
- <el-col :span="8">
|
|
|
|
|
- <el-form-item label="代理机构联系方式" prop="agencyContact" class="label-nowrap">
|
|
|
|
|
|
|
+ <el-col :span="16">
|
|
|
|
|
+ <el-form-item label="机构联系方式" prop="agencyContact">
|
|
|
<el-input v-model="form.agencyContact" placeholder="请输入" maxlength="50" />
|
|
<el-input v-model="form.agencyContact" placeholder="请输入" maxlength="50" />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-col>
|
|
</el-col>
|
|
|
</el-row>
|
|
</el-row>
|
|
|
- <el-form-item label="标期类型" prop="bidPeriodType">
|
|
|
|
|
- <el-radio-group v-model="form.bidPeriodType">
|
|
|
|
|
- <el-radio :value="1">单项目入围</el-radio>
|
|
|
|
|
- <el-radio :value="2">周期性框架</el-radio>
|
|
|
|
|
- </el-radio-group>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="招标链接" prop="biddingLink" v-if="form.bidPeriodType === 2">
|
|
|
|
|
- <el-input v-model="form.biddingLink" placeholder="请输入/粘贴链接" maxlength="500" />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="入围要求" prop="condition">
|
|
|
|
|
- <el-input v-model="form.condition" type="textarea" :rows="3" placeholder="请输入" maxlength="500" show-word-limit />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="项目描述" prop="projectDesc">
|
|
|
|
|
- <el-input v-model="form.projectDesc" type="textarea" :rows="3" placeholder="请输入项目描述" maxlength="500" show-word-limit />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <!-- 附件 -->
|
|
|
|
|
- <div class="section-block no-border">
|
|
|
|
|
- <div class="section-title attachment-header">
|
|
|
|
|
- <span>附件</span>
|
|
|
|
|
- <el-upload
|
|
|
|
|
- :action="uploadFileUrl"
|
|
|
|
|
- :headers="headers"
|
|
|
|
|
- :on-success="handleUploadSuccess"
|
|
|
|
|
- :show-file-list="false"
|
|
|
|
|
- multiple
|
|
|
|
|
- class="upload-btn"
|
|
|
|
|
- >
|
|
|
|
|
- <el-button link type="primary" icon="Upload">上传附件</el-button>
|
|
|
|
|
- </el-upload>
|
|
|
|
|
- </div>
|
|
|
|
|
- <el-table :data="fileList" border class="file-table">
|
|
|
|
|
- <el-table-column label="文件名称" prop="name" show-overflow-tooltip />
|
|
|
|
|
- <el-table-column label="操作" width="100" align="center">
|
|
|
|
|
- <template #default="scope">
|
|
|
|
|
- <el-button link type="danger" @click="handleDeleteFile(scope.$index)">删除</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
- </el-table>
|
|
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="8">
|
|
|
|
|
+ <el-form-item label="标期类型" prop="bidPeriodType">
|
|
|
|
|
+ <el-radio-group v-model="form.bidPeriodType">
|
|
|
|
|
+ <el-radio :value="1">单项目入围</el-radio>
|
|
|
|
|
+ <el-radio :value="2">周期性框架</el-radio>
|
|
|
|
|
+ </el-radio-group>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="8" v-if="form.bidPeriodType === 2">
|
|
|
|
|
+ <el-form-item label="预计下次投标时间" prop="nextBiddingTime">
|
|
|
|
|
+ <el-date-picker v-model="form.nextBiddingTime" type="date" value-format="YYYY-MM-DD" placeholder="请选择" style="width: 100%" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ <el-col :span="8" v-if="form.bidPeriodType === 2">
|
|
|
|
|
+ <el-form-item label="提前提醒天数" prop="noticeAdvanceDays">
|
|
|
|
|
+ <el-input v-model="form.noticeAdvanceDays" placeholder="请输入" maxlength="50" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="24">
|
|
|
|
|
+ <el-form-item label="招标链接" prop="biddingLink">
|
|
|
|
|
+ <el-input v-model="form.biddingLink" placeholder="请输入/粘贴链接" maxlength="500" />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="24">
|
|
|
|
|
+ <el-form-item label="入围要求" prop="condition">
|
|
|
|
|
+ <el-input v-model="form.condition" type="textarea" :rows="3" placeholder="请输入" maxlength="500" show-word-limit />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
|
|
+ <el-row :gutter="24">
|
|
|
|
|
+ <el-col :span="24">
|
|
|
|
|
+ <el-form-item label="项目描述" prop="projectDesc">
|
|
|
|
|
+ <el-input v-model="form.projectDesc" type="textarea" :rows="3" placeholder="请输入项目描述" maxlength="500" show-word-limit />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </el-col>
|
|
|
|
|
+ </el-row>
|
|
|
</div>
|
|
</div>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</div>
|
|
</div>
|
|
@@ -208,9 +214,9 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
-import { ref, reactive, watch, computed, getCurrentInstance } from 'vue';
|
|
|
|
|
|
|
+import { ref, reactive, watch, computed, getCurrentInstance, onMounted } from 'vue';
|
|
|
import { getProjectSelection, updateProjectSelection } from '@/api/saleManage/projectSelection/index';
|
|
import { getProjectSelection, updateProjectSelection } from '@/api/saleManage/projectSelection/index';
|
|
|
-import { listCustomerInfo } from "@/api/customer/customerInfo/index";
|
|
|
|
|
|
|
+import { listCustomerInfo, getCustomerInfo } from "@/api/customer/customerInfo/index";
|
|
|
import { listByIds } from "@/api/system/oss/index";
|
|
import { listByIds } from "@/api/system/oss/index";
|
|
|
import { globalHeaders } from '@/utils/request';
|
|
import { globalHeaders } from '@/utils/request';
|
|
|
import { Upload } from '@element-plus/icons-vue';
|
|
import { Upload } from '@element-plus/icons-vue';
|
|
@@ -223,7 +229,8 @@ const props = defineProps({
|
|
|
projectLevelOptions: Array,
|
|
projectLevelOptions: Array,
|
|
|
projectTypeOptions: Array,
|
|
projectTypeOptions: Array,
|
|
|
shortlistedTypeOptions: Array,
|
|
shortlistedTypeOptions: Array,
|
|
|
- professionOptions: Array
|
|
|
|
|
|
|
+ professionOptions: Array,
|
|
|
|
|
+ industryOptions: Array
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
const emit = defineEmits(['update:modelValue', 'success']);
|
|
const emit = defineEmits(['update:modelValue', 'success']);
|
|
@@ -239,6 +246,8 @@ const fileList = ref([]);
|
|
|
const uploadFileUrl = import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload';
|
|
const uploadFileUrl = import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload';
|
|
|
const headers = globalHeaders();
|
|
const headers = globalHeaders();
|
|
|
|
|
|
|
|
|
|
+const { J0001: saleStatusOptions } = toRefs(reactive(proxy.useDict('J0001')));
|
|
|
|
|
+
|
|
|
const form = reactive({});
|
|
const form = reactive({});
|
|
|
|
|
|
|
|
const rules = reactive({
|
|
const rules = reactive({
|
|
@@ -331,7 +340,10 @@ const loadDetail = (id) => {
|
|
|
form.projectLevel = data.projectLevel ? String(data.projectLevel) : '';
|
|
form.projectLevel = data.projectLevel ? String(data.projectLevel) : '';
|
|
|
form.businessType = data.businessType ? String(data.businessType) : '';
|
|
form.businessType = data.businessType ? String(data.businessType) : '';
|
|
|
form.shortlistedType = data.shortlistedType ? String(data.shortlistedType) : '';
|
|
form.shortlistedType = data.shortlistedType ? String(data.shortlistedType) : '';
|
|
|
- form.profession = data.profession ? String(data.profession) : '';
|
|
|
|
|
|
|
+ form.profession = data.profession ? String(data.profession).split(',') : [];
|
|
|
|
|
+ form.customNo = data.customNo ? String(data.customNo) : (data.customerNo ? String(data.customerNo) : '');
|
|
|
|
|
+ form.customerNo = data.customerNo ? String(data.customerNo) : (data.customNo ? String(data.customNo) : '');
|
|
|
|
|
+ form.projectStatus = (data.projectStatus ?? data.status) != null ? String(data.projectStatus ?? data.status) : '';
|
|
|
|
|
|
|
|
// 补全 productSupportName
|
|
// 补全 productSupportName
|
|
|
if (data.productSupport) {
|
|
if (data.productSupport) {
|
|
@@ -339,6 +351,14 @@ const loadDetail = (id) => {
|
|
|
form.productSupportName = user ? (user.staffName || user.nickName) : '';
|
|
form.productSupportName = user ? (user.staffName || user.nickName) : '';
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 部门回显
|
|
|
|
|
+ if (form.leader) {
|
|
|
|
|
+ const user = props.userOptions?.find(u => String(u.staffId || u.userId) === String(form.leader));
|
|
|
|
|
+ form.deptName = user ? (user.deptName || user.departmentName) : (data.deptName || '');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ form.deptName = data.deptName || '';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 字段回显增强:将 VO/DTO 字段名映射回 Entity 字段名
|
|
// 字段回显增强:将 VO/DTO 字段名映射回 Entity 字段名
|
|
|
if (data.customerName && !data.customName) form.customName = data.customerName;
|
|
if (data.customerName && !data.customName) form.customName = data.customerName;
|
|
|
if (data.winRate && !data.winningRate) form.winningRate = data.winRate;
|
|
if (data.winRate && !data.winningRate) form.winningRate = data.winRate;
|
|
@@ -348,6 +368,44 @@ const loadDetail = (id) => {
|
|
|
if (data.winRate && !data.winningRate) form.winningRate = data.winRate;
|
|
if (data.winRate && !data.winningRate) form.winningRate = data.winRate;
|
|
|
if (data.registrationDeadline && !data.signUpDeadline) form.signUpDeadline = data.registrationDeadline;
|
|
if (data.registrationDeadline && !data.signUpDeadline) form.signUpDeadline = data.registrationDeadline;
|
|
|
|
|
|
|
|
|
|
+ if (data.createTime) {
|
|
|
|
|
+ form.createTimeStr = proxy.parseTime(data.createTime, '{y}-{m}-{d}');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ form.createTimeStr = '';
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 行业回显
|
|
|
|
|
+ if (!form.industryName || form.industryName === '无') {
|
|
|
|
|
+ const industryId = data.industryId || data.industry || data.profession;
|
|
|
|
|
+ const industryName = props.industryOptions?.find(o => String(o.id) === String(industryId))?.industryCategoryName;
|
|
|
|
|
+ if (industryName) {
|
|
|
|
|
+ form.industryName = industryName;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!form.industryName || form.industryName === '无') {
|
|
|
|
|
+ const customer = computedCustomerOptions.value.find(item => String(item.customerNo || item.id) === String(form.customNo));
|
|
|
|
|
+ if (customer) {
|
|
|
|
|
+ const industryId = customer.industryCategoryId || customer.industryId;
|
|
|
|
|
+ const industryName = customer.industryName || props.industryOptions?.find(o => String(o.id) === String(industryId))?.industryCategoryName;
|
|
|
|
|
+ if (industryName) {
|
|
|
|
|
+ form.industryName = industryName;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if ((!form.industryName || form.industryName === '无') && (form.customNo || form.customerNo)) {
|
|
|
|
|
+ const customerNo = form.customNo || form.customerNo;
|
|
|
|
|
+ getCustomerInfo(customerNo).then(cRes => {
|
|
|
|
|
+ const cData = cRes.data || cRes;
|
|
|
|
|
+ const industryId = cData.industryCategoryId || cData.industryId;
|
|
|
|
|
+ const industryName = cData.industryName || props.industryOptions?.find(o => String(o.id) === String(industryId))?.industryCategoryName;
|
|
|
|
|
+ if (industryName) {
|
|
|
|
|
+ form.industryName = industryName;
|
|
|
|
|
+ }
|
|
|
|
|
+ }).catch(() => {});
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (form.fileNo) {
|
|
if (form.fileNo) {
|
|
|
listByIds(form.fileNo).then(ossRes => {
|
|
listByIds(form.fileNo).then(ossRes => {
|
|
|
fileList.value = (ossRes.data || []).map(i => ({ name: i.originalName, url: i.url, ossId: i.ossId }));
|
|
fileList.value = (ossRes.data || []).map(i => ({ name: i.originalName, url: i.url, ossId: i.ossId }));
|
|
@@ -397,8 +455,10 @@ const handleLeaderChange = (val) => {
|
|
|
const user = computedUserOptions.value.find(u => String(u.staffId || u.userId) === String(val));
|
|
const user = computedUserOptions.value.find(u => String(u.staffId || u.userId) === String(val));
|
|
|
if (user) {
|
|
if (user) {
|
|
|
form.leaderName = user.staffName || user.nickName;
|
|
form.leaderName = user.staffName || user.nickName;
|
|
|
|
|
+ form.deptName = user.deptName || user.departmentName || '';
|
|
|
} else {
|
|
} else {
|
|
|
form.leaderName = undefined;
|
|
form.leaderName = undefined;
|
|
|
|
|
+ form.deptName = '';
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -424,11 +484,25 @@ const handleDeleteFile = (index) => {
|
|
|
form.fileNo = fileList.value.map(f => f.ossId).join(',');
|
|
form.fileNo = fileList.value.map(f => f.ossId).join(',');
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+const handleDownload = (row) => {
|
|
|
|
|
+ if (row.ossId) {
|
|
|
|
|
+ proxy.$download.oss(row.ossId);
|
|
|
|
|
+ } else if (row.url) {
|
|
|
|
|
+ window.open(row.url, '_blank');
|
|
|
|
|
+ } else {
|
|
|
|
|
+ proxy.$modal.msgError("下载地址不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
const submitForm = () => {
|
|
const submitForm = () => {
|
|
|
formRef.value.validate(valid => {
|
|
formRef.value.validate(valid => {
|
|
|
if (valid) {
|
|
if (valid) {
|
|
|
submitting.value = true;
|
|
submitting.value = true;
|
|
|
- updateProjectSelection(form).then(() => {
|
|
|
|
|
|
|
+ const postData = {
|
|
|
|
|
+ ...form,
|
|
|
|
|
+ profession: Array.isArray(form.profession) ? form.profession.join(',') : form.profession
|
|
|
|
|
+ };
|
|
|
|
|
+ updateProjectSelection(postData).then(() => {
|
|
|
proxy.$modal.msgSuccess("修改成功");
|
|
proxy.$modal.msgSuccess("修改成功");
|
|
|
visible.value = false;
|
|
visible.value = false;
|
|
|
emit('success');
|
|
emit('success');
|