优化
This commit is contained in:
@ -32,7 +32,7 @@
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleExport()" v-hasPermi="['bidding:biddingLimitList:export']">导出excel</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<!-- <el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
v-if="versionObj.status == 'draft' || versionObj.status == 'back'"
|
||||
@ -51,7 +51,7 @@
|
||||
v-if="versionObj.status != 'draft'"
|
||||
>查看流程</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form-item> -->
|
||||
</el-form>
|
||||
</el-card>
|
||||
</transition>
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
<template>
|
||||
<div class="p-4 bg-gray-50 min-h-screen">
|
||||
<!-- 卡片容器:控制最大宽度+居中+圆角阴影 -->
|
||||
<el-card shadow="hover" class="max-w-6xl mx-auto rounded-xl overflow-hidden border-0" style="background-color: #ffffff">
|
||||
<el-card shadow="hover" class="max-w-6xl mx-auto rounded-xl overflow-hidden border-0"
|
||||
style="background-color: #ffffff">
|
||||
<!-- 卡片头部:项目信息展示区 -->
|
||||
<template #header>
|
||||
<div class="bg-blue-50 px-6 rounded-t-xl" style="padding: 10px 20px">
|
||||
@ -55,62 +56,133 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-4 mb-6">
|
||||
<el-button @click="isDisabled = false" type="primary" class="px-8 py-2.5 transition-all duration-300 font-medium" v-if="isDisabled">
|
||||
<!-- <div class="mt-4 mb-6">
|
||||
<el-button @click="isDisabled = false" type="primary"
|
||||
class="px-8 py-2.5 transition-all duration-300 font-medium" v-if="isDisabled">
|
||||
点击编辑
|
||||
</el-button>
|
||||
</div>
|
||||
</div> -->
|
||||
</template>
|
||||
<!-- 中标信息表单区域 -->
|
||||
<el-form
|
||||
:disabled="isDisabled"
|
||||
ref="listOfWinningBidsFormRef"
|
||||
:model="form"
|
||||
:rules="rules"
|
||||
label-width="150px"
|
||||
class="p-6 pt-4"
|
||||
style="background-color: #ffffff"
|
||||
>
|
||||
<el-form :disabled="isDisabled" ref="listOfWinningBidsFormRef" :model="form" :rules="rules" label-width="150px"
|
||||
class="p-6 pt-4" style="background-color: #ffffff">
|
||||
<el-row :gutter="32">
|
||||
<!-- 是否中标(必填) -->
|
||||
<!-- 招标代理机构 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否中标" prop="whetherBid" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-radio-group v-model="form.whetherBid">
|
||||
<el-radio label="0" border>中标</el-radio>
|
||||
<el-radio label="1" border>未中标</el-radio>
|
||||
</el-radio-group>
|
||||
<el-form-item label="招标代理机构" prop="biddingAgency" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.biddingAgency" placeholder="请输入招标代理机构" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 中标价(必填,仅中标时显示) -->
|
||||
<el-col :span="12" v-if="form.whetherBid == '0'">
|
||||
<el-form-item label="中标价(人民币)" prop="bidPrice" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.bidPrice" type="number" placeholder="请输入中标价" />
|
||||
<!-- 招标人 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="招标人" prop="tenderer" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.tenderer" placeholder="请输入招标人" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 中标通知书(必填,仅中标时显示) -->
|
||||
<el-col :span="12" v-if="form.whetherBid == '0'">
|
||||
<el-form-item label="中标通知书" prop="bidFile" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<file-upload v-model="form.bidFile" :limit="10" :file-type="['pdf']" :file-size="50" />
|
||||
<!-- 投标截止时间 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="投标截止时间" prop="biddingDeadline" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-date-picker v-model="form.biddingDeadline" format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="请选择投标截止时间" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 开标时间 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="开标时间" prop="bidopeningTime" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-date-picker v-model="form.bidopeningTime" format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" type="datetime" placeholder="请选择开标时间" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- 建设地点 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设地点" prop="constructionsite" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.constructionsite" placeholder="请输入建设地点" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 计划工期 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="计划工期" prop="planDuration" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.planDuration" placeholder="请输入计划工期(如:180天)" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 答疑截止时间 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="答疑截止时间" prop="answeringDeadlineTime"
|
||||
class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-date-picker v-model="form.answeringDeadlineTime" type="datetime" format="YYYY-MM-DD HH:mm:ss"
|
||||
value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择答疑截止时间" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 澄清截止时间 -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="澄清截止时间" prop="clarifyDeadlineTime" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-date-picker format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss "
|
||||
v-model="form.clarifyDeadlineTime" type="datetime" placeholder="请选择澄清截止时间" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 项目概况 -->
|
||||
<el-col :span="24">
|
||||
<el-form-item label="项目概况" prop="projectOverview" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.projectOverview" type="textarea" placeholder="请输入项目概况" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row v-if="!isDisabled" class="mt-8">
|
||||
<el-row v-if="!form.id" class="mt-4">
|
||||
<el-col :span="24" class="text-center">
|
||||
<el-button
|
||||
:loading="buttonLoading"
|
||||
type="primary"
|
||||
@click="submitForm"
|
||||
v-hasPermi="['bidding:listOfWinningBids:add', 'bidding:listOfWinningBids:edit']"
|
||||
class="rounded-full px-8"
|
||||
size="large"
|
||||
>
|
||||
<el-button :loading="buttonLoading" type="primary" @click="submitForm"
|
||||
v-hasPermi="['bidding:listOfWinningBids:add', 'bidding:listOfWinningBids:edit']" class="rounded-full px-8"
|
||||
size="large">
|
||||
确认提交
|
||||
</el-button>
|
||||
<el-button type="default" @click="resetForm" class="ml-6 rounded-full px-8" size="large"> 重置 </el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<div style="margin-top: 20px;" v-if="form.id">
|
||||
<span style=" color: rgb(38 153 255);
|
||||
display: inline-block;
|
||||
margin-left: 40px;
|
||||
font-weight: 700;">是否中标配置</span>
|
||||
<el-form ref="listOfWinningBidsFormRef" :disabled="iswhetherBid" :model="form" :rules="rules"
|
||||
label-width="150px" class="p-6 pt-4" style="background-color: #ffffff">
|
||||
<el-row>
|
||||
<!-- 是否中标(必填) -->
|
||||
<el-col :span="12">
|
||||
<el-form-item label="是否中标" prop="whetherBid" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-radio-group v-model="form.whetherBid">
|
||||
<el-radio label="0" border>中标</el-radio>
|
||||
<el-radio label="1" border>未中标</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 中标价(必填,仅中标时显示) -->
|
||||
<el-col :span="12" v-if="form.whetherBid == '0'">
|
||||
<el-form-item label="中标价(人民币)" prop="bidPrice" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-model="form.bidPrice" type="number" placeholder="请输入中标价" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<!-- 中标通知书(必填,仅中标时显示) -->
|
||||
<!-- <el-col :span="12" v-if="form.whetherBid == '0'">
|
||||
<el-form-item label="中标通知书" prop="bidFileId" class="rounded-lg border border-gray-100 p-1 mb-5">
|
||||
<el-input v-if="form.bidFileName" v-model="form.bidFileName" disabled placeholder="请输入中标通知书" />
|
||||
<file-upload v-else v-model="form.bidFileId" :limit="1" :file-type="['pdf']" :file-size="50" />
|
||||
</el-form-item>
|
||||
</el-col> -->
|
||||
</el-row>
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row class="mt-4" v-if="!iswhetherBid && form.whetherBid == '0'">
|
||||
<el-col :span="24" class="text-center">
|
||||
<el-button :loading="buttonLoading1" type="primary" @click="submitForm"
|
||||
v-hasPermi="['bidding:listOfWinningBids:add', 'bidding:listOfWinningBids:edit']"
|
||||
class="rounded-full px-8" size="large">
|
||||
中标
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
@ -122,14 +194,21 @@ import { ListOfWinningBidsForm } from '@/api/bidding/listOfWinningBids/types';
|
||||
import { useUserStoreHook } from '@/store/modules/user';
|
||||
import { ElFormInstance, ElMessage } from 'element-plus';
|
||||
import { getProject, updateProject } from '@/api/project/project';
|
||||
|
||||
import { globalHeaders } from '@/utils/request';
|
||||
import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus';
|
||||
import { genFileId } from 'element-plus';
|
||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||
const { project_type, project_stage } = toRefs<any>(proxy?.useDict('project_type', 'project_stage'));
|
||||
|
||||
const headers = ref(globalHeaders());
|
||||
const fileList = ref([]);
|
||||
// 用户状态管理与当前项目
|
||||
const userStore = useUserStoreHook();
|
||||
const iswhetherBid = ref(false); // 是否中标
|
||||
const currentProject = computed(() => userStore.selectedProject);
|
||||
|
||||
// const realUploadUrl = computed(() => {
|
||||
// const search = new URLSearchParams().toString();
|
||||
// return search ? `${baseUrl}${props.uploadUrl}?${search}` : `${baseUrl}${props.uploadUrl}`;
|
||||
// });
|
||||
// 项目信息(仅展示,非表单编辑)
|
||||
const projectInfo = reactive({
|
||||
principal: undefined,
|
||||
@ -150,18 +229,31 @@ const projectInfo = reactive({
|
||||
// 表单核心变量
|
||||
const listOfWinningBidsFormRef = ref<ElFormInstance>();
|
||||
const buttonLoading = ref(false);
|
||||
const buttonLoading1 = ref(false);
|
||||
const isDisabled = ref(false);
|
||||
|
||||
// 表单初始数据
|
||||
const fileObj = ref({
|
||||
bidFile: undefined,
|
||||
bidFileName: undefined
|
||||
});
|
||||
// 表单初始数据(新增招标相关参数)
|
||||
const initFormData = {
|
||||
id: undefined,
|
||||
projectId: currentProject.value?.id,
|
||||
whetherBid: '1', // 是否中标:0=中标,1=未中标
|
||||
bidPrice: undefined, // 中标价(人民币)
|
||||
bidFile: undefined // 中标通知书
|
||||
bidFileId: undefined, // 中标通知书
|
||||
biddingAgency: undefined, //招标代理机构
|
||||
tenderer: undefined, //招标人
|
||||
biddingDeadline: undefined, //投标截止时间
|
||||
bidopeningTime: undefined, //开标时间
|
||||
projectOverview: undefined, //项目概况
|
||||
constructionsite: undefined, //建设地点
|
||||
planDuration: undefined, //计划工期
|
||||
answeringDeadlineTime: undefined, //答疑截止时间
|
||||
clarifyDeadlineTime: undefined //澄清截止时间
|
||||
};
|
||||
|
||||
// 表单数据与验证规则(核心:是否中标/中标价/中标通知书均设为必填)
|
||||
// 表单数据与验证规则(核心:是否中标/中标价/中标通知书均设为必填,新增参数添加基础验证)
|
||||
const data = reactive({
|
||||
form: { ...initFormData } as ListOfWinningBidsForm,
|
||||
rules: {
|
||||
@ -187,7 +279,7 @@ const data = reactive({
|
||||
}
|
||||
],
|
||||
// 中标通知书:仅中标时必填
|
||||
bidFile: [
|
||||
bidFileId: [
|
||||
{
|
||||
required: true,
|
||||
message: '请上传中标通知书',
|
||||
@ -199,7 +291,25 @@ const data = reactive({
|
||||
callback();
|
||||
}
|
||||
}
|
||||
]
|
||||
],
|
||||
// 招标代理机构:必填
|
||||
biddingAgency: [{ required: true, message: '请输入招标代理机构', trigger: 'blur' }],
|
||||
// 招标人:必填
|
||||
tenderer: [{ required: true, message: '请输入招标人', trigger: 'blur' }],
|
||||
// 投标截止时间:必填
|
||||
biddingDeadline: [{ required: true, message: '请选择投标截止时间', trigger: 'change' }],
|
||||
// 开标时间:必填
|
||||
bidopeningTime: [{ required: true, message: '请选择开标时间', trigger: 'change' }],
|
||||
// 项目概况:必填
|
||||
projectOverview: [{ required: true, message: '请输入项目概况', trigger: 'blur' }],
|
||||
// 建设地点:必填
|
||||
constructionsite: [{ required: true, message: '请输入建设地点', trigger: 'blur' }],
|
||||
// 计划工期:必填
|
||||
planDuration: [{ required: true, message: '请输入计划工期', trigger: 'blur' }],
|
||||
// 答疑截止时间:必填
|
||||
answeringDeadlineTime: [{ required: true, message: '请选择答疑截止时间', trigger: 'change' }],
|
||||
// 澄清截止时间:必填
|
||||
clarifyDeadlineTime: [{ required: true, message: '请选择澄清截止时间', trigger: 'change' }]
|
||||
} as Record<string, any>
|
||||
});
|
||||
|
||||
@ -213,7 +323,14 @@ const getDictLabel = (dictList: any[], value: any) => {
|
||||
const dictItem = dictList.find((item) => item.value === value);
|
||||
return dictItem ? dictItem.label : '';
|
||||
};
|
||||
const upload = ref<UploadInstance>();
|
||||
|
||||
const handleExceed: UploadProps['onExceed'] = (files) => {
|
||||
upload.value!.clearFiles();
|
||||
const file = files[0] as UploadRawFile;
|
||||
file.uid = genFileId();
|
||||
upload.value!.handleStart(file);
|
||||
};
|
||||
/**
|
||||
* 初始化中标数据(根据项目ID查询已有记录)
|
||||
*/
|
||||
@ -221,9 +338,15 @@ const initData = async () => {
|
||||
try {
|
||||
if (currentProject.value?.id) {
|
||||
const res = await listListOfWinningBids({ projectId: currentProject.value.id });
|
||||
console.log(res);
|
||||
if (res.code === 200) {
|
||||
resetForm();
|
||||
if (res.data) {
|
||||
if (res.data.bidPrice) {
|
||||
iswhetherBid.value = true;
|
||||
} else {
|
||||
iswhetherBid.value = false;
|
||||
}
|
||||
Object.assign(form.value, res.data);
|
||||
isDisabled.value = true;
|
||||
} else {
|
||||
@ -240,7 +363,7 @@ const initData = async () => {
|
||||
/**
|
||||
* 提交表单(含项目信息更新+中标信息提交)
|
||||
*/
|
||||
const submitForm = () => {
|
||||
const submitForm = async () => {
|
||||
listOfWinningBidsFormRef.value?.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
buttonLoading.value = true;
|
||||
@ -248,26 +371,12 @@ const submitForm = () => {
|
||||
// 1. 同步项目ID和名称
|
||||
form.value.projectId = currentProject.value?.id;
|
||||
form.value.projectName = projectInfo.projectName;
|
||||
|
||||
// 2. 更新项目基础信息(若有变更)
|
||||
if (currentProject.value?.id) {
|
||||
await updateProject({ id: currentProject.value.id, ...projectInfo });
|
||||
}
|
||||
|
||||
// 3. 提交中标信息(新增/编辑)
|
||||
const isEdit = !!form.value.id;
|
||||
if (isEdit) {
|
||||
await updateListOfWinningBids(form.value);
|
||||
} else {
|
||||
await addListOfWinningBids(form.value);
|
||||
}
|
||||
|
||||
delete projectInfo.id;
|
||||
await addListOfWinningBids({ ...form.value, ...projectInfo });
|
||||
initData();
|
||||
// 4. 提交成功后切换为查看状态
|
||||
isDisabled.value = true;
|
||||
ElMessage.success(isEdit ? '编辑成功' : '提交成功');
|
||||
} catch (error) {
|
||||
ElMessage.error('提交失败,请重试');
|
||||
console.error('提交表单失败:', error);
|
||||
ElMessage.success('提交成功');
|
||||
} finally {
|
||||
buttonLoading.value = false;
|
||||
}
|
||||
@ -282,6 +391,7 @@ const getProjectDetail = async () => {
|
||||
try {
|
||||
if (currentProject.value?.id) {
|
||||
const res = await getProject(currentProject.value.id);
|
||||
|
||||
Object.assign(projectInfo, res.data);
|
||||
}
|
||||
} catch (error) {
|
||||
@ -364,6 +474,7 @@ onUnmounted(() => {
|
||||
.el-button {
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.el-button:hover {
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
@ -372,6 +483,7 @@ onUnmounted(() => {
|
||||
.el-form-item {
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.el-form-item:hover {
|
||||
border-color: #e6f7ff;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
||||
@ -382,6 +494,7 @@ onUnmounted(() => {
|
||||
.grid {
|
||||
display: grid;
|
||||
}
|
||||
|
||||
.grid-cols-1 {
|
||||
grid-template-columns: repeat(1, minmax(0, 1fr));
|
||||
}
|
||||
@ -391,6 +504,7 @@ onUnmounted(() => {
|
||||
.md\:grid-cols-2 {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.md\:col-span-2 {
|
||||
grid-column: span 2 / span 2;
|
||||
}
|
||||
@ -400,6 +514,7 @@ onUnmounted(() => {
|
||||
.lg\:grid-cols-3 {
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
}
|
||||
|
||||
.lg\:col-span-3 {
|
||||
grid-column: span 3 / span 3;
|
||||
}
|
||||
@ -409,18 +524,23 @@ onUnmounted(() => {
|
||||
.gap-6 {
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.mb-5 {
|
||||
margin-bottom: 1.25rem;
|
||||
}
|
||||
|
||||
.mb-6 {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.mt-4 {
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
.mt-6 {
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
|
||||
.mt-8 {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user