This commit is contained in:
tcy
2025-08-23 01:41:19 +08:00
18 changed files with 866 additions and 248 deletions

View File

@ -5,6 +5,9 @@ VITE_APP_TITLE = 煤科建管平台
VITE_APP_ENV = 'development' VITE_APP_ENV = 'development'
# 开发环境 # 开发环境
#朱银
# VITE_APP_BASE_API = 'http://192.168.110.149:8899'
#曾涛
VITE_APP_BASE_API = 'http://192.168.110.171:8899' VITE_APP_BASE_API = 'http://192.168.110.171:8899'
# 无人机接口地址 # 无人机接口地址

View File

@ -71,4 +71,16 @@ export const getFileList = (data) => {
method: 'get', method: 'get',
params: data params: data
}) })
}
/**
* 查看收入合同附件列表
* @param id
*/
export const getInfoByProjectId = (data) => {
return request({
url: '/bidding/listOfWinningBids/getInfoByProjectId',
method: 'get',
params: data
})
} }

View File

@ -122,3 +122,11 @@ export const editStatus = (query: any): AxiosPromise<any> => {
data: query data: query
}); });
}; };
//获取审核状态
export const getApproval = (id) => {
return request({
url: '/tender/tenderPlanLimitList/getVersionDetail',
method: 'get',
params: { versions: id }
});
};

View File

@ -1,11 +1,28 @@
<template> <template>
<div class="upload-file"> <div class="upload-file">
<el-upload ref="fileUploadRef" multiple :action="realUploadUrl" :before-upload="handleBeforeUpload" <el-upload
:file-list="fileList" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" ref="fileUploadRef"
:on-success="handleUploadSuccess" :show-file-list="showFileList" :headers="headers" class="upload-file-uploader" multiple
:list-type="isConstruction ? 'picture-card' : 'text'" :accept="accept" :drag="isDarg" :data="data" :action="realUploadUrl"
:auto-upload="autoUpload" :on-change="handleChange" :on-remove="handleRemove" :method="method" :before-upload="handleBeforeUpload"
:http-request="customUpload"> :file-list="fileList"
:limit="limit"
:on-error="handleUploadError"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:show-file-list="showFileList"
:headers="headers"
class="upload-file-uploader"
:list-type="isConstruction ? 'picture-card' : 'text'"
:accept="accept"
:drag="isDarg"
:data="data"
:auto-upload="autoUpload"
:on-change="handleChange"
:on-remove="handleRemove"
:method="method"
:http-request="customUpload"
>
<slot> <slot>
<div> <div>
<!-- 上传按钮 --> <!-- 上传按钮 -->
@ -24,10 +41,14 @@
的文件 的文件
</div> </div>
<!-- 文件列表 --> <!-- 文件列表 -->
<transition-group v-if="!isConstruction && !isImportInfo" <transition-group
class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul" @click.stop> v-if="!isConstruction && !isImportInfo"
<li style="margin-top: 10px" v-for="(file, index) in fileList" :key="file.uid" class="upload-file-list el-upload-list el-upload-list--text"
class="el-upload-list__item ele-upload-list__item-content"> name="el-fade-in-linear"
tag="ul"
@click.stop
>
<li style="margin-top: 10px" v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content">
<el-link :href="`${file.url}`" :underline="false" target="_blank"> <el-link :href="`${file.url}`" :underline="false" target="_blank">
<span class="el-icon-document"> {{ getFileName(file.name) }} </span> <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link> </el-link>
@ -180,13 +201,16 @@ watch(
}, },
{ deep: true, immediate: true } { deep: true, immediate: true }
); );
watch(() => props.defaultFileList, () => { watch(
if (props.defaultFileList.length === 0) return; () => props.defaultFileList,
props.defaultFileList.forEach((item: any) => { () => {
fileList.value.push(item); if (props.defaultFileList.length === 0) return;
}); props.defaultFileList.forEach((item: any) => {
fileList.value.push(item);
}, { deep: true, immediate: true }); });
},
{ deep: true, immediate: true }
);
// 上传前校检格式和大小 // 上传前校检格式和大小
const handleBeforeUpload = (file: any) => { const handleBeforeUpload = (file: any) => {
// 校检文件类型 // 校检文件类型
@ -424,7 +448,7 @@ defineExpose({ submitUpload });
} }
} }
>span { > span {
width: 100%; width: 100%;
} }
} }

View File

@ -176,22 +176,26 @@ service.interceptors.response.use(
} }
); );
// 通用下载方法 // 通用下载方法
export function download(url: string, params: any, fileName: string, isHeader) { export function download(url: string, params: any, fileName: string, isHeader?: boolean) {
downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' }); downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' });
// prettier-ignore // prettier-ignore
return service.post(url, params, { let data={
transformRequest: [ transformRequest: [
(params: any) => { (params: any) => {
return tansParams(params); return tansParams(params);
} }
], ],
headers: isHeader?{}:{ 'Content-Type': 'application/x-www-form-urlencoded' }, headers: isHeader?{'Content-Type': 'application/json'}:{ 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob' responseType: 'blob'
}).then(async (resp: any) => { }
if (isHeader) delete data.transformRequest;
return service
.post(url, params, data as any)
.then(async (resp: any) => {
const isLogin = blobValidate(resp); const isLogin = blobValidate(resp);
if (isLogin) { if (isLogin) {
console.log("🚀 ~ download ~ resp:", resp) console.log('🚀 ~ download ~ resp:', resp);
const blob = new Blob([resp]); const blob = new Blob([resp]);
FileSaver.saveAs(blob, fileName); FileSaver.saveAs(blob, fileName);
} else { } else {
@ -201,7 +205,8 @@ export function download(url: string, params: any, fileName: string, isHeader) {
ElMessage.error(errMsg); ElMessage.error(errMsg);
} }
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}).catch((r: any) => { })
.catch((r: any) => {
console.error(r); console.error(r);
ElMessage.error('下载文件出现错误,请联系管理员!'); ElMessage.error('下载文件出现错误,请联系管理员!');
downloadLoadingInstance.close(); downloadLoadingInstance.close();

View File

@ -32,7 +32,7 @@
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleExport()" v-hasPermi="['bidding:biddingLimitList:export']">导出excel</el-button> <el-button type="primary" @click="handleExport()" v-hasPermi="['bidding:biddingLimitList:export']">导出excel</el-button>
</el-form-item> </el-form-item>
<el-form-item> <!-- <el-form-item>
<el-button <el-button
type="primary" type="primary"
v-if="versionObj.status == 'draft' || versionObj.status == 'back'" v-if="versionObj.status == 'draft' || versionObj.status == 'back'"
@ -51,7 +51,7 @@
v-if="versionObj.status != 'draft'" v-if="versionObj.status != 'draft'"
>查看流程</el-button >查看流程</el-button
> >
</el-form-item> </el-form-item> -->
</el-form> </el-form>
</el-card> </el-card>
</transition> </transition>

View File

@ -1,7 +1,8 @@
<template> <template>
<div class="p-4 bg-gray-50 min-h-screen"> <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> <template #header>
<div class="bg-blue-50 px-6 rounded-t-xl" style="padding: 10px 20px"> <div class="bg-blue-50 px-6 rounded-t-xl" style="padding: 10px 20px">
@ -55,62 +56,133 @@
</div> </div>
</div> </div>
</div> </div>
<div class="mt-4 mb-6"> <!-- <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 @click="isDisabled = false" type="primary"
class="px-8 py-2.5 transition-all duration-300 font-medium" v-if="isDisabled">
点击编辑 点击编辑
</el-button> </el-button>
</div> </div> -->
</template> </template>
<!-- 中标信息表单区域 --> <!-- 中标信息表单区域 -->
<el-form <el-form :disabled="isDisabled" ref="listOfWinningBidsFormRef" :model="form" :rules="rules" label-width="150px"
:disabled="isDisabled" class="p-6 pt-4" style="background-color: #ffffff">
ref="listOfWinningBidsFormRef"
:model="form"
:rules="rules"
label-width="150px"
class="p-6 pt-4"
style="background-color: #ffffff"
>
<el-row :gutter="32"> <el-row :gutter="32">
<!-- 是否中标必填 --> <!-- 招标代理机构 -->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="是否中标" prop="whetherBid" class="rounded-lg border border-gray-100 p-1 mb-5"> <el-form-item label="招标代理机构" prop="biddingAgency" class="rounded-lg border border-gray-100 p-1 mb-5">
<el-radio-group v-model="form.whetherBid"> <el-input v-model="form.biddingAgency" placeholder="请输入招标代理机构" />
<el-radio label="0" border>中标</el-radio>
<el-radio label="1" border>未中标</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 中标价必填仅中标时显示 --> <!-- 招标人 -->
<el-col :span="12" v-if="form.whetherBid == '0'"> <el-col :span="12">
<el-form-item label="中标价(人民币)" prop="bidPrice" class="rounded-lg border border-gray-100 p-1 mb-5"> <el-form-item label="招标人" prop="tenderer" class="rounded-lg border border-gray-100 p-1 mb-5">
<el-input v-model="form.bidPrice" type="number" placeholder="请输入中标价" /> <el-input v-model="form.tenderer" placeholder="请输入招标人" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 中标通知书必填仅中标时显示 --> <!-- 投标截止时间 -->
<el-col :span="12" v-if="form.whetherBid == '0'"> <el-col :span="12">
<el-form-item label="中标通知书" prop="bidFile" class="rounded-lg border border-gray-100 p-1 mb-5"> <el-form-item label="投标截止时间" prop="biddingDeadline" 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-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-form-item>
</el-col> </el-col>
</el-row> </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-col :span="24" class="text-center">
<el-button <el-button :loading="buttonLoading" type="primary" @click="submitForm"
:loading="buttonLoading" v-hasPermi="['bidding:listOfWinningBids:add', 'bidding:listOfWinningBids:edit']" class="rounded-full px-8"
type="primary" size="large">
@click="submitForm"
v-hasPermi="['bidding:listOfWinningBids:add', 'bidding:listOfWinningBids:edit']"
class="rounded-full px-8"
size="large"
>
确认提交 确认提交
</el-button> </el-button>
<el-button type="default" @click="resetForm" class="ml-6 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-col>
</el-row> </el-row>
</el-form> </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> </el-card>
</div> </div>
</template> </template>
@ -122,14 +194,21 @@ import { ListOfWinningBidsForm } from '@/api/bidding/listOfWinningBids/types';
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { ElFormInstance, ElMessage } from 'element-plus'; import { ElFormInstance, ElMessage } from 'element-plus';
import { getProject, updateProject } from '@/api/project/project'; 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 { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { project_type, project_stage } = toRefs<any>(proxy?.useDict('project_type', 'project_stage')); const { project_type, project_stage } = toRefs<any>(proxy?.useDict('project_type', 'project_stage'));
const headers = ref(globalHeaders());
const fileList = ref([]);
// 用户状态管理与当前项目 // 用户状态管理与当前项目
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
const iswhetherBid = ref(false); // 是否中标
const currentProject = computed(() => userStore.selectedProject); 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({ const projectInfo = reactive({
principal: undefined, principal: undefined,
@ -150,18 +229,31 @@ const projectInfo = reactive({
// 表单核心变量 // 表单核心变量
const listOfWinningBidsFormRef = ref<ElFormInstance>(); const listOfWinningBidsFormRef = ref<ElFormInstance>();
const buttonLoading = ref(false); const buttonLoading = ref(false);
const buttonLoading1 = ref(false);
const isDisabled = ref(false); const isDisabled = ref(false);
const fileObj = ref({
// 表单初始数据 bidFile: undefined,
bidFileName: undefined
});
// 表单初始数据(新增招标相关参数)
const initFormData = { const initFormData = {
id: undefined, id: undefined,
projectId: currentProject.value?.id, projectId: currentProject.value?.id,
whetherBid: '1', // 是否中标0=中标1=未中标 whetherBid: '1', // 是否中标0=中标1=未中标
bidPrice: undefined, // 中标价(人民币) 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({ const data = reactive({
form: { ...initFormData } as ListOfWinningBidsForm, form: { ...initFormData } as ListOfWinningBidsForm,
rules: { rules: {
@ -187,7 +279,7 @@ const data = reactive({
} }
], ],
// 中标通知书:仅中标时必填 // 中标通知书:仅中标时必填
bidFile: [ bidFileId: [
{ {
required: true, required: true,
message: '请上传中标通知书', message: '请上传中标通知书',
@ -199,7 +291,25 @@ const data = reactive({
callback(); 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> } as Record<string, any>
}); });
@ -213,7 +323,14 @@ const getDictLabel = (dictList: any[], value: any) => {
const dictItem = dictList.find((item) => item.value === value); const dictItem = dictList.find((item) => item.value === value);
return dictItem ? dictItem.label : ''; 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查询已有记录 * 初始化中标数据根据项目ID查询已有记录
*/ */
@ -221,9 +338,15 @@ const initData = async () => {
try { try {
if (currentProject.value?.id) { if (currentProject.value?.id) {
const res = await listListOfWinningBids({ projectId: currentProject.value.id }); const res = await listListOfWinningBids({ projectId: currentProject.value.id });
console.log(res);
if (res.code === 200) { if (res.code === 200) {
resetForm(); resetForm();
if (res.data) { if (res.data) {
if (res.data.bidPrice) {
iswhetherBid.value = true;
} else {
iswhetherBid.value = false;
}
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
isDisabled.value = true; isDisabled.value = true;
} else { } else {
@ -240,7 +363,7 @@ const initData = async () => {
/** /**
* 提交表单(含项目信息更新+中标信息提交) * 提交表单(含项目信息更新+中标信息提交)
*/ */
const submitForm = () => { const submitForm = async () => {
listOfWinningBidsFormRef.value?.validate(async (valid: boolean) => { listOfWinningBidsFormRef.value?.validate(async (valid: boolean) => {
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
@ -248,26 +371,12 @@ const submitForm = () => {
// 1. 同步项目ID和名称 // 1. 同步项目ID和名称
form.value.projectId = currentProject.value?.id; form.value.projectId = currentProject.value?.id;
form.value.projectName = projectInfo.projectName; form.value.projectName = projectInfo.projectName;
delete projectInfo.id;
// 2. 更新项目基础信息(若有变更) await addListOfWinningBids({ ...form.value, ...projectInfo });
if (currentProject.value?.id) { initData();
await updateProject({ id: currentProject.value.id, ...projectInfo });
}
// 3. 提交中标信息(新增/编辑)
const isEdit = !!form.value.id;
if (isEdit) {
await updateListOfWinningBids(form.value);
} else {
await addListOfWinningBids(form.value);
}
// 4. 提交成功后切换为查看状态 // 4. 提交成功后切换为查看状态
isDisabled.value = true; isDisabled.value = true;
ElMessage.success(isEdit ? '编辑成功' : '提交成功'); ElMessage.success('提交成功');
} catch (error) {
ElMessage.error('提交失败,请重试');
console.error('提交表单失败:', error);
} finally { } finally {
buttonLoading.value = false; buttonLoading.value = false;
} }
@ -282,6 +391,7 @@ const getProjectDetail = async () => {
try { try {
if (currentProject.value?.id) { if (currentProject.value?.id) {
const res = await getProject(currentProject.value.id); const res = await getProject(currentProject.value.id);
Object.assign(projectInfo, res.data); Object.assign(projectInfo, res.data);
} }
} catch (error) { } catch (error) {
@ -364,6 +474,7 @@ onUnmounted(() => {
.el-button { .el-button {
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.el-button:hover { .el-button:hover {
transform: translateY(-1px); transform: translateY(-1px);
} }
@ -372,6 +483,7 @@ onUnmounted(() => {
.el-form-item { .el-form-item {
transition: all 0.2s ease; transition: all 0.2s ease;
} }
.el-form-item:hover { .el-form-item:hover {
border-color: #e6f7ff; border-color: #e6f7ff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
@ -382,6 +494,7 @@ onUnmounted(() => {
.grid { .grid {
display: grid; display: grid;
} }
.grid-cols-1 { .grid-cols-1 {
grid-template-columns: repeat(1, minmax(0, 1fr)); grid-template-columns: repeat(1, minmax(0, 1fr));
} }
@ -391,6 +504,7 @@ onUnmounted(() => {
.md\:grid-cols-2 { .md\:grid-cols-2 {
grid-template-columns: repeat(2, minmax(0, 1fr)); grid-template-columns: repeat(2, minmax(0, 1fr));
} }
.md\:col-span-2 { .md\:col-span-2 {
grid-column: span 2 / span 2; grid-column: span 2 / span 2;
} }
@ -400,6 +514,7 @@ onUnmounted(() => {
.lg\:grid-cols-3 { .lg\:grid-cols-3 {
grid-template-columns: repeat(3, minmax(0, 1fr)); grid-template-columns: repeat(3, minmax(0, 1fr));
} }
.lg\:col-span-3 { .lg\:col-span-3 {
grid-column: span 3 / span 3; grid-column: span 3 / span 3;
} }
@ -409,18 +524,23 @@ onUnmounted(() => {
.gap-6 { .gap-6 {
gap: 1.5rem; gap: 1.5rem;
} }
.mb-5 { .mb-5 {
margin-bottom: 1.25rem; margin-bottom: 1.25rem;
} }
.mb-6 { .mb-6 {
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
} }
.mt-4 { .mt-4 {
margin-top: 1rem; margin-top: 1rem;
} }
.mt-6 { .mt-6 {
margin-top: 1.5rem; margin-top: 1.5rem;
} }
.mt-8 { .mt-8 {
margin-top: 2rem; margin-top: 2rem;
} }

View File

@ -25,6 +25,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="name" label="名称" /> <el-table-column prop="name" label="名称" />
<el-table-column prop="content" label="内容" /> <el-table-column prop="content" label="内容" />
<el-table-column prop="price" label="限价" />
<el-table-column prop="plannedBiddingTime" label="计划招标时间" align="center"> <el-table-column prop="plannedBiddingTime" label="计划招标时间" align="center">
<template #default="scope"> <template #default="scope">
<el-date-picker v-model="scope.row.plannedBiddingTime" type="date" value-format="YYYY-MM-DD" placeholder="选择时间" /> <el-date-picker v-model="scope.row.plannedBiddingTime" type="date" value-format="YYYY-MM-DD" placeholder="选择时间" />
@ -36,7 +37,7 @@
>详情</el-button >详情</el-button
> >
<el-button type="primary" size="small" @click="handleSave(scope.row)" v-hasPermi="['tender:segmentedIndicatorPlanning:edit']" <el-button type="primary" size="small" @click="handleSave(scope.row)" v-hasPermi="['tender:segmentedIndicatorPlanning:edit']"
>修改</el-button >确定</el-button
> >
<el-button type="danger" size="small" @click="delHandle(scope.row)" v-hasPermi="['tender:segmentedIndicatorPlanning:remove']" <el-button type="danger" size="small" @click="delHandle(scope.row)" v-hasPermi="['tender:segmentedIndicatorPlanning:remove']"
>删除</el-button >删除</el-button

View File

@ -35,6 +35,12 @@
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleExport()" v-hasPermi="['tender:billofquantitiesLimitList:export']">导出excel</el-button> <el-button type="primary" @click="handleExport()" v-hasPermi="['tender:billofquantitiesLimitList:export']">导出excel</el-button>
</el-form-item> </el-form-item>
<el-form-item>
<el-button type="primary" v-if="reviewStatus == 'draft'" @click="clickApprovalSheet()">审核</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" v-if="reviewStatus != 'draft'" @click="clickApprovalSheet()">查看流程</el-button>
</el-form-item>
</el-form> </el-form>
</el-card> </el-card>
</transition> </transition>
@ -44,7 +50,7 @@
<el-table-column prop="name" label="工程或费用名称" /> <el-table-column prop="name" label="工程或费用名称" />
<el-table-column prop="unit" label="单位" /> <el-table-column prop="unit" label="单位" />
<el-table-column prop="quantity" label="数量" /> <el-table-column prop="quantity" label="数量" />
<el-table-column prop="remark" label="单价" align="center"> <el-table-column prop="unitPrice" label="单价" align="center">
<template #default="scope"> <template #default="scope">
<el-input-number <el-input-number
:model-value="scope.row.unitPrice" :model-value="scope.row.unitPrice"
@ -81,7 +87,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { listBillofquantitiesLimitList, obtainAllVersionNumbers, sheetList, updatePrice, importExcelFile } from '@/api/contract/index'; import { listBillofquantitiesLimitList, obtainAllVersionNumbers, sheetList, updatePrice, importExcelFile } from '@/api/contract/index';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as any;
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
const currentProject = computed(() => userStore.selectedProject); const currentProject = computed(() => userStore.selectedProject);
@ -94,6 +100,7 @@ const options = ref<any[]>([]);
const sheets = ref<any[]>([]); const sheets = ref<any[]>([]);
const tableData = ref<any[]>([]); const tableData = ref<any[]>([]);
const isExpandAll = ref(false); const isExpandAll = ref(false);
const reviewStatus = ref('');
//获取版本号 //获取版本号
const getVersionNums = async () => { const getVersionNums = async () => {
@ -110,6 +117,7 @@ const getVersionNums = async () => {
options.value = res.data; options.value = res.data;
if (res.data.length > 0) { if (res.data.length > 0) {
queryForm.value.versions = res.data[0].versions; queryForm.value.versions = res.data[0].versions;
reviewStatus.value = res.data[0].status;
getSheetName(); getSheetName();
} else { } else {
@ -129,7 +137,12 @@ const getVersionNums = async () => {
} }
}; };
//选择版本号 //选择版本号
const changeVersions = () => { const changeVersions = (val) => {
options.value.forEach((item) => {
if (item.versions == val) {
reviewStatus.value = item.status;
}
});
getSheetName(); getSheetName();
}; };
@ -179,14 +192,10 @@ const getTableData = async () => {
}; };
const res = await listBillofquantitiesLimitList(params); const res = await listBillofquantitiesLimitList(params);
if (res.code == 200) { if (res.code == 200) {
tableData.value = [res.data[0]]; tableData.value = res.data;
} }
} catch (error) { } catch (error) {
console.log(error); console.log(error);
ElMessage({
message: '获取表格失败',
type: 'error'
});
tableData.value = []; tableData.value = [];
loading.value = false; loading.value = false;
} finally { } finally {
@ -269,8 +278,23 @@ const handleExport = () => {
`限价一览表${queryForm.value.sheet}.xlsx` `限价一览表${queryForm.value.sheet}.xlsx`
); );
}; };
// 审批
const clickApprovalSheet = () => {
proxy.$tab.closePage(proxy?.$route);
proxy?.$router.push({
path: `/approval/contractLimitPrice/indexEdit`,
query: {
projectId: currentProject.value?.id,
versions: queryForm.value.versions,
sheet: queryForm.value.sheet,
type: 'update',
status: reviewStatus.value
}
});
};
onUnmounted(() => { onUnmounted(() => {
listeningProject(); listeningProject();
console.log(11111111);
}); });
onMounted(() => { onMounted(() => {
getVersionNums(); getVersionNums();

View File

@ -0,0 +1,369 @@
<template>
<div class="p-4 bg-gray-50">
<div class="max-w-4xl mx-auto">
<!-- 顶部按钮区域 -->
<el-card class="mb-4 rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md">
<approvalButton
@submitForm="submitForm"
@approvalVerifyOpen="approvalVerifyOpen"
@handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading"
:id="form.versions"
:status="form.status"
:pageType="routeParams.type"
/>
</el-card>
<!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">合同限价审核</h3>
</div>
<div class="p-6">
<el-form
ref="leaveFormRef"
v-loading="loading"
:disabled="routeParams.type === 'view' || form.status == 'waiting'"
:model="form"
:rules="rules"
label-width="100px"
class="space-y-4"
>
<div class="grid grid-cols-1 gap-4">
<el-row>
<el-col :span="12">
<el-form-item label="版本号" prop="formNo">
<el-input disabled v-model="form.versions" placeholder="请输入文件名称" />
</el-form-item>
<el-form-item label="表名" prop="formNo">
<el-input disabled v-model="form.sheet" placeholder="请输入文件名称" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<el-table :data="tableData" style="width: 100%; margin-bottom: 20px; height: calc(100vh - 305px)" row-key="id" default-expand-all border>
<el-table-column prop="num" label="编号" />
<el-table-column prop="name" label="名称" />
<el-table-column prop="specification" label="规格" />
<el-table-column prop="unit" label="单位" />
<el-table-column prop="quantity" label="数量" />
<el-table-column prop="unitPrice" label="单价" align="center" />
<el-table-column prop="price" label="总价" align="center">
<template #default="scope">
{{ scope.row.price }}
</template>
</el-table-column>
</el-table>
</div>
</el-card>
<!-- 提交组件 -->
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<approvalRecord ref="approvalRecordRef"></approvalRecord>
<!-- 流程选择对话框 -->
<el-dialog
draggable
v-model="dialogVisible.visible"
:title="dialogVisible.title"
:before-close="handleClose"
width="500"
class="rounded-lg shadow-lg"
>
<div class="p-4">
<p class="text-gray-600 mb-4">请选择要启动的流程</p>
<el-select v-model="flowCode" placeholder="请选择流程" style="width: 100%">
<el-option v-for="item in flowCodeOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<template #footer>
<div class="dialog-footer p-4 border-t border-gray-100 flex justify-end space-x-3">
<el-button @click="handleClose" class="px-4 py-2 border border-gray-300 rounded-md text-gray-700 hover:bg-gray-50 transition-colors"
>取消</el-button
>
<el-button type="primary" @click="submitFlow()" class="px-4 py-2 bg-primary text-white rounded-md hover:bg-primary/90 transition-colors"
>确认</el-button
>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<script setup name="Leave" lang="ts">
import { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types';
import { startWorkFlow } from '@/api/workflow/task';
import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as any;
import { useUserStoreHook } from '@/store/modules/user';
const { design_change_reason_type } = toRefs<any>(proxy?.useDict('design_change_reason_type'));
import { listBillofquantitiesLimitList } from '@/api/contract/index';
// 获取用户 store
const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject);
const buttonLoading = ref(false);
const loading = ref(true);
//路由参数
const routeParams = ref<Record<string, any>>({});
const flowCode = ref<string>('');
const status = ref<string>('');
const dialogVisible = reactive<DialogOption>({
visible: false,
title: '流程定义'
});
//提交组件
const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>();
//审批记录组件
const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//按钮组件
const flowCodeOptions = [
{
value: currentProject.value?.id + '_xianjiayilan',
label: '合约限价审核'
}
];
const leaveFormRef = ref<ElFormInstance>();
const dialog = reactive({
visible: false,
title: '',
isEdit: false
});
const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: '',
variables: {}
});
const taskVariables = ref<Record<string, any>>({});
const initFormData = {
versions: '',
sheet: '',
status: ''
};
const data = reactive({
form: { ...initFormData },
tableData: [],
rules: {}
});
const handleClose = () => {
dialogVisible.visible = false;
flowCode.value = '';
buttonLoading.value = false;
};
const { form, rules, tableData } = toRefs(data);
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
/** 获取详情 */
const getInfo = () => {
loading.value = true;
buttonLoading.value = false;
nextTick(async () => {
const res = await listBillofquantitiesLimitList({
projectId: routeParams.value?.id,
versions: routeParams.value.versions,
sheet: routeParams.value.sheet
});
console.log('res.data', res.data);
Object.assign(form.value, routeParams.value);
console.log('form', form.value);
tableData.value = res.data;
console.log('tableData', tableData.value);
loading.value = false;
buttonLoading.value = false;
});
};
/** 提交按钮 */
const submitForm = (status1: string) => {
status.value = status1;
submit(status.value, form.value);
};
const submitFlow = async () => {
handleStartWorkFlow(form.value);
dialogVisible.visible = false;
};
//提交申请
const handleStartWorkFlow = async (data: any) => {
try {
submitFormData.value.flowCode = flowCode.value;
submitFormData.value.businessId = data.versions + '_xianjiayilan';
//流程变量
taskVariables.value = {
// leave4/5 使用的流程变量
userList: ['1', '3', '4']
};
submitFormData.value.variables = taskVariables.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;
submitVerifyRef.value.openDialog(resp.data.taskId);
}
} finally {
buttonLoading.value = false;
}
};
//审批记录
const handleApprovalRecord = () => {
approvalRecordRef.value.init(form.value.versions);
};
//提交回调
const submitCallback = async () => {
await proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1);
};
//审批
const approvalVerifyOpen = async () => {
submitVerifyRef.value.openDialog(routeParams.value.taskId);
};
// 图纸上传成功之后 开始提交
const submit = async (status, data) => {
form.value = data;
if (status === 'draft') {
buttonLoading.value = false;
proxy?.$modal.msgSuccess('暂存成功');
proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1);
} else {
if ((form.value.status === 'draft' && (flowCode.value === '' || flowCode.value === null)) || routeParams.value.type === 'add') {
flowCode.value = flowCodeOptions[0].value;
dialogVisible.visible = true;
return;
}
//说明启动过先随意穿个参数
if (flowCode.value === '' || flowCode.value === null) {
flowCode.value = 'xx';
}
await handleStartWorkFlow(data);
}
};
onMounted(() => {
nextTick(async () => {
routeParams.value = proxy.$route.query;
reset();
loading.value = false;
console.log(routeParams.value);
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
getInfo();
console.log('routeParams.value', routeParams.value);
}
});
});
</script>
<style scoped lang="scss">
/* 全局样式 */
:root {
--primary: #409eff;
--primary-light: #66b1ff;
--primary-dark: #3a8ee6;
--success: #67c23a;
--warning: #e6a23c;
--danger: #f56c6c;
--info: #909399;
}
/* 表单样式优化 */
.el-form-item {
.el-form-item__label {
color: #606266;
font-weight: 500;
}
.el-input__inner,
.el-select .el-input__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
.el-textarea__inner {
border-radius: 4px;
transition:
border-color 0.2s,
box-shadow 0.2s;
&:focus {
border-color: var(--primary-light);
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
}
}
/* 按钮样式优化 */
.el-button {
border-radius: 4px;
transition: all 0.2s;
&.is-primary {
background-color: var(--primary);
border-color: var(--primary);
&:hover {
background-color: var(--primary-light);
border-color: var(--primary-light);
}
&:active {
background-color: var(--primary-dark);
border-color: var(--primary-dark);
}
}
&.is-text {
color: var(--primary);
&:hover {
color: var(--primary-light);
background-color: rgba(64, 158, 255, 0.05);
}
}
}
/* 卡片样式优化 */
.el-card {
transition: all 0.3s ease;
&:hover {
/* transform: translateY(-2px); */
}
}
/* 对话框样式优化 */
.el-dialog {
.el-dialog__header {
background-color: #f5f7fa;
border-bottom: 1px solid #ebeef5;
padding: 15px 20px;
}
.el-dialog__title {
font-size: 16px;
font-weight: 600;
color: #303133;
}
.el-dialog__footer {
padding: 15px 20px;
border-top: 1px solid #ebeef5;
}
}
</style>

View File

@ -151,7 +151,7 @@
</template> </template>
<script setup name="IncomeContract" lang="ts"> <script setup name="IncomeContract" lang="ts">
import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract, getFileList } from '@/api/ctr/incomeContract'; import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract, getFileList, getInfoByProjectId } from '@/api/ctr/incomeContract';
import { IncomeContractVO, IncomeContractQuery, IncomeContractForm } from '@/api/ctr/incomeContract/types'; import { IncomeContractVO, IncomeContractQuery, IncomeContractForm } from '@/api/ctr/incomeContract/types';
import FileList from '@/components/FileList/index.vue'; import FileList from '@/components/FileList/index.vue';
import useUserStore from '@/store/modules/user'; import useUserStore from '@/store/modules/user';

View File

@ -31,7 +31,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="业主单位" prop="contractOwner"> <el-form-item label="业主单位" prop="contractOwner">
<el-input v-model="form.contractOwner" placeholder="请输入业主单位" /> <el-input disabled v-model="form.contractOwner" placeholder="请输入业主单位" />
</el-form-item> </el-form-item>
<el-form-item label="承包内容" v-if="contract_type !== 'income'"> <el-form-item label="承包内容" v-if="contract_type !== 'income'">
<editor v-model="form.contractedContent" :min-height="192" /> <editor v-model="form.contractedContent" :min-height="192" />
@ -89,7 +89,7 @@
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" /> <el-input v-model="form.remark" placeholder="请输入备注" />
</el-form-item> </el-form-item>
<el-form-item label="附件"> <el-form-item label="合同附件">
<FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess" <FileUpload :multiple="true" :fileType="['pdf']" :onUploadSuccess="onUploadSuccess"
:ref="fileRef" :defaultFileList="tempFileList" /> :ref="fileRef" :defaultFileList="tempFileList" />
</el-form-item> </el-form-item>
@ -156,8 +156,9 @@
<script setup> <script setup>
import FileUpload from '@/components/FileUpload'; import FileUpload from '@/components/FileUpload';
import { listExpensesContract, getExpensesContract, delExpensesContract, addExpensesContract, updateExpensesContract, getTenderPlan } from '@/api/ctr/expensesContract'; import { listExpensesContract, getExpensesContract, delExpensesContract, addExpensesContract, updateExpensesContract, getTenderPlan } from '@/api/ctr/expensesContract';
import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract } from '@/api/ctr/incomeContract'; import { listIncomeContract, getIncomeContract, delIncomeContract, addIncomeContract, updateIncomeContract, getInfoByProjectId } from '@/api/ctr/incomeContract';
import { useUserStore } from '@/store/modules/user'; import { useUserStore } from '@/store/modules/user';
const active = ref(0); const active = ref(0);
const contract_type = ref("") const contract_type = ref("")
const form = ref({ payType: 1 }) const form = ref({ payType: 1 })
@ -290,6 +291,7 @@ const resetForm = () => {
localStorage.removeItem("tempContractForm"); localStorage.removeItem("tempContractForm");
}, 0); }, 0);
}; };
const submitForm = async () => { const submitForm = async () => {
await payMentRef.value.validate(async (valid) => { await payMentRef.value.validate(async (valid) => {
if (valid) { if (valid) {
@ -391,7 +393,15 @@ watch(form, (val) => {
watch(fileList, (val) => { watch(fileList, (val) => {
localStorage.setItem("tempContractForm", JSON.stringify({ ...form.value, fileList: val })); localStorage.setItem("tempContractForm", JSON.stringify({ ...form.value, fileList: val }));
}, { deep: true }); }, { deep: true });
// 获取投标列表
const getInfoByProjectIdList = async () => {
const res = await getInfoByProjectId({ projectId: userStore.selectedProject.id, });
console.log(res);
form.value.contractOwner = res.data.planDuration;
}
onMounted(() => { onMounted(() => {
getInfoByProjectIdList();
const tempForm = localStorage.getItem("tempContractForm"); const tempForm = localStorage.getItem("tempContractForm");
if (tempForm) { if (tempForm) {
ElMessageBox.confirm('检测到有未完成的合同录入,是否继续?', '提示', { ElMessageBox.confirm('检测到有未完成的合同录入,是否继续?', '提示', {

View File

@ -83,7 +83,7 @@
<!-- 添加或修改月度产值计划对话框 --> <!-- 添加或修改月度产值计划对话框 -->
<el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> <el-dialog draggable :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
<el-form ref="monthPlanFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="monthPlanFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="计划产值" prop="planValue"> <el-form-item label="类型" prop="planValue">
<el-select v-model="form.type" placeholder="请选择类型"> <el-select v-model="form.type" placeholder="请选择类型">
<el-option label="对甲" value="1" /> <el-option label="对甲" value="1" />
<el-option label="对乙" value="2" /> <el-option label="对乙" value="2" />

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <el-tabs type="border-card" @tab-change="handleTabChange" v-model="activeTab">
<div v-show="showSearch" class="mb-[10px]"> <el-tab-pane v-for="(item, index) in tabList" :key="index" :label="item.label" :name="item.value">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="计划月份" prop="month"> <el-form-item label="计划月份" prop="month">
@ -13,70 +13,66 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
</div> <el-card shadow="never">
</transition> <el-table v-loading="loading" :data="tableData">
<el-card shadow="never"> <el-table-column label="项目" align="center" prop="projectName" />
<template #header> <el-table-column label="项目总产值" align="center" prop="totalValue" />
<el-row :gutter="10" class="mb8"> <el-table-column label="月预计产值" align="center" prop="monthlyEstimatedValue" />
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <el-table-column label="完成产值(第一周)" align="center" prop="firstWeekCompletionValue" />
</el-row> <el-table-column label="完成产值(第二周)" align="center" prop="secondWeekCompletionValue" />
</template> <el-table-column label="完成产值(第三周)" align="center" prop="thirdWeekCompletionValue" />
<el-table-column label="完成产值(第四周)" align="center" prop="fourthWeekCompletionValue" />
<el-table v-loading="loading" :data="valueAllocationList"> <el-table-column label="完成产值(第五周)" align="center" prop="fifthWeekCompletionValue" />
<el-table-column label="项目" align="center" prop="projectName" /> <el-table-column label="完成产值月合计" align="center" prop="totalCompletionValue" />
<el-table-column label="项目总产值" align="center" prop="totalValue" /> <el-table-column label="产值差额" align="center" prop="valueDifference" />
<el-table-column label="预计产值" align="center" prop="monthlyEstimatedValue" /> <el-table-column label="预计累计产值" align="center" prop="estimatedAccumulatedValue" />
<el-table-column label="完成产值(第一周)" align="center" prop="firstWeekCompletionValue" /> <el-table-column label="累计完成产值" align="center" prop="accumulatedCompletionValue" />
<el-table-column label="完成产值(第二周)" align="center" prop="secondWeekCompletionValue" /> <el-table-column label="产值差额" align="center" prop="valueDifferenceAccumulation" />
<el-table-column label="完成产值(第三周)" align="center" prop="thirdWeekCompletionValue" /> <el-table-column label="项目完成总进度" align="center" prop="totalCompletionProgress" />
<el-table-column label="完成产值(第四周)" align="center" prop="fourthWeekCompletionValue" /> </el-table>
<el-table-column label="完成产值(第五周)" align="center" prop="fifthWeekCompletionValue" /> <pagination
<el-table-column label="完成产值月合计" align="center" prop="totalCompletionValue" /> v-show="total > 0"
<el-table-column label="产值差额" align="center" prop="valueDifference" /> :total="total"
<el-table-column label="预计累计产值" align="center" prop="estimatedAccumulatedValue" /> v-model:page="queryParams.pageNum"
<el-table-column label="累计完成产值" align="center" prop="accumulatedCompletionValue" /> v-model:limit="queryParams.pageSize"
<el-table-column label="产值差额" align="center" prop="valueDifferenceAccumulation" /> @pagination="getList"
<el-table-column label="项目完成总进度" align="center" prop="totalCompletionProgress" /> />
</el-table> </el-card>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-tab-pane>
</el-card> </el-tabs>
</div> </div>
</template> </template>
<script setup name="ValueAllocation" lang="ts"> <script setup lang="ts">
import { listOutTable } from '@/api/out/outTable';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { dayjs } from 'element-plus';
// 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目
const currentProject = computed(() => userStore.selectedProject); const currentProject = computed(() => userStore.selectedProject);
const valueAllocationList = ref([]); const activeTab = ref('1');
const loading = ref(true); const queryParams = ref({
const showSearch = ref(true); month: '',
const total = ref(0); pageNum: 1,
pageSize: 10
const queryFormRef = ref<ElFormInstance>();
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value?.id,
month: undefined
}
}); });
const total = ref(0);
const tableData = ref([]);
const loading = ref(false);
const { queryParams } = toRefs(data); const tabList = [
{
value: '1',
label: '对甲施工报表'
},
{
value: '2',
label: '对乙施工报表'
}
];
/** 查询项目总产值分配列表 */ //切换表单
const getList = async () => { const handleTabChange = (tab) => {
loading.value = true; activeTab.value = tab;
queryParams.value.month = '';
const res = await listOutTable(queryParams.value); handleQuery();
valueAllocationList.value = res.rows;
total.value = res.total;
loading.value = false;
}; };
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -87,38 +83,18 @@ const handleQuery = () => {
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
queryFormRef.value?.resetFields(); queryParams.value.month = '';
handleQuery(); handleQuery();
}; };
// 获取列表
/** 导出按钮操作 */ const getList = async () => {
const handleExport = () => { const params = {
proxy?.download( ...queryParams.value,
'out/valueAllocation/export', projectId: currentProject.value?.id,
{ activeTab: activeTab.value
...queryParams.value };
}, console.log(params);
`valueAllocation_${new Date().getTime()}.xlsx`
);
}; };
onMounted(() => {
// 也可以使用字符串格式(例如 YYYY-MM
const currentMonthString = ref(dayjs().format('YYYY-MM'));
queryParams.value.month = currentMonthString.value;
getList();
});
//监听项目id刷新数据
const listeningProject = watch(
() => currentProject.value?.id,
(nid, oid) => {
queryParams.value.projectId = nid;
getList();
}
);
onUnmounted(() => {
listeningProject();
});
</script> </script>
<style scoped lang="scss"></style>

View File

@ -153,7 +153,6 @@ import {
} from '@/api/progress/progressCategory'; } from '@/api/progress/progressCategory';
import { ProgressCategoryVO, ProgressCategoryQuery, ProgressCategoryForm } from '@/api/progress/progressCategory/types'; import { ProgressCategoryVO, ProgressCategoryQuery, ProgressCategoryForm } from '@/api/progress/progressCategory/types';
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { download } from '@/utils/request';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { progress_unit_type, progress_work_type } = toRefs<any>(proxy?.useDict('progress_unit_type', 'progress_work_type')); const { progress_unit_type, progress_work_type } = toRefs<any>(proxy?.useDict('progress_unit_type', 'progress_work_type'));
@ -367,9 +366,14 @@ const handleUpdate = async (row: ProgressCategoryVO) => {
const handleExport = async () => { const handleExport = async () => {
const ids = treeRef.value.getCheckedNodes()[0].pathNodes[0].childrenData.map((item) => item.matrixId); const ids = treeRef.value.getCheckedNodes()[0].pathNodes[0].childrenData.map((item) => item.matrixId);
const res = await downloadProgressCategory({ ids }); proxy?.download(
download('/progress/progressCategory/export', { ids }, '方阵.xlsx', true); '/progress/progressCategory/export',
// window.open(res.data); {
ids: ids
},
`qualityInspection_${new Date().getTime()}.xlsx`,
true
);
}; };
/** 提交按钮 */ /** 提交按钮 */

View File

@ -27,7 +27,7 @@
class="upload-demo" class="upload-demo"
:http-request="importExcel" :http-request="importExcel"
:show-file-list="false" :show-file-list="false"
v-hasPermi="['tender:billofquantitiesLimitList:importExcelFile']" v-hasPermi="['tender:tenderPlanLimitList:importExcelFile']"
> >
<template #trigger> <template #trigger>
<el-button type="primary">导入excel</el-button> <el-button type="primary">导入excel</el-button>
@ -35,7 +35,7 @@
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleExport()" v-hasPermi="['tender:billofquantitiesLimitList:export']">导出excel</el-button> <el-button type="primary" @click="handleExport()" v-hasPermi="['tender:tenderPlanLimitList:export']">导出excel</el-button>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="handleAudit()">审核</el-button> <el-button type="primary" @click="handleAudit()">审核</el-button>
@ -73,7 +73,7 @@
size="small" size="small"
@click="handleSave(scope.row)" @click="handleSave(scope.row)"
v-if="scope.row.quantity && scope.row.quantity != 0" v-if="scope.row.quantity && scope.row.quantity != 0"
v-hasPermi="['tender:billofquantitiesLimitList:edit']" v-hasPermi="['tender:tenderPlanLimitList:edit']"
>确定</el-button >确定</el-button
> >
</template> </template>
@ -107,7 +107,7 @@ const queryForm = ref({
sheet: '' sheet: ''
}); });
const versionsData = ref({}); const versionsData = ref<any>({});
const activeTab = ref('2'); const activeTab = ref('2');
const sheets = ref([]); const sheets = ref([]);
@ -272,9 +272,11 @@ const handleSave = (row: any) => {
/** 审核按钮操作 */ /** 审核按钮操作 */
const handleAudit = async () => { const handleAudit = async () => {
proxy?.$tab.openPage('/approval/tenderPlan/indexEdit', '审核招标一览', { proxy?.$tab.openPage('/approval/tenderBidd/indexEdit', '审核招标一览', {
id: queryForm.value.versions, id: queryForm.value.versions,
type: 'update' type: 'update',
activeTab: activeTab.value,
status: versionsData.value.status
}); });
}; };

View File

@ -9,33 +9,44 @@
@handleApprovalRecord="handleApprovalRecord" @handleApprovalRecord="handleApprovalRecord"
:buttonLoading="buttonLoading" :buttonLoading="buttonLoading"
:id="form.id" :id="form.id"
:status="form.auditStatus" :status="form.status"
:pageType="routeParams.type" :pageType="routeParams.type"
/> />
</el-card> </el-card>
<!-- 表单区域 --> <!-- 表单区域 -->
<el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden"> <el-card class="rounded-lg shadow-sm bg-white border border-gray-100 transition-all hover:shadow-md overflow-hidden">
<div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100"> <div class="p-4 bg-gradient-to-r from-blue-50 to-indigo-50 border-b border-gray-100">
<h3 class="text-lg font-semibold text-gray-800">施工产值</h3> <h3 class="text-lg font-semibold text-gray-800">招标一览</h3>
</div> </div>
<div class="p-6"> <div class="p-6">
<el-table ref="tableRef" v-loading="loading" :data="tableData" row-key="id" border lazy default-expand-all> <el-form
ref="leaveFormRef"
v-loading="loading"
:disabled="routeParams.type === 'view' || form.status == 'waiting'"
:model="form"
:rules="rules"
label-width="100px"
class="space-y-4"
>
<div class="grid grid-cols-1 gap-4">
<el-row>
<el-col :span="12">
<el-form-item label="版本号" prop="formNo">
<el-input disabled v-model="form.versions" placeholder="请输入文件名称" />
</el-form-item>
<el-form-item label="表名" prop="formNo">
<el-input disabled v-model="form.sheet" placeholder="请输入文件名称" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<el-table :data="tableData" style="width: 100%; margin-bottom: 20px; height: calc(100vh - 305px)" row-key="id" default-expand-all border>
<el-table-column prop="num" label="编号" /> <el-table-column prop="num" label="编号" />
<el-table-column prop="name" label="工程或费用名称" /> <el-table-column prop="name" label="工程或费用名称" />
<el-table-column prop="unit" label="单位" /> <el-table-column prop="unit" label="单位" />
<el-table-column prop="quantity" label="数量" /> <el-table-column prop="quantity" label="数量" />
<el-table-column prop="remark" label="单价" align="center"> <el-table-column prop="unitPrice" label="单价" align="center" />
<template #default="scope">
<el-input-number
:model-value="scope.row.unitPrice"
@change="(val) => (scope.row.unitPrice = val)"
:precision="2"
:step="0.1"
:controls="false"
v-if="scope.row.quantity && scope.row.quantity != 0"
/>
</template>
</el-table-column>
<el-table-column prop="price" label="总价" align="center"> <el-table-column prop="price" label="总价" align="center">
<template #default="scope"> <template #default="scope">
{{ scope.row.price }} {{ scope.row.price }}
@ -84,12 +95,14 @@ import SubmitVerify from '@/components/Process/submitVerify.vue';
import ApprovalRecord from '@/components/Process/approvalRecord.vue'; import ApprovalRecord from '@/components/Process/approvalRecord.vue';
import ApprovalButton from '@/components/Process/approvalButton.vue'; import ApprovalButton from '@/components/Process/approvalButton.vue';
import { StartProcessBo } from '@/api/workflow/workflowCommon/types'; import { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as any;
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
const { design_change_reason_type } = toRefs<any>(proxy?.useDict('design_change_reason_type')); const { design_change_reason_type } = toRefs<any>(proxy?.useDict('design_change_reason_type'));
import { getKnowledgeDocument } from '@/api/design/technicalStandard'; import { getKnowledgeDocument } from '@/api/design/technicalStandard';
import { getConstructionValue } from '@/api/out/constructionValue'; import { getConstructionValue } from '@/api/out/constructionValue';
import { workScheduleListDetail } from '@/api/progress/plan'; import { workScheduleListDetail } from '@/api/progress/plan';
import { sheetList } from '@/api/contract';
import { getApproval, getTableList } from '@/api/tender';
// 获取用户 store // 获取用户 store
const userStore = useUserStoreHook(); const userStore = useUserStoreHook();
// 从 store 中获取项目列表和当前选中的项目 // 从 store 中获取项目列表和当前选中的项目
@ -98,6 +111,7 @@ const buttonLoading = ref(false);
const loading = ref(true); const loading = ref(true);
//路由参数 //路由参数
const routeParams = ref<Record<string, any>>({}); const routeParams = ref<Record<string, any>>({});
const flowCode = ref<string>(''); const flowCode = ref<string>('');
const status = ref<string>(''); const status = ref<string>('');
const dialogVisible = reactive<DialogOption>({ const dialogVisible = reactive<DialogOption>({
@ -111,11 +125,15 @@ const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>();
//按钮组件 //按钮组件
const flowCodeOptions = [ const flowCodeOptions = [
{ {
value: currentProject.value?.id + '_constructionValue', value: currentProject.value?.id + '_bLimitEquipmentList',
label: '施工产值审批' label: '招标一览审批'
} }
]; ];
const sheets = ref([]);
const queryForm = ref({
versions: '',
sheet: ''
});
const leaveFormRef = ref<ElFormInstance>(); const leaveFormRef = ref<ElFormInstance>();
const dialog = reactive({ const dialog = reactive({
visible: false, visible: false,
@ -133,17 +151,10 @@ const taskVariables = ref<Record<string, any>>({});
const initFormData = { const initFormData = {
id: undefined, id: undefined,
projectId: currentProject.value?.id, projectId: currentProject.value?.id,
matrixName: undefined, versions: undefined,
progressCategoryName: undefined, sheet: undefined,
artificialNum: undefined, type: undefined,
planNum: undefined, status: undefined
planDate: undefined,
uavNum: undefined,
confirmNum: undefined,
outValue: undefined,
reportDate: undefined,
reportDateId: undefined,
auditStatus: undefined
}; };
const data = reactive({ const data = reactive({
form: { ...initFormData }, form: { ...initFormData },
@ -164,12 +175,43 @@ const reset = () => {
}; };
/** 获取详情 */ /** 获取详情 */
const getInfo = () => { const getInfo = async () => {
loading.value = true; loading.value = true;
buttonLoading.value = false; buttonLoading.value = false;
nextTick(async () => { nextTick(async () => {
const res = await getConstructionValue(routeParams.value.id); try {
Object.assign(form.value, res.data); const params = {
projectId: currentProject.value?.id,
versions: form.value.versions
};
const res = await sheetList(params);
if (res.code == 200) {
sheets.value = res.data;
if (res.data.length > 0) {
queryForm.value.sheet = res.data[0];
} else {
queryForm.value.sheet = '';
}
try {
const res = await getTableList(form.value);
if (res.code == 200) {
tableData.value = res.data;
}
} catch (error) {
console.log(error);
}
}
} catch (error) {
console.log(error);
}
getApproval(form.value.versions).then((res) => {
form.value.status = res.data.status;
});
if (routeParams.value.type === 'approval') {
form.value.id = routeParams.value.id;
} else {
form.value.id = routeParams.value.id + '_' + routeParams.value.activeTab;
}
loading.value = false; loading.value = false;
buttonLoading.value = false; buttonLoading.value = false;
}); });
@ -186,10 +228,10 @@ const submitFlow = async () => {
dialogVisible.visible = false; dialogVisible.visible = false;
}; };
//提交申请 //提交申请
const handleStartWorkFlow = async (data: LeaveForm) => { const handleStartWorkFlow = async (data: any) => {
try { try {
submitFormData.value.flowCode = flowCode.value; submitFormData.value.flowCode = flowCode.value;
submitFormData.value.businessId = data.id; submitFormData.value.businessId = data.versions + '_xianjiayilan';
//流程变量 //流程变量
taskVariables.value = { taskVariables.value = {
// leave4/5 使用的流程变量 // leave4/5 使用的流程变量
@ -227,7 +269,7 @@ const submit = async (status, data) => {
proxy.$tab.closePage(proxy.$route); proxy.$tab.closePage(proxy.$route);
proxy.$router.go(-1); proxy.$router.go(-1);
} else { } else {
if ((form.value.auditStatus === 'draft' && (flowCode.value === '' || flowCode.value === null)) || routeParams.value.type === 'add') { if ((form.value.status === 'draft' && (flowCode.value === '' || flowCode.value === null)) || routeParams.value.type === 'add') {
flowCode.value = flowCodeOptions[0].value; flowCode.value = flowCodeOptions[0].value;
dialogVisible.visible = true; dialogVisible.visible = true;
return; return;
@ -246,7 +288,16 @@ onMounted(() => {
console.log('🚀 ~ proxy.$route.query:', proxy.$route.query); console.log('🚀 ~ proxy.$route.query:', proxy.$route.query);
reset(); reset();
loading.value = false; loading.value = false;
console.log(routeParams.value);
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') { if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
if (routeParams.value.type === 'approval') {
form.value.versions = routeParams.value.id.split('_')[0];
form.value.type = routeParams.value.id.split('_')[1];
} else {
form.value.versions = routeParams.value.id;
form.value.type = routeParams.value.activeTab;
}
getInfo(); getInfo();
} }
}); });

View File

@ -13,7 +13,7 @@
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button type="primary" plain :icon="Plus" @click="openDialog" v-hasPermi="['tender:segmentedIndicatorPlanning:add']">新增</el-button> <el-button type="primary" plain :icon="Plus" @click="openDialog" v-hasPermi="['tender:biddingPlan:add']">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -25,11 +25,10 @@
</el-table-column> </el-table-column>
<el-table-column prop="name" label="名称" /> <el-table-column prop="name" label="名称" />
<el-table-column prop="content" label="内容" /> <el-table-column prop="content" label="内容" />
<el-table-column prop="price" label="限价" />
<el-table-column prop="bidd" label="招标文件"> <el-table-column prop="bidd" label="招标文件">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link v-hasPermi="['tender:segmentedIndicatorPlanning:getMore']" @click="biddView(scope.row)" <el-button type="primary" link v-hasPermi="['tender:biddingPlan:getAnnex']" @click="biddView(scope.row)">查看文件</el-button>
>查看文件</el-button
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="winningBidder" label="中标单位" /> <el-table-column prop="winningBidder" label="中标单位" />
@ -51,6 +50,7 @@
value-format="YYYY-MM-DD" value-format="YYYY-MM-DD"
placeholder="选择时间" placeholder="选择时间"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
v-hasPermi="['tender:biddingPlan:edit']"
/> />
</template> </template>
</el-table-column> </el-table-column>
@ -68,6 +68,7 @@
:step="1" :step="1"
:controls="false" :controls="false"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
v-hasPermi="['tender:biddingPlan:edit']"
/> />
</template> </template>
</el-table-column> </el-table-column>
@ -79,7 +80,7 @@
link link
icon="FolderOpened" icon="FolderOpened"
@click="handleSave(scope.row)" @click="handleSave(scope.row)"
v-hasPermi="['tender:segmentedIndicatorPlanning:edit']" v-hasPermi="['tender:biddingPlan:uploadBiddingDocuments']"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
>招标上传 >招标上传
</el-button> </el-button>
@ -88,7 +89,7 @@
link link
icon="FolderOpened" icon="FolderOpened"
@click="handleWinTheBid(scope.row)" @click="handleWinTheBid(scope.row)"
v-hasPermi="['tender:segmentedIndicatorPlanning:edit']" v-hasPermi="['tender:biddingPlan:uploadBiddingDocuments']"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
>中标上传 >中标上传
</el-button> </el-button>
@ -101,7 +102,7 @@
icon="View" icon="View"
@click="handleDetail(scope.row)" @click="handleDetail(scope.row)"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
v-hasPermi="['tender:segmentedIndicatorPlanning:getMore']" v-hasPermi="['tender:biddingPlan:getMore']"
>详情</el-button >详情</el-button
> >
@ -111,7 +112,7 @@
icon="Delete" icon="Delete"
@click="delHandle(scope.row)" @click="delHandle(scope.row)"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
v-hasPermi="['tender:segmentedIndicatorPlanning:remove']" v-hasPermi="['tender:biddingPlan:remove']"
>删除</el-button >删除</el-button
> >
<el-button <el-button
@ -120,7 +121,7 @@
icon="Lock" icon="Lock"
@click="editStatusBtn(scope.row)" @click="editStatusBtn(scope.row)"
:disabled="scope.row.bidStatus == 1" :disabled="scope.row.bidStatus == 1"
v-hasPermi="['tender:segmentedIndicatorPlanning:remove']" v-hasPermi="['tender:biddingPlan:editStatus']"
>确定</el-button >确定</el-button
> >
</template> </template>
@ -232,7 +233,15 @@
<el-table-column prop="price" label="操作" align="center"> <el-table-column prop="price" label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link icon="View" @click="openPdf(scope.row.url)">查看</el-button> <el-button type="primary" link icon="View" @click="openPdf(scope.row.url)">查看</el-button>
<el-button type="primary" link icon="Delete" @click="delHandlebidd(scope.row)" v-if="scope.row.bidStatus != 1">删除</el-button> <el-button
type="primary"
link
icon="Delete"
@click="delHandlebidd(scope.row)"
v-if="scope.row.bidStatus != 1"
v-hasPermi="['tender:biddingPlanAnnex:remove']"
>删除</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>