<template> <div class="app-container"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" > <el-form-item label="项目名称:" prop="projectName"> <el-input v-model="queryParams.projectName" placeholder="请输入项目名称" clearable @keyup.enter="handleQuery" style="width: 240px" /> </el-form-item> <el-form-item label="计划时间" prop="timer"> <el-date-picker style="width: 240px" format="YYYY-MM-DD" value-format="YYYY-MM-DD" v-model="queryParams.timer" type="daterange" unlink-panels range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> </el-form-item> <!-- <el-form-item label="实际开始时间:" prop="timer2"> <el-date-picker v-model="queryParams.timer2" type="daterange" unlink-panels range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" style="width: 240px" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> --> <el-form-item> <el-button type="primary" icon="Search" @click="handleQuery" >搜索</el-button > <el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form-item> </el-form> <!-- 操作栏 --> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']" >新增</el-button > </el-col> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" ></right-toolbar> </el-row> <!-- 表格 --> <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange" max-height="500" > <el-table-column label="序号" type="index" width="60" align="center" /> <el-table-column :label="i.label" align="center" :prop="i.props" show-overflow-tooltip v-for="i in projectPlanCloum" > <template #default="{ row }" v-if="i.props == 'startTime'"> {{ row.startTime.substring(0, 10) }} </template> <template #default="{ row }" v-if="i.props == 'endTime'"> {{ row.endTime.substring(0, 10) }} </template> </el-table-column> <el-table-column label="操作" width="250" align="center" class-name="small-padding fixed-width" > <template #default="scope"> <el-button link type="primary" icon="View" @click="handleUpdate(scope.row, 1)" >详情</el-button > <el-button link type="warning" icon="Edit" @click="handleUpdate(scope.row, 2)" v-hasPermi="['system:post:edit']" >修改</el-button > <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']" >删除</el-button > </template> </el-table-column> </el-table> <!-- 分页 --> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <!-- 添加或修改项目计划信息对话框 --> <el-dialog :title="title" v-model="open" width="1390px"> <el-form ref="postRef" :model="form" label-width="120px" :inline="true" :disabled="isShow == 1" :rules="projectPlanRules" > <div class="biaoti">基本信息</div> <el-form-item label="项目名称:" style="width: 45%" prop="projectNo"> <el-select :disabled="isShow == 2" v-model="form.projectNo" placeholder="请选择项目" clearable style="width: 100%" @change="TouBiaoInfo(ProjectListData, 'add')" > <el-option v-for="(dict, index) in ProjectListData" :key="dict.projectNo" :label="dict.projectName" :value="dict.projectNo" /> </el-select> </el-form-item> <el-form-item label="项目编号:" style="width: 45%" prop="projectNo"> <el-input disabled v-model="form.projectNo" placeholder="请先选择项目" /> </el-form-item> <el-form-item label="项目开始日期:" style="width: 45%" prop="startTime"> <el-date-picker style="width: 100%" disabled v-model="form.startTime" type="date" placeholder="请选择项目开始日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> <el-form-item label="项目交付日期:" style="width: 45%" prop="endTime"> <el-date-picker style="width: 100%" disabled v-model="form.endTime" type="date" placeholder="请选择项目交付日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> <el-form-item label="项目填报日期:" style="width: 45%" prop="projectFillTime" > <el-date-picker style="width: 100%" v-model="form.projectFillTime" type="date" placeholder="请选择项目填报日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" /> </el-form-item> <el-form-item label="项目责任人:" style="width: 45%" prop="chargeUser"> <el-input v-model="form.chargeUser" placeholder="请输入项目责任人" disabled /> </el-form-item> <el-form-item label="备注:" prop="remark" style="width: 92.5%"> <el-input v-model="form.remark" :autosize="{ minRows: 5, maxRows: 7 }" type="textarea" placeholder="请输入备注" /> </el-form-item> <el-form-item label="附件:" style="width: 93%"> <el-upload v-model:file-list="fileList1" class="upload-demo" action="/prod-api/system/upload" :headers="uploadHeader" multiple :on-preview="handlePreview" style="width: 100%" :before-remove="beforeRemove" > <el-button type="primary">选择文件</el-button> <template #tip> <div class="el-upload__tip">支持CSV格式,可一次性上传多个文件</div> </template> </el-upload> </el-form-item> <el-divider content-position="left">进度汇报明细</el-divider> <!-- <div style="text-align: right;" v-show="isAddProjetc"> --> <div style="text-align: right"> <el-button type="primary" @click="onCheck({}, 1, '新增项目节点')" >新增项目节点</el-button > </div> <el-table :data="tableData" style="width: 100%" row-key="id" default-expand-all :tree-prop="{ children: 'children' }" > <el-table-column prop="nodeName" label="一级节点" width="180" /> <el-table-column prop="planStartTime" label="计划日期起" /> <el-table-column prop="planEndTime" label="计划日期止" /> <el-table-column prop="estimatedWorkHours" label="预算工时" /> <el-table-column prop="dutyUserId" label="负责人"> <template #default="{ row }"> <span>{{ getStateName(row.dutyUserId) }}</span> </template> </el-table-column> <el-table-column prop="outputData" label="输出资料" /> <el-table-column prop="remark" label="备注" /> <el-table-column label="操作" align="center" class-name="nodename" fixde="right" width="250" > <template #default="{ row }"> <el-button v-show="row.tier == 1 || row.tier == 2" link type="success" @click=" onCheck( row, 1, `新增${row.tier == 1 ? '二级节点' : '三级节点'}` ) " >新增{{ row.tier == 1 ? "二级" : "三级" }}节点</el-button > <el-button link type="primary" @click=" onCheck( row, 2, `编辑${ row.tier == 1 ? '一级节点' : row.tier == 2 ? '二级节点' : '三级节点' }` ) " >编辑</el-button > <el-button link type="danger" @click="onCheck(row, 3)" >删除</el-button > </template> </el-table-column> </el-table> </el-form> <template #footer> <div class="dialog-footer"> <el-button v-if="isShow != 1" type="primary" @click="submitForm" >保 存</el-button > <el-button @click="cancel">关闭</el-button> </div> </template> </el-dialog> <el-dialog :title="editDalgotitle" v-model="editDalgo" width="800px"> <el-form label-width="auto" ref="ruleFormAdd1" :model="FormList" v-if="editDalgo" > <el-form-item label="一级节点:" prop="nodeName" v-if="!appryList.tier" :rules="[ { required: true, message: '节点不能为空', trigger: 'blur' }, ]" > <el-input v-model="FormList.nodeName" placeholder="请输入一级节点" /> </el-form-item> <el-form-item label="二级节点:" prop="nodeName2" v-if="appryList.tier == 1" :rules="[ { required: true, message: '节点不能为空', trigger: 'blur' }, ]" > <el-input v-model="FormList.nodeName2" placeholder="请输入二级节点" /> </el-form-item> <el-form-item label="三级节点:" prop="nodeName3" v-if="appryList.tier == 2" :rules="[ { required: true, message: '节点不能为空', trigger: 'blur' }, ]" > <el-input v-model="FormList.nodeName3" placeholder="请输入三级节点" /> </el-form-item> <el-form-item label="关键里程碑:" prop="keyMilestone" :rules="[ { required: true, message: '关键里程碑不能为空', trigger: 'change', }, ]" > <el-radio-group v-model="FormList.keyMilestone" class="ml-4" :disabled="appryList.tier" > <el-radio :label="1" size="large">是</el-radio> <el-radio :label="0" size="large">否</el-radio> </el-radio-group> </el-form-item> <el-form-item label="计划开始日期:" prop="planStartTime" :rules="[ { required: true, message: '计划开始日期不能为空', trigger: 'change', }, ]" > <el-date-picker style="width: 100%" clearable format="YYYY-MM-DD" value-format="YYYY-MM-DD" v-model="FormList.planStartTime" type="date" range-separator="到" placeholder="请选择计划开始日期" :disabled-date="disabledDate" /> </el-form-item> <el-form-item label="计划结束日期:" prop="planEndTime" :rules="[ { required: true, message: '计划结束日期不能为空', trigger: 'change', }, ]" > <el-date-picker clearable style="width: 100%" format="YYYY-MM-DD" value-format="YYYY-MM-DD" v-model="FormList.planEndTime" type="date" range-separator="到" placeholder="请选择计划结束日期" :disabled-date="disabledDate" /> </el-form-item> <el-form-item label="负责人:" prop="dutyUserId" :rules="[ { required: true, message: '负责人不能为空', trigger: 'change' }, ]" > <el-select clearable v-model="FormList.dutyUserId" class="m-2" placeholder="请选择负责人" size="mini" style="width: 100%" > <el-option v-for="item in personList" :key="item.userId" :label="item.nickName" :value="item.userId + ''" /> </el-select> </el-form-item> <el-form-item label="输出资料:" prop="outputData"> <el-input v-model="FormList.outputData" placeholder="请输入输出资料" /> </el-form-item> <el-form-item label="预算工时:" prop="estimatedWorkHours"> <el-input style="width: 100%" v-model="FormList.estimatedWorkHours" type="number" placeholder="请输入预算工时" /> </el-form-item> <el-form-item label="备注:" prop="remark"> <el-input style="width: 100%" v-model="FormList.remark" type="textarea" placeholder="请输入备注" /> </el-form-item> <el-form-item label="排序号:" prop="sort"> <el-input style="width: 100%" v-model="FormList.sort" type="number" placeholder="请输入排序号" /> </el-form-item> </el-form> <div style="text-align: right"> <el-button type="primary" @click="editClick('ruleFormAdd1')" >保存</el-button > <el-button @click="editDalgoClosed">关闭</el-button> </div> </el-dialog> <!-- 编辑 --> <el-dialog :title="editDalgotitle" v-model="editDalgo2" width="800px"> <el-form label-width="auto" ref="ruleFormAdd2" :model="FormList" v-if="editDalgo2" > <el-form-item label="一级节点:" prop="nodeName" v-if="appryList.tier == 1" :rules="[ { required: true, message: '节点不能为空', trigger: 'change' }, ]" > <el-input v-model="FormList.nodeName" placeholder="请输入一级节点" /> </el-form-item> <el-form-item label="二级节点:" prop="nodeName" v-if="appryList.tier == 2" :rules="[ { required: true, message: '节点不能为空', trigger: 'change' }, ]" > <el-input v-model="FormList.nodeName" placeholder="请输入二级节点" /> </el-form-item> <el-form-item label="三级节点:" prop="nodeName" v-if="appryList.tier == 3" :rules="[ { required: true, message: '节点不能为空', trigger: 'change' }, ]" > <el-input v-model="FormList.nodeName" placeholder="请输入三级节点" /> </el-form-item> <el-form-item label="关键里程碑:" prop="keyMilestone" :rules="[ { required: true, message: '关键里程碑不能为空', trigger: 'change', }, ]" > <el-radio-group v-model="FormList.keyMilestone" class="ml-4" :disabled="[2, 3].includes(appryList.tier)" > <el-radio :label="1" size="large">是</el-radio> <el-radio :label="0" size="large">否</el-radio> </el-radio-group> </el-form-item> <el-form-item label="计划开始日期:" prop="planStartTime" :rules="[ { required: true, message: '计划开始日期不能为空', trigger: 'change', }, ]" > <el-date-picker clearable format="YYYY-MM-DD" value-format="YYYY-MM-DD" v-model="FormList.planStartTime" type="date" range-separator="到" placeholder="请选择计划开始日期" :disabled-date="disabledDate" /> </el-form-item> <el-form-item label="计划结束日期:" prop="planEndTime" :rules="[ { required: true, message: '计划结束日期能为空', trigger: 'change', }, ]" > <el-date-picker clearable format="YYYY-MM-DD" value-format="YYYY-MM-DD" v-model="FormList.planEndTime" type="date" range-separator="到" placeholder="请选择计划结束日期" :disabled-date="disabledDate" /> </el-form-item> <el-form-item label="负责人:" prop="dutyUserId" :rules="[ { required: true, message: '负责人不能为空', trigger: 'change' }, ]" > <el-select clearable v-model="FormList.dutyUserId" class="m-2" placeholder="请选择负责人" size="mini" style="width: 100%" > <el-option v-for="item in personList" :key="item.userId" :label="item.nickName" :value="item.userId + ''" /> </el-select> </el-form-item> <el-form-item label="输出资料:" prop="outputData"> <el-input v-model="FormList.outputData" placeholder="请输入输出资料" /> </el-form-item> <el-form-item label="预算工时:" prop="estimatedWorkHours"> <el-input style="width: 100%" v-model="FormList.estimatedWorkHours" type="number" placeholder="请输入预算工时" /> </el-form-item> <el-form-item label="备注:" prop="remark"> <el-input style="width: 100%" v-model="FormList.remark" type="textarea" placeholder="请输入备注" /> </el-form-item> <el-form-item label="排序号:" prop="sort"> <el-input style="width: 100%" v-model="FormList.sort" type="number" placeholder="请输入排序号" /> </el-form-item> </el-form> <div style="text-align: right"> <el-button type="primary" @click="editClick('ruleFormAdd2')" >保存</el-button > <el-button @click="editDalgoClosed">关闭</el-button> </div> </el-dialog> </div> </template> <script setup name="Post"> import { computed } from 'vue' import { projectPlanInfoPage, projectPlanInfoAdd, projectPlanInfoIDS, projectPlanInfoID, projectPlanInfoEdit, projectInfoList, FileSystemList, projectInfoSelectByProjectNo, projectPlanTemplateList, getNodeCodeToUuid, } from "@/api/project/tenderReview"; import { userList } from "@/api/projectInformation"; import { getToken } from "@/utils/auth"; import { ElMessage, ElMessageBox } from "element-plus"; import emgBox from "@/utils/ElMessageBox"; import { deleteData } from "@/utils/commom"; import { projectPlanRules } from "@/utils/rules"; import { projectPlanCloum } from "@/utils/cloums"; const { proxy } = getCurrentInstance(); const { sys_normal_disable, pro_project_type } = proxy.useDict( "sys_normal_disable", "pro_project_type" ); const postList = ref([]); const open = ref(false); const loading = ref(true); const showSearch = ref(true); const ids = ref([]); const single = ref(true); const multiple = ref(true); const total = ref(0); const title = ref(""); const editDalgotitle = ref(""); const editDalgo = ref(false); const isAddProjetc = ref(false); const FormList = ref({ keyMilestone: 0 }); const personList = ref([]); const ProjectListData = ref([]); const uploadHeader = ref({ Authorization: "Bearer " + getToken(), }); const isShow = ref(); const data = reactive({ form: {}, queryParams: { pageNum: 1, pageSize: 10, projectName: undefined, timer: "", startTime: "", endTime: "", }, rules: { projectName: [ { required: true, message: "项目计划信息编码不能为空", trigger: "blur" }, ], }, }); const tableData = ref([]); const disabledDate = (time) => { let curInfo = null if(editDalgo.value){ curInfo = appryList.value } else if(editDalgo2.value) { const nodeCode = appryList.value.nodeCode curInfo = getParentNode(tableData.value, nodeCode) || null } if(!curInfo?.planStartTime || !curInfo?.planEndTime) return false let disabled = false if( time.getTime() < Date.parse(curInfo.planStartTime + ' 00:00:00') || time.getTime() > Date.parse(curInfo.planEndTime + ' 23:59:59') ) { disabled = true } return disabled } const getParentNode = (list, nodeCode) => { // 遍历树节点 for (let node of list) { // 如果当前节点就是目标节点的父节点,直接返回当前节点id if (node.children && node.children.some(child => child.nodeCode === nodeCode)) { return node; } // 否则继续遍历当前节点的子节点 if (node.children) { const parentNode = getParentNode(node.children, nodeCode); if (parentNode !== null) { return parentNode; } } } // 如果没有找到父节点,则返回null return null; } const getStateName = (r) => { let a = ""; personList.value.map((i) => { if (i.userId == r) { a = i; } }); return a.nickName; }; const { queryParams, form, rules } = toRefs(data); /** 文件上传 */ const fileList1 = ref([]); function handlePreview(file) { console.log(file); return ElMessageBox.confirm(`下载此文件: ${file.name}?`).then( () => window.open(file.url), () => false ); } function beforeRemove(file) { return true; } /** 查询项目计划信息列表 */ function getList() { loading.value = true; if (queryParams.value.timer) { queryParams.value.planStartTime = queryParams.value.timer[0]; queryParams.value.planEndTime = queryParams.value.timer[1]; } else { queryParams.value.planStartTime = ""; queryParams.value.planEndTime = ""; } if (queryParams.value.timer2) { queryParams.value.actualFinishStartTime = queryParams.value.timer2[0]; queryParams.value.actualFinishEndTime = queryParams.value.timer2[1]; } else { queryParams.value.actualFinishStartTime = ""; queryParams.value.actualFinishEndTime = ""; } projectPlanInfoPage(queryParams.value).then((response) => { postList.value = response.data; total.value = response.total; loading.value = false; }); } /** 取消按钮 */ function cancel() { open.value = false; reset(); } /** 表单重置 */ function reset() { form.value = { id: undefined, projectNo: undefined, startTime: undefined, endTime: undefined, projectFillTime: undefined, chargeUser: undefined, remark: undefined, }; proxy.resetForm("postRef"); } /** 搜索按钮操作 */ function handleQuery() { if (queryParams.value.timer) { queryParams.value.startTime = queryParams.value.timer[0]; queryParams.value.endTime = queryParams.value.timer[1]; } else { queryParams.value.startTime = ""; queryParams.value.endTime = ""; } queryParams.value.pageNum = 1; getList(); } /** 重置按钮操作 */ function resetQuery() { proxy.resetForm("queryRef"); queryParams.value.timer = []; queryParams.value.timer2 = []; handleQuery(); } /** 多选框选中数据 */ function handleSelectionChange(selection) { ids.value = selection.map((item) => item.id); single.value = selection.length != 1; multiple.value = !selection.length; } /** 新增按钮操作 */ function handleAdd(t) { isShow.value = t; reset(); open.value = true; title.value = "项目计划信息新增"; tableData.value = []; fileList1.value = []; nextTick(() => { proxy.$refs["postRef"].resetFields(); }); } /** 修改按钮操作 */ function handleUpdate(row, t) { isShow.value = t; reset(); const id = row.id || ids.value; projectPlanInfoID(id).then((response) => { let d1 = response.data; open.value = true; title.value = "项目计划信息修改"; let time = response.data.projectFillTime; tableData.value = response.data.projectPlanInventoryList; projectInfoSelectByProjectNo(row.projectNo).then((response) => { form.value = { ...response.data, ...d1 }; form.value.id = id; form.value.projectFillTime = time; console.log("response.data ", response.data); }); }); // 获取文件列表 FileSystemList({ refId: id, refType: "proProjectPlanInfo", }).then(({ data }) => { fileList1.value = data; }); } /** 提交按钮 */ function submitForm() { console.log(); proxy.$refs["postRef"].validate((valid) => { if (valid) { form.value.projectPlanInventorySaveRequestList = tableData.value; form.value.fileSaveRequestList = []; fileList1.value.forEach((element) => { // 基本信息 if (element.hasOwnProperty("response")) { element.response.data.refType = "proProjectPlanInfo"; form.value.fileSaveRequestList.push(element.response.data); } else { form.value.fileSaveRequestList.push(element); } }); if (form.value.id) { projectPlanInfoEdit(form.value).then(({ code }) => { if (code == 200) { proxy.$modal.msgSuccess("修改成功"); open.value = false; getList(); } }); } else { projectPlanInfoAdd(form.value).then(({ code }) => { if (code == 200) { proxy.$modal.msgSuccess("新增成功"); open.value = false; getList(); } }); } } }); } /** 删除按钮操作 */ function handleDelete(row) { const ids = row.id || ids.value; proxy.$modal .confirm('是否确认删除项目计划信息编号为"' + ids + '"的数据项?') .then(function () { return projectPlanInfoIDS(ids); }) .then(() => { getList(); proxy.$modal.msgSuccess("删除成功"); }) .catch(() => {}); } /** 导出按钮操作 */ function handleExport() { proxy.download( "system/post/export", { ...queryParams.value, }, `post_${new Date().getTime()}.xlsx` ); } /**获取所有的项目数据 */ function loadProjerctListData() { projectInfoList().then((response) => { ProjectListData.value = response.data; }); } /**项目下拉框选择 */ let al = ref(); function TouBiaoInfo(val, type) { al.value = val; projectInfoSelectByProjectNoM(val, type); } function projectInfoSelectByProjectNoM(val, type) { let arra = val.filter((k) => { return k.projectNo == form.value.projectNo; }); let pid = arra[0].projectTypeId; FormList.value.projectTypeId = pid; projectInfoSelectByProjectNo(arra[0].projectNo).then((response) => { form.value.startTime = response.data.startTime; form.value.endTime = response.data.endTime; form.value.chargeUser = response.data.chargeUser; // let params = { projectTypeId: pid }; projectPlanTemplateList(pid).then(({ data }) => { tableData.value = data; isAddProjetc.value = true; }); }); } //删除 编辑 新增 let isAdit = ref(); // let let appryList = ref({}); const editDalgo2 = ref(false); function onCheck(t, y, tittle) { console.log(t, "rowrow"); editDalgotitle.value = tittle; appryList.value = t; isAdit.value = y; if (y == 3) { if (t?.children?.length > 0) { emgBox(t, projectPlanDeleteM, "改节点下有子节点您确定删除吗?"); } else { projectPlanDeleteM(t); } } else if (y == 2) { editDalgo2.value = true; FormList.value = t; } else { editDalgo.value = true; FormList.value = { keyMilestone: 0 }; nextTick(() => { proxy.$refs.ruleFormAdd1.resetFields(); }); } } const projectPlanDeleteM = ({ nodeCode }) => { tableData.value = deleteData(tableData.value, nodeCode); }; function editDalgoClosed() { editDalgo.value = false; editDalgo2.value = false; } //新增保存 编辑保存 function editClick(t) { proxy.$refs[t].validate((valid) => { if (valid) { if (isAdit.value == 2) { if (!appryList.value.children) { appryList.value.children = []; } else { let arrar = appryList.value.children; } appryList.value = FormList.value; } else { getNodeCodeToUuid().then(({ data }) => { FormList.value.nodeCode = data; if (!appryList.value.children) { appryList.value.children = []; } if (appryList.value.tier == 1) { FormList.value.nodeName = FormList.value.nodeName2; FormList.value.tier = 2; FormList.value.parentNodeCode = appryList.value.nodeCode; appryList.value.children.push(FormList.value); FormList.value = { keyMilestone: 0 }; } if (appryList.value.tier == 2) { FormList.value.nodeName = FormList.value.nodeName3; FormList.value.projectTypeId = appryList.value.projectTypeId; FormList.value.parentNodeCode = appryList.value.nodeCode; FormList.value.tier = 3; appryList.value.children.push(FormList.value); FormList.value = { keyMilestone: 0 }; } if (!appryList.value.tier) { appryList.value.nodeCode = data; appryList.value.parentNodeCode = 0; FormList.value.tier = 1; console.log(FormList.value, 999); tableData.value.push(FormList.value); FormList.value = { keyMilestone: 0 }; } }); } editDalgo.value = false; editDalgo2.value = false; } }); } const userListM = async () => { let { data } = await userList(); personList.value = data; }; getList(); loadProjerctListData(); userListM(); </script> <style scoped lang="scss"> .biaoti { font-weight: 900; font-size: 18px; margin: 20px 0; } :deep(.el-dialog__body) { background-color: #eef1fb; height: auto; max-height: 750px; overflow: auto; } td.twoChildren_td, td.twoChildren_td1 { text-align: center; min-width: 130px; } td.twoChildren_td1 { min-width: 170px; text-align: left; } td.border_td { border-bottom: 1.5px solid #ddd; } .flex { display: flex; justify-content: center; align-itemas: center; flex-direction: column; } :deep(.nodename.el-table__cell > .cell) { padding: 0; width: 100%; text-align: center; } </style>