From 7c86b549b27bd54f6bd5de81c13f8242f91c87ff Mon Sep 17 00:00:00 2001 From: 张诺 <zhang_12370@163.com> Date: 星期一, 16 六月 2025 18:03:27 +0800 Subject: [PATCH] 优化文件上传组件及表格显示 --- src/views/production/index.vue | 319 +++++++++++++++++++++++++--------------------------- 1 files changed, 154 insertions(+), 165 deletions(-) diff --git a/src/views/production/index.vue b/src/views/production/index.vue index d298680..531640a 100644 --- a/src/views/production/index.vue +++ b/src/views/production/index.vue @@ -1,226 +1,201 @@ <template> <div class="production-container"> - <el-form :inline="true" :model="queryParams" class="search-form" style="width: 100%"> - <el-form-item label="鎼滅储"> - <el-input v-model="queryParams.searchAll" placeholder="璇疯緭鍏ュ叧閿瘝" clearable /> - </el-form-item> - <el-form-item> - <el-button type="primary" @click="handleSearch">鏌ヨ</el-button> - <el-button @click="handleReset">閲嶇疆</el-button> - </el-form-item> - </el-form> + <!-- 鎼滅储琛ㄥ崟 --> + <el-form :inline="true" :model="queryParams" class="search-form"> + <el-form-item label="鎼滅储"> + <el-input + v-model="queryParams.searchAll" + placeholder="璇疯緭鍏ュ叧閿瘝" + clearable + /> + </el-form-item> + <el-form-item> + <el-button type="primary" @click="handleSearch">鏌ヨ</el-button> + <el-button @click="handleReset">閲嶇疆</el-button> + </el-form-item> + </el-form> + + <!-- 涓昏鍐呭鍖哄煙 --> <el-card> - <el-button type="success" :icon="Plus" @click="handleAddBatch">鏂板鍔犲伐</el-button> - <el-button type="danger" :icon="Delete">鍒犻櫎</el-button> - <el-button type="info" :icon="Download">瀵煎嚭</el-button> - <ETable :loading="loading" :table-data="tableData" :columns="columns" @selection-change="handleSelectionChange" - @edit="handleEdit" @view-detail="handleViewDetail" :show-selection="true" :border="true" :maxHeight="480" /> + <!-- 鎿嶄綔鎸夐挳 --> + <div class="toolbar"> + <el-button type="success" :icon="Plus" @click="openDialog('add')"> + 鏂板鍔犲伐 + </el-button> + <el-button type="danger" :icon="Delete" :disabled="!selectedRows.length"> + 鍒犻櫎 + </el-button> + </div> + + <!-- 鏁版嵁琛ㄦ牸 --> + <ETable + :loading="loading" + :table-data="tableData" + :columns="columns" + @selection-change="handleSelectionChange" + @edit="row => openDialog('edit', row)" + :show-selection="true" + :border="true" + :maxHeight="480" + > + <template #coal="{ row }"> + <div class="coal-tags"> + <el-tag v-for="coal in parseCoalArray(row.coal)" :key="coal" size="small"> + {{ coal }} + </el-tag> + <span v-if="!row.coal">--</span> + </div> + </template> + </ETable> + + <!-- 鍒嗛〉缁勪欢 --> <Pagination :total="total" :page="queryParams.current" :limit="queryParams.size" - :show-total="true" @pagination="handlePageChange" - :layout="'total, prev, pager, next, jumper'" - ></Pagination> + /> </el-card> - <ProductionDialog v-model:visible="dialogVisible" ref="childRef" :type="dialogType" - @success="handleDialogSuccess" /> + + <!-- 鐢熶骇瀵硅瘽妗� --> + <ProductionDialog + v-model:visible="dialogVisible" + ref="dialogRef" + :type="dialogType" + @success="handleDialogSuccess" + /> </div> </template> <script setup> import { ref, reactive, onMounted } from "vue"; import { ElMessage, ElMessageBox } from "element-plus"; -import { Plus, Delete, Download, List } from "@element-plus/icons-vue"; +import { Plus, Delete } from "@element-plus/icons-vue"; import ProductionDialog from "./components/ProductionDialog.vue"; import ETable from "@/components/Table/ETable.vue"; import Pagination from "@/components/Pagination/index.vue"; import { getProductionMasterList } from "@/api/production"; -const childRef = ref(null); + +// 琛ㄦ牸鍒楅厤缃� const columns = [ - { prop: "category", label: "鐓ょ", minWidth: 150 }, - { prop: "unit", label: "鍗曚綅", minWidth: 120 }, - { prop: "productionVolume", label: "鐢熶骇鏁伴噺", minWidth: 150 }, + { prop: "coal", label: "鐓ょ", minWidth: 150, slot: 'coal' }, + { prop: "productionQuantity", label: "鐢熶骇鏁伴噺", minWidth: 120 }, { prop: "laborCost", label: "浜哄伐鎴愭湰", minWidth: 150 }, - { prop: "materialCost", label: "鍘熸枡鎴愭湰", minWidth: 120 }, - { prop: "equipmentCost", label: "璁惧璐圭敤", minWidth: 143 }, + { prop: "energyConsumptionCost", label: "鑳借�楁垚鏈�", minWidth: 120 }, + { prop: "equipmentDepreciation", label: "璁惧鎶樻棫", minWidth: 143 }, { prop: "totalCost", label: "鎬绘垚鏈�", minWidth: 150 }, - { prop: "totalPrice", label: "鎬诲敭浠�", minWidth: 150 }, - { prop: "profit", label: "鍒╂鼎", minWidth: 100 }, - { prop: "reviewer", label: "澶嶈浜�", minWidth: 120 }, - { prop: "date", label: "鏃ユ湡", minWidth: 150 }, + { prop: "producer", label: "鐢熶骇浜�", minWidth: 150 }, ]; -// 鎼滅储琛ㄥ崟鏁版嵁 - -// 琛ㄦ牸鏁版嵁 +// 鍝嶅簲寮忔暟鎹� const tableData = ref([]); const loading = ref(false); const total = ref(0); - -const queryParams = reactive({ - searchAll:"", - current: 1, - size: 10, // 鍥哄畾姣忛〉10鏉� -}); -const handlePageChange = ({ page }) => { - console.log("鍒嗛〉鍙樺寲:", { page }); - queryParams.current = page; - getList(); -}; -// 閫変腑鐨勮鏁版嵁 const selectedRows = ref([]); - -// 寮圭獥鐩稿叧 const dialogVisible = ref(false); const dialogType = ref("add"); -const currentRow = ref(null); +const dialogRef = ref(null); -// 鐢熶骇鏄庣粏瀵硅瘽妗嗘帶鍒� -const detailDialogVisible = ref(false); -const currentDetailRow = ref(null); +// 鏌ヨ鍙傛暟 +const queryParams = reactive({ + searchAll: "", + current: 1, + size: 10, +}); +// 鑾峰彇琛ㄦ牸鏁版嵁 // 鑾峰彇琛ㄦ牸鏁版嵁 const getList = async () => { loading.value = true; try { - const res = await getProductionMasterList({...queryParams}); + // 鏋勫缓姝g‘鐨勫垎椤靛弬鏁� + const params = { + searchAll: queryParams.searchAll, + // 灏濊瘯澶氱甯歌鐨勫垎椤靛弬鏁版牸寮� + current: queryParams.current, + size: queryParams.size, + page: queryParams.current, + pageSize: queryParams.size, + pageNum: queryParams.current, + limit: queryParams.size, + offset: (queryParams.current - 1) * queryParams.size + }; + + console.log('鍙戦�佸垎椤靛弬鏁�:', params); + console.log(`绗�${queryParams.current}椤靛簲璇ユ樉绀虹${(queryParams.current - 1) * queryParams.size + 1}-${queryParams.current * queryParams.size}鏉℃暟鎹甡); + + const res = await getProductionMasterList(params); tableData.value = res.data.records || []; total.value = res.data.total || 0; + + console.log('鎺ユ敹鍒扮殑鏁版嵁:', { + 褰撳墠椤�: queryParams.current, + 杩斿洖鏉℃暟: tableData.value.length, + 鎬绘潯鏁�: total.value + }); } catch (error) { ElMessage.error("鑾峰彇鏁版嵁澶辫触"); + console.error('API閿欒:', error); } finally { loading.value = false; } }; -// 澶勭悊琛ㄦ牸閫夋嫨鍙樺寲 +// 鎼滅储鍜岄噸缃� +const handleSearch = () => { + queryParams.current = 1; + getList(); +}; + +const handleReset = () => { + queryParams.searchAll = ""; + handleSearch(); +}; + +// 鍒嗛〉澶勭悊 +const handlePageChange = ({ page }) => { + queryParams.current = page; + getList(); +}; + +// 琛ㄦ牸閫夋嫨澶勭悊 const handleSelectionChange = (selection) => { selectedRows.value = selection; }; -// 鎼滅储鏂规硶 -const handleSearch = () => { - pagination.currentPage = 1; - getList(); -}; - -// 閲嶇疆鎼滅储 -const handleReset = () => { - handleSearch(); -}; - -// 鏂板鍔犲伐 -const handleAddBatch = () => { - dialogType.value = "add"; +// 鎵撳紑瀵硅瘽妗� - 缁熶竴澶勭悊鏂板鍜岀紪杈� +const openDialog = (type, row = null) => { + dialogType.value = type; dialogVisible.value = true; - childRef.value.Initialization(); -}; - -// 缂栬緫 -const handleEdit = (row) => { - currentRow.value = row; - dialogType.value = "edit"; - dialogVisible.value = true; -}; - -// 鎵撳紑鐢熶骇鏄庣粏瀵硅瘽妗� -const handleViewDetail = (row) => { - currentDetailRow.value = row; - detailDialogVisible.value = true; -}; - -// 澶勭悊寮圭獥鎻愪氦 -const handleDialogSuccess = async (formData) => { - try { - if (dialogType.value === "add") { - await addProduction(formData); - ElMessage.success("鏂板鎴愬姛"); - } else { - await updateProduction({ - ...formData, - id: currentRow.value.id, - }); - ElMessage.success("鏇存柊鎴愬姛"); - } - getList(); - } catch (error) { - ElMessage.error(dialogType.value === "add" ? "鏂板澶辫触" : "鏇存柊澶辫触"); + + if (type === 'add') { + dialogRef.value?.Initialization(); + } else if (type === 'edit' && row) { + dialogRef.value?.editInitialization({ ...row }); } }; -// 澶勭悊鐢熶骇鏄庣粏寮圭獥鎻愪氦 -const handleDetailDialogSuccess = async (formData) => { - try { - ElMessage.success("淇濆瓨鎴愬姛"); - getList(); - } catch (error) { - ElMessage.error("淇濆瓨澶辫触"); - } -}; - -// 鍒犻櫎 -const handleDelete = (row) => { - ElMessageBox.confirm("纭鍒犻櫎璇ヨ褰曞悧锛�", "鎻愮ず", { - confirmButtonText: "纭畾", - cancelButtonText: "鍙栨秷", - type: "warning", - }) - .then(async () => { - try { - await deleteProduction(row.id); - ElMessage.success("鍒犻櫎鎴愬姛"); - getList(); - } catch (error) { - console.error("鍒犻櫎澶辫触:", error); - ElMessage.error("鍒犻櫎澶辫触"); - } - }) - .catch(() => { - ElMessage.info("宸插彇娑堝垹闄�"); - }); -}; - -// 瀵煎嚭 -const handleExport = async (row) => { - try { - const res = await exportProduction({ id: row.id }); - const blob = new Blob([res], { type: "application/vnd.ms-excel" }); - const fileName = `鐢熶骇鍔犲伐璁板綍_${new Date().getTime()}.xlsx`; - if ("download" in document.createElement("a")) { - const elink = document.createElement("a"); - elink.download = fileName; - elink.style.display = "none"; - elink.href = URL.createObjectURL(blob); - document.body.appendChild(elink); - elink.click(); - URL.revokeObjectURL(elink.href); - document.body.removeChild(elink); - } else { - navigator.msSaveBlob(blob, fileName); - } - } catch (error) { - ElMessage.error("瀵煎嚭澶辫触"); - } -}; - -// 澶勭悊姣忛〉鏄剧ず鏁伴噺鍙樺寲 -const handleSizeChange = (val) => { - pagination.size = val; +// 瀵硅瘽妗嗘垚鍔熷洖璋� +const handleDialogSuccess = () => { getList(); + ElMessage.success("鎿嶄綔鎴愬姛"); }; -// 澶勭悊椤电爜鍙樺寲 -const handleCurrentChange = (val) => { - pagination.currentPage = val; - getList(); +// 瑙f瀽鐓ょ鏁扮粍 - 绠�鍖栭�昏緫 +const parseCoalArray = (coalString) => { + if (!coalString) return []; + + if (Array.isArray(coalString)) return coalString; + + return String(coalString) + .replace(/^\[|\]$/g, '') + .split(',') + .map(item => item.trim()) + .filter(Boolean); }; // 缁勪欢鎸傝浇鏃跺姞杞芥暟鎹� -onMounted(() => { - getList(); -}); +onMounted(getList); </script> <style scoped lang="scss"> @@ -241,7 +216,7 @@ width: 20%; } } -.search-form{ +.search-form { display: flex; justify-content: space-between; align-items: center; @@ -255,4 +230,18 @@ margin-left: 10px; } } +.coal-tags { + display: flex; + flex-wrap: wrap; + gap: 4px; + + .el-tag { + margin-right: 4px; + margin-bottom: 4px; + + &:last-child { + margin-right: 0; + } + } +} </style> -- Gitblit v1.9.3