This commit is contained in:
2025-08-21 21:39:21 +08:00
parent 1cdd24271c
commit 594de41607
4 changed files with 601 additions and 84 deletions

View File

@ -8,7 +8,7 @@ import { ListOfWinningBidsVO, ListOfWinningBidsForm, ListOfWinningBidsQuery } fr
* @returns {*} * @returns {*}
*/ */
export const listListOfWinningBids = (query?: ListOfWinningBidsQuery): AxiosPromise<ListOfWinningBidsVO[]> => { export const listListOfWinningBids = (query) => {
return request({ return request({
url: '/bidding/listOfWinningBids/list', url: '/bidding/listOfWinningBids/list',
method: 'get', method: 'get',

View File

@ -7,9 +7,22 @@
<div class="bg-blue-50 px-6 py-4 rounded-t-xl mb-0"> <div class="bg-blue-50 px-6 py-4 rounded-t-xl mb-0">
<h3 class="el-card__header-title text-lg font-semibold text-blue-800">投标项目信息填写</h3> <h3 class="el-card__header-title text-lg font-semibold text-blue-800">投标项目信息填写</h3>
<span>{{ currentProject.name }}</span> <span>{{ currentProject.name }}</span>
<div style="margin-top: 10px">
<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> </div>
</template> </template>
<el-form 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-row :gutter="32">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="中标价(美元)" prop="winningBidOriginal" class="rounded-lg border border-gray-100 p-1 mb-5"> <el-form-item label="中标价(美元)" prop="winningBidOriginal" class="rounded-lg border border-gray-100 p-1 mb-5">
@ -100,14 +113,14 @@
<el-input v-model="form.projectNumbering" placeholder="请输入项目编号" /> <el-input v-model="form.projectNumbering" placeholder="请输入项目编号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="项目状态" prop="projectStatus" class="rounded-lg border border-gray-100 p-1 mb-5"> <el-form-item label="项目状态" prop="projectStatus" class="rounded-lg border border-gray-100 p-1 mb-5">
<el-input v-model="form.projectStatus" placeholder="请输入项目状态(如:进行中/已完成)" /> <el-input v-model="form.projectStatus" placeholder="请输入项目状态(如:进行中/已完成)" />
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
<!-- 操作按钮区域 --> <!-- 操作按钮区域 -->
<el-row class="mt-8"> <el-row v-if="!isDisabled" class="mt-8">
<el-col :span="24" class="text-center"> <el-col :span="24" class="text-center">
<el-button <el-button
:loading="buttonLoading" :loading="buttonLoading"
@ -129,7 +142,7 @@
<script setup name="ListOfWinningBidsForm" lang="ts"> <script setup name="ListOfWinningBidsForm" lang="ts">
import { ref, reactive, toRefs, watch, onMounted, onUnmounted, getCurrentInstance, ComponentInternalInstance, computed } from 'vue'; import { ref, reactive, toRefs, watch, onMounted, onUnmounted, getCurrentInstance, ComponentInternalInstance, computed } from 'vue';
import { addListOfWinningBids, updateListOfWinningBids, getListOfWinningBids } from '@/api/bidding/listOfWinningBids'; import { addListOfWinningBids, updateListOfWinningBids, listListOfWinningBids, getListOfWinningBids } from '@/api/bidding/listOfWinningBids';
import { ListOfWinningBidsVO, ListOfWinningBidsForm } from '@/api/bidding/listOfWinningBids/types'; import { ListOfWinningBidsVO, 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';
@ -145,6 +158,7 @@ const currentProject = computed(() => userStore.selectedProject);
const listOfWinningBidsFormRef = ref<ElFormInstance>(); const listOfWinningBidsFormRef = ref<ElFormInstance>();
// 加载状态 // 加载状态
const buttonLoading = ref(false); const buttonLoading = ref(false);
const isDisabled = ref(false);
// 表单初始数据 // 表单初始数据
const initFormData: ListOfWinningBidsForm = { const initFormData: ListOfWinningBidsForm = {
id: undefined, id: undefined,
@ -189,7 +203,6 @@ const data = reactive({
// 解构响应式数据 // 解构响应式数据
const { form, rules } = toRefs(data); const { form, rules } = toRefs(data);
/** /**
* 计算人民币中标价 * 计算人民币中标价
* 显式触发的计算函数,确保执行时机可靠 * 显式触发的计算函数,确保执行时机可靠
@ -216,16 +229,21 @@ const calculateWinningBid = () => {
const initData = async () => { const initData = async () => {
try { try {
if (currentProject.value?.id) { if (currentProject.value?.id) {
const res = await getListOfWinningBids(currentProject.value.id); const res = await listListOfWinningBids({ projectId: currentProject.value.id });
if (res.data && res.data.id) { if (res.code == 200) {
Object.assign(form.value, res.data); console.log(res.data);
// 初始化时手动触发一次计算 resetForm();
setTimeout(calculateWinningBid, 0); if (!res.data) {
isDisabled.value = false;
return;
} else {
Object.assign(form.value, res.data);
}
isDisabled.value = true;
} }
} }
} catch (error) { } catch (error) {
console.error('初始化数据失败:', error); // ElMessage.error('初始化数据失败');
ElMessage.error('初始化数据失败');
} }
}; };
@ -239,16 +257,10 @@ const submitForm = () => {
try { try {
// 提交前确保计算正确 // 提交前确保计算正确
calculateWinningBid(); calculateWinningBid();
form.value.projectId = currentProject.value?.id; form.value.projectId = currentProject.value?.id;
if (form.value.id) { await addListOfWinningBids(form.value);
await updateListOfWinningBids(form.value); isDisabled.value = true;
} else {
await addListOfWinningBids(form.value);
}
ElMessage.success('提交成功'); ElMessage.success('提交成功');
resetForm();
} catch (error) { } catch (error) {
ElMessage.error('提交失败,请重试'); ElMessage.error('提交失败,请重试');
console.error('提交表单失败:', error); console.error('提交表单失败:', error);
@ -258,7 +270,6 @@ const submitForm = () => {
} }
}); });
}; };
/** /**
* 重置表单 * 重置表单
*/ */
@ -266,7 +277,6 @@ const resetForm = () => {
form.value = { ...initFormData, projectId: currentProject.value?.id }; form.value = { ...initFormData, projectId: currentProject.value?.id };
listOfWinningBidsFormRef.value?.resetFields(); listOfWinningBidsFormRef.value?.resetFields();
}; };
/** /**
* 监听项目ID变化 - 重新初始化数据 * 监听项目ID变化 - 重新初始化数据
*/ */

View File

@ -15,13 +15,6 @@
<el-form-item label="企业名称" prop="supplierName"> <el-form-item label="企业名称" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="请输入企业名称" clearable style="width: 200px" /> <el-input v-model="queryParams.supplierName" placeholder="请输入企业名称" clearable style="width: 200px" />
</el-form-item> </el-form-item>
<el-form-item label="审核状态" prop="state">
<el-select v-model="queryParams.state" placeholder="请选择状态" clearable>
<el-option label="待审核" value="0"></el-option>
<el-option label="已通过" value="1"></el-option>
<el-option label="未通过" value="2"></el-option>
</el-select>
</el-form-item>
<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>
@ -38,32 +31,16 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['supplierInput:supplierInput:add']">新增</el-button> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['supplierInput:supplierInput:add']">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['supplierInput:supplierInput:edit']"
>修改</el-button
>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="Delete"
:disabled="multiple"
@click="handleDelete()"
v-hasPermi="['supplierInput:supplierInput:remove']"
>删除</el-button
>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['supplierInput:supplierInput:export']">导出</el-button> <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['supplierInput:supplierInput:export']">导出</el-button>
</el-col> </el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>
<!-- 数据表格 --> <!-- 数据表格 -->
<el-table v-loading="loading" :data="supplierInputList" @selection-change="handleSelectionChange" border> <el-table v-loading="loading" :data="supplierInputList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="100%" align="center" /> <el-table-column type="index" label="序号" align="center" width="60" />
<el-table-column label="企业登记注册类型" align="center" prop="supplierType" width="140" /> <el-table-column label="企业登记注册类型" align="center" prop="supplierType" width="140" />
<el-table-column label="企业名称" align="center" prop="supplierName" width="180" /> <el-table-column label="企业名称" align="center" prop="supplierName" width="180" />
<el-table-column label="法定代表人" align="center" prop="supplierPerson" width="120" /> <el-table-column label="法定代表人" align="center" prop="supplierPerson" width="120" />
@ -72,11 +49,9 @@
<el-table-column label="负责人电话" align="center" prop="personPhone" width="120" /> <el-table-column label="负责人电话" align="center" prop="personPhone" width="120" />
<el-table-column label="纳税规模" align="center" prop="taxScale" width="120" /> <el-table-column label="纳税规模" align="center" prop="taxScale" width="120" />
<el-table-column label="资质等级" align="center" prop="supplierLivel" width="120" /> <el-table-column label="资质等级" align="center" prop="supplierLivel" width="120" />
<el-table-column label="审核状态" align="center" prop="state" width="120"> <el-table-column label="流程状态" align="center">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.state === '1' ? 'success' : scope.row.state === '2' ? 'danger' : 'warning'"> <dict-tag :options="wf_business_status" :value="scope.row.state" />
{{ scope.row.state === '1' ? '已通过' : scope.row.state === '2' ? '未通过' : '待审核' }}
</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="入库资料" align="center" prop="inputFile" width="120"> <el-table-column label="入库资料" align="center" prop="inputFile" width="120">
@ -86,34 +61,30 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120"> <el-table-column label="操作" align="center" fixed="right" width="240">
<template #default="scope"> <template #default="scope">
<el-tooltip content="修改" placement="top"> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['supplierInput:supplierInput:edit']"
<el-button >修改</el-button
link >
type="primary" <el-button link type="primary" icon="edit" @click="handleAudit(scope.row)" v-if="scope.row.state == 'draft' || scope.row.state == 'back'"
icon="Edit" >审核</el-button
@click="handleUpdate(scope.row)" >
v-hasPermi="['supplierInput:supplierInput:edit']" <el-button link type="primary" icon="View" v-if="scope.row.state != '2' && scope.row.state != 'draft'" @click="handleAuditView(scope.row)"
></el-button> >查看流程</el-button
</el-tooltip> >
<el-tooltip content="删除" placement="top"> <!-- <el-button
<el-button link
link type="primary"
type="primary" icon="Delete"
icon="Delete" @click="handleDelete(scope.row)"
@click="handleDelete(scope.row)" v-hasPermi="['supplierInput:supplierInput:remove']"
v-hasPermi="['supplierInput:supplierInput:remove']" ></el-button> -->
></el-button>
</el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 分页 --> <!-- 分页 -->
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<!-- 新增/修改对话框 --> <!-- 新增/修改对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="950px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="950px" append-to-body>
<el-form ref="supplierInputFormRef" :model="form" :rules="rules" label-width="200px"> <el-form ref="supplierInputFormRef" :model="form" :rules="rules" label-width="200px">
@ -249,7 +220,6 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<!-- 第十行安全生产许可证有效期仅劳务类型显示 --> <!-- 第十行安全生产许可证有效期仅劳务类型显示 -->
<el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'"> <el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'">
<el-col :span="12"> <el-col :span="12">
@ -261,7 +231,6 @@
<!-- 空列占位 --> <!-- 空列占位 -->
</el-col> </el-col>
</el-row> </el-row>
<!-- 第十一行注册人员数量仅劳务类型显示 --> <!-- 第十一行注册人员数量仅劳务类型显示 -->
<el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'"> <el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'">
<el-col :span="12"> <el-col :span="12">
@ -282,7 +251,6 @@
<!-- 空列占位 --> <!-- 空列占位 -->
</el-col> </el-col>
</el-row> </el-row>
<!-- 第十二行职称人员数量仅劳务类型显示 --> <!-- 第十二行职称人员数量仅劳务类型显示 -->
<el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'"> <el-row :gutter="20" class="mb-4" v-if="form.supplierType === '劳务'">
<el-col :span="12"> <el-col :span="12">
@ -303,7 +271,6 @@
<!-- 空列占位 --> <!-- 空列占位 -->
</el-col> </el-col>
</el-row> </el-row>
<!-- 第十四行入库资料上传 --> <!-- 第十四行入库资料上传 -->
<el-row class="mb-4"> <el-row class="mb-4">
<el-col :span="24"> <el-col :span="24">
@ -342,7 +309,6 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
<!-- 对话框底部按钮 --> <!-- 对话框底部按钮 -->
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
@ -362,10 +328,8 @@ import { SupplierInputVO, SupplierInputQuery, SupplierInputForm, PageData, Dialo
import Pagination from '@/components/Pagination/index.vue'; import Pagination from '@/components/Pagination/index.vue';
import RightToolbar from '@/components/RightToolbar/index.vue'; import RightToolbar from '@/components/RightToolbar/index.vue';
import FileUpload from '@/components/FileUpload/index.vue'; import FileUpload from '@/components/FileUpload/index.vue';
// 实例代理
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { wf_business_status } = toRefs<any>(proxy?.useDict('wf_business_status'));
// 组件引用 // 组件引用
const fileUploadRef = ref<InstanceType<typeof FileUpload> | null>(null); const fileUploadRef = ref<InstanceType<typeof FileUpload> | null>(null);
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
@ -414,7 +378,7 @@ const initFormData: any = {
personnelNumber: undefined, // 后端返回的拼接字符串如“5,6,7,8” personnelNumber: undefined, // 后端返回的拼接字符串如“5,6,7,8”
fileId: undefined, fileId: undefined,
inputFile: undefined, inputFile: undefined,
state: '0', // 新增默认待审核 // state: '0', // 新增默认待审核
// 新增:用于表单输入的单独字段 // 新增:用于表单输入的单独字段
build1: undefined, // 一建建造师 build1: undefined, // 一建建造师
build2: undefined, // 二建建造师 build2: undefined, // 二建建造师
@ -577,6 +541,28 @@ const splitBackEndStrToForm = (resData: any) => {
form.value.personnelNumber4 = personnelArr[3] || undefined; // 其他职称人员 form.value.personnelNumber4 = personnelArr[3] || undefined; // 其他职称人员
} }
}; };
/** 审核过程按钮操作 */
const handleAudit = async (row) => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/approval/supplierInput/indexEdit`,
query: {
id: row.id,
type: 'update'
}
});
};
/** 查看按钮操作 */
const handleAuditView = async (row) => {
proxy.$tab.closePage(proxy.$route);
proxy.$router.push({
path: `/approval/supplierInput/indexEdit`,
query: {
id: row.id,
type: 'view'
}
});
};
/** 文件选择变更 */ /** 文件选择变更 */
const change = () => { const change = () => {
fileUrl.value = ''; fileUrl.value = '';

View File

@ -0,0 +1,521 @@
<template>
<div class="p-4 bg-gray-50 min-h-screen">
<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.id"
:status="form.state"
: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 :model="form" :rules="rules" label-width="150px" class="space-y-4">
<div class="">
<el-row>
<el-col :span="12">
<el-form-item label="企业登记注册类型" prop="supplierType">
<el-select v-model="form.supplierType" placeholder="请选择供应商类型" @change="handleTypeChange">
<el-option label="劳务" value="劳务"></el-option>
<el-option label="技术服务" value="技术服务"></el-option>
<el-option label="物资设备" value="物资设备"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="企业名称" prop="supplierName">
<el-input v-model="form.supplierName" placeholder="请输入企业名称" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="企业法定代表人" prop="supplierPerson">
<el-input v-model="form.supplierPerson" placeholder="请输入法定代表人" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="supplierCode">
<el-input v-model="form.supplierCode" placeholder="请输入统一社会信用代码" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="企业注册地址" prop="supplierAddres">
<el-input v-model="form.supplierAddres" placeholder="请输入注册地址" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人姓名" prop="personName">
<el-input v-model="form.personName" placeholder="请输入负责人姓名" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责人联系电话" prop="personPhone">
<el-input v-model="form.personPhone" placeholder="请输入联系电话" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="纳税规模" prop="taxScale">
<el-select v-model="form.taxScale" placeholder="请选择纳税规模">
<el-option label="一般纳税人" value="一般纳税人"></el-option>
<el-option label="小规模纳税人" value="小规模纳税人"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户行户名" prop="bankPersonName">
<el-input v-model="form.bankPersonName" placeholder="请输入开户行户名" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开户银行" prop="bankName">
<el-input v-model="form.bankName" placeholder="请输入开户银行" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="开户行账号" prop="bankAccount">
<el-input v-model="form.bankAccount" placeholder="请输入开户行账号" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经营范围" prop="scope">
<el-input v-model="form.scope" placeholder="请输入经营范围" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="企业资质等级" prop="supplierLivel">
<el-input v-model="form.supplierLivel" placeholder="请输入资质等级" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发证日期" prop="issueDate">
<el-date-picker v-model="form.issueDate" type="date" placeholder="请选择发证日期" value-format="YYYY-MM-DD" />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="证书有效期" prop="certificateValidity">
<el-date-picker v-model="form.certificateValidity" type="date" placeholder="请选择证书有效期" value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="近三年营业额" prop="pastThreeYears">
<el-input v-model="form.pastThreeYears" placeholder="请输入近三年营业额" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="生产许可证编号" prop="safeCode">
<el-input v-model="form.safeCode" placeholder="请输入许可证编号" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="生产许可证发证日期" prop="safeCodeData">
<el-date-picker v-model="form.safeCodeData" type="date" placeholder="请选择发证日期" />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="生产许可证发证日期" prop="safeCertificateValidity">
<el-date-picker v-model="form.safeCertificateValidity" type="date" placeholder="请选择发证日期" />
</el-form-item>
</el-col>
</el-row>
<el-row class="mb-4" v-if="form.supplierType === '劳务'">
<el-col :span="12">
<el-form-item label="一建建造师" prop="build1">
<el-input v-model="form.build1" placeholder="请输入一建建造师数量" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="二建建造师" prop="build2">
<el-input v-model="form.build2" placeholder="请输入二建建造师数量" clearable />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="其他(分别写)" prop="build4">
<el-input v-model="form.build3" placeholder="请输入其他人员数量" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="注册造价工程师" prop="build3">
<el-input v-model="form.build4" placeholder="请输入注册造价工程师数量" clearable />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" class="mb-4" v-if="form.supplierType === '劳务'">
<el-col :span="12">
<el-form-item label="高级工程师人数" prop="personnelNumber1">
<el-input v-model="form.personnelNumber1" placeholder="请输高级工程师数量" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="工程师数量" prop="personnelNumber2">
<el-input v-model="form.personnelNumber2" placeholder="请输入工程师数量" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="助理工程师数量" prop="personnelNumber3">
<el-input v-model="form.personnelNumber3" placeholder="请输入助理工程师数量" clearable />
</el-form-item> </el-col
><el-col :span="12">
<el-form-item label="其他人员数量" prop="personnelNumber4">
<el-input v-model="form.personnelNumber4" placeholder="请输入其他人员数量" clearable />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
</div>
</el-card>
<!-- 提交组件 -->
<approvalRecord ref="approvalRecordRef"></approvalRecord>
<submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" />
<!-- 流程选择对话框 -->
<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 } 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 { StartProcessBo } from '@/api/workflow/workflowCommon/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { useUserStoreHook } from '@/store/modules/user';
import { getSupplierInput } from '@/api/supplierInput/supplierInput';
// 获取用户 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 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 flowCodeOptions = [
{
value: currentProject.value?.id + '_supplierInput',
label: '供应商入库审核'
}
];
const initFormData = {
id: undefined,
supplierType: undefined,
supplierName: undefined,
supplierPerson: undefined,
supplierCode: undefined,
supplierAddres: undefined,
personName: undefined,
personPhone: undefined,
bankPersonName: undefined,
bankName: undefined,
bankAccount: undefined,
taxScale: undefined,
scope: undefined,
supplierLivel: undefined,
issueDate: undefined,
certificateValidity: undefined,
pastThreeYears: undefined,
safeCode: undefined,
safeCodeData: undefined,
safeCertificateValidity: undefined,
registeredNumber: undefined, // 后端返回的拼接字符串如“1,2,3,4”
personnelNumber: undefined, // 后端返回的拼接字符串如“5,6,7,8”
fileId: undefined,
inputFile: undefined,
state: '0', // 新增默认待审核
// 新增:用于表单输入的单独字段
build1: undefined, // 一建建造师
build2: undefined, // 二建建造师
build3: undefined, // 注册造价工程师
build4: undefined, // 其他注册人员
personnelNumber1: undefined, // 高级工程师
personnelNumber2: undefined, // 工程师
personnelNumber3: undefined, // 助理工程师
personnelNumber4: undefined // 其他职称人员
};
const data = reactive<PageData<LeaveForm, LeaveQuery>>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
projectId: currentProject.value?.id,
fileName: undefined,
fileType: undefined,
fileSuffix: undefined,
fileStatus: undefined,
originalName: undefined,
newest: undefined,
params: {}
},
rules: {
versionNumber: [{ required: true, message: '版本号不能为空', trigger: 'blur' }],
fileName: [{ required: true, message: '文件名称不能为空', trigger: 'blur' }],
fileType: [{ required: true, message: '文件类型不能为空', trigger: 'change' }],
fileUrl: [
{
validator: (rule, value, callback) => {
// 新增时必须上传文件
if (!form.value.fileUrl) {
callback(new Error('请上传图纸文件'));
} else {
callback();
}
},
trigger: 'change'
}
]
}
});
const handleClose = () => {
dialogVisible.visible = false;
flowCode.value = '';
buttonLoading.value = false;
};
const { form, rules } = toRefs(data);
/** 表单重置 */
const reset = () => {
form.value = { ...initFormData };
leaveFormRef.value?.resetFields();
};
/** 获取详情 */
const getInfo = () => {
loading.value = true;
buttonLoading.value = false;
nextTick(async () => {
const res = await getSupplierInput(routeParams.value.id);
Object.assign(form.value, res.data);
loading.value = false;
buttonLoading.value = false;
});
};
/** 提交按钮 */
const submitForm = (status1: string) => {
status.value = status1;
buttonLoading.value = true;
dialog.visible = false;
submit(status.value, form.value);
};
const submitFlow = async () => {
handleStartWorkFlow(form.value);
dialogVisible.visible = false;
};
//提交申请
const handleStartWorkFlow = async (data: LeaveForm) => {
try {
submitFormData.value.flowCode = flowCode.value;
submitFormData.value.businessId = data.id;
//流程变量
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.id);
};
//提交回调
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.state === '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';
}
console.log(data);
await handleStartWorkFlow(data);
}
};
onMounted(() => {
nextTick(async () => {
routeParams.value = proxy.$route.query;
reset();
loading.value = false;
if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') {
getInfo();
}
});
});
</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>