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 | 369 +++++++++++++++++++++++-----------------------------
1 files changed, 161 insertions(+), 208 deletions(-)
diff --git a/src/views/production/index.vue b/src/views/production/index.vue
index 0e9b005..531640a 100644
--- a/src/views/production/index.vue
+++ b/src/views/production/index.vue
@@ -1,262 +1,201 @@
<template>
<div class="production-container">
- <el-form :inline="true" :model="searchForm" class="search-form" style="width: 100%">
- <el-form-item label="鎼滅储">
- <el-input v-model="searchForm.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" />
- <Pagination v-model:currentPage="pagination.currentPage" v-model:pageSize="pagination.pageSize"
- :total="pagination.total" @current-change="handleCurrentChange" @size-change="handleSizeChange" />
+ <!-- 鎿嶄綔鎸夐挳 -->
+ <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"
+ @pagination="handlePageChange"
+ />
</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";
-const childRef = ref(null);
+import { getProductionMasterList } from "@/api/production";
+
+// 琛ㄦ牸鍒楅厤缃�
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 searchForm = reactive({
- searchAll:""
-});
-
-// 琛ㄦ牸鏁版嵁
+// 鍝嶅簲寮忔暟鎹�
const tableData = ref([]);
const loading = ref(false);
-
-// 鍒嗛〉鏁版嵁
-const pagination = reactive({
- currentPage: 1,
- pageSize: 10,
- total: 0,
-});
-
-// 閫変腑鐨勮鏁版嵁
+const total = ref(0);
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 {
+ // 鏋勫缓姝g‘鐨勫垎椤靛弬鏁�
const params = {
- ...searchForm,
- pageNum: pagination.currentPage,
- pageSize: pagination.pageSize,
+ 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
};
- // const res = await getProductionList(params)
- // 鍋囨暟鎹�
- const res = {
- data: {
- list: [
- {
- sequence: 1,
- category: "鏃犵儫鐓�",
- unit: "鍚�",
- productionVolume: 100,
- laborCost: "300",
- materialCost: "200",
- equipmentCost: "100",
- totalCost: "600",
- totalPrice: "800",
- profit: "200",
- reviewer: "寮犱笁",
- date: "2023-10-01",
- },
- {
- sequence: 12,
- category: "鏃犵儫鐓�",
- unit: "鍚�",
- productionVolume: 100,
- laborCost: "3100",
- materialCost: "2020",
- equipmentCost: "1300",
- totalCost: "6030",
- totalPrice: "8300",
- profit: "2300",
- reviewer: "寮犱笁",
- date: "2025-10-02",
- },
- ],
- total: 2,
- },
- };
-
- tableData.value = res.data.list;
- pagination.total = res.data.total;
+
+ 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 = () => {
- searchForm.keyword = "";
- searchForm.addUser = "";
- 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.pageSize = 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">
@@ -277,7 +216,7 @@
width: 20%;
}
}
-.search-form{
+.search-form {
display: flex;
justify-content: space-between;
align-items: center;
@@ -291,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