From ba07ace535232e5ea77cf0a89cd1c079895e1441 Mon Sep 17 00:00:00 2001 From: zhang_12370 <z2864490065@outlook.com> Date: 星期三, 23 七月 2025 17:22:28 +0800 Subject: [PATCH] 1、新增弹窗表格 2、完善设备管理 --- src/api/equipment/requisition/index.js | 9 + src/views/equipment/management/index.vue | 244 +++++++++++++++++++++++++++------- src/components/dialog/DilogTable.vue | 112 ++++++++++++++++ 3 files changed, 311 insertions(+), 54 deletions(-) diff --git a/src/api/equipment/requisition/index.js b/src/api/equipment/requisition/index.js index 65c23d1..3ba406d 100644 --- a/src/api/equipment/requisition/index.js +++ b/src/api/equipment/requisition/index.js @@ -20,4 +20,13 @@ method: 'post', data }) +} + +// /equipmentUsageDetail/list?usageId=3 +// 璁惧棰嗙敤褰掕繕璁板綍鏌ヨ +export function getUsageDetailList(usageId) { + return request({ + url: `/equipmentUsageDetail/list?usageId=${usageId}`, + method: 'get' + }) } \ No newline at end of file diff --git a/src/components/dialog/DilogTable.vue b/src/components/dialog/DilogTable.vue new file mode 100644 index 0000000..9ecba42 --- /dev/null +++ b/src/components/dialog/DilogTable.vue @@ -0,0 +1,112 @@ +<template> + <el-dialog + v-model="visible" + :title="title" + :width="width" + :destroy-on-close="true" + @close="handleClose" + class="dialog-table" + > + <ETable + :columns="columns" + :table-data="tableData" + :loading="loading" + :show-selection="false" + :show-operations="false" + /> + </el-dialog> +</template> + +<script setup> +import { computed } from 'vue' +import ETable from '@/components/Table/ETable.vue' + +const props = defineProps({ + // 寮圭獥鎺у埗 + modelValue: { + type: Boolean, + default: false + }, + title: { + type: String, + default: '鏁版嵁琛ㄦ牸' + }, + width: { + type: String, + default: '80%' + }, + + // 琛ㄦ牸鏁版嵁 + tableData: { + type: Array, + default: () => [] + }, + columns: { + type: Array, + default: () => [] + }, + loading: { + type: Boolean, + default: false + } +}) + +const emit = defineEmits(['update:modelValue']) + +// 寮圭獥鏄剧ず鎺у埗 +const visible = computed({ + get: () => props.modelValue, + set: (value) => emit('update:modelValue', value) +}) + +// 鍏抽棴寮圭獥 +const handleClose = () => { + emit('update:modelValue', false) +} +</script> + +<style lang="scss" scoped> +.dialog-table { + :deep(.el-dialog) { + background-color: #f8f9fa; + } + + :deep(.el-dialog__header) { + background-color: #f1f3f4; + border-bottom: 1px solid #e4e7ed; + padding: 20px 24px 16px; + + .el-dialog__title { + color: #303133; + font-weight: 600; + } + } + + :deep(.el-dialog__body) { + background-color: #f8f9fa; + padding: 20px 24px; + + .el-table { + background-color: #ffffff; + border-radius: 6px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.06); + } + + .el-table th.el-table__cell { + background-color: #fafbfc; + color: #606266; + font-weight: 600; + border-bottom: 1px solid #ebeef5; + } + + .el-table td.el-table__cell { + background-color: #ffffff; + border-bottom: 1px solid #f5f7fa; + } + + .el-table__row:hover > td { + background-color: #f8f9fa !important; + } + } +} +</style> \ No newline at end of file diff --git a/src/views/equipment/management/index.vue b/src/views/equipment/management/index.vue index 0654e82..656e162 100644 --- a/src/views/equipment/management/index.vue +++ b/src/views/equipment/management/index.vue @@ -52,7 +52,7 @@ >鍒犻櫎</el-button > </el-row> - <!-- 琛ㄦ牸缁勪欢 --> + <!-- 琛ㄦ牸缁勪欢 --> <div> <data-table :showOverflowTooltip="false" @@ -65,32 +65,11 @@ @edit="handleEdit" @viewRow="handleView" @selection-change="handleSelectionChange" - :operations="['edit', 'viewRow']" - :operationsWidth="200" + @custom-click="handleCustomButtonClick" + :operations="getTableOperations()" + :operationsWidth="getOperationsWidth()" + :customButtons="getCustomButtons()" > - <!-- 瀛楁鍚嶇О鍒楃殑鑷畾涔夋彃妲� - 鏄剧ず涓烘爣绛� --> - <template - v-if="activeTab === 'coalQualityMaintenance'" - #fieldIds="{ row }" - > - <template - v-if=" - typeof row.fieldIds === 'string' && row.fieldIds.includes(',') - " - > - <el-tag - v-for="(field, index) in row.fieldIds.split(',')" - :key="index" - size="small" - style="margin-right: 4px; margin-bottom: 2px" - type="primary" - > - </el-tag> - </template> - <template v-else> - <el-tag size="small" type="primary"> </el-tag> - </template> - </template> </data-table> </div> <pagination @@ -126,6 +105,15 @@ :form="form" @submit="getList" /> --> + + <!-- 鏌ョ湅璇︽儏寮圭獥 --> + <DilogTable + v-model="dialogTableVisible" + :title="dialogTableTitle" + :table-data="dialogTableData" + :columns="dialogTableColumns" + width="60%" + /> </el-card> </div> </template> @@ -140,7 +128,7 @@ import Pagination from "@/components/Pagination"; import managementDialog from "./mould/managementDialog.vue"; import EquipmentRequisition from "./mould/equipmentRequisitionDialog.vue"; -import UsageRecord from "./mould/usageRecord.vue"; +import DilogTable from "@/components/dialog/DilogTable.vue"; // API 鏈嶅姟瀵煎叆 import { useDelete } from "@/hooks/useDelete.js"; @@ -148,30 +136,60 @@ getManagementList, delEquipment, } from "@/api/equipment/management/index.js"; -import { getUsageRecordList } from "@/api/equipment/requisition/index.js"; +import { getUsageRecordList, getUsageDetailList } from "@/api/equipment/requisition/index.js"; -// 鍝嶅簲寮忕姸鎬佺鐞� -const form = ref({}); -const title = ref(""); -const copyForm = ref({}); -const addOrEdit = ref("add"); -const manaDialog = ref(false); -const equipmentRequisitionDialog = ref(false); -const usageRecordDialog = ref(false); -const loading = ref(false); -const activeTab = ref("management"); -const selectedRows = ref([]); -const tableData = ref([]); +// 鍝嶅簲寮忕姸鎬佺鐞� - 浣跨敤瑙f瀯鍜岄粯璁ゅ�� +const initFormState = () => ({ consumables: false }); -// 鍒嗛〉鐘舵�� -const pageNum = ref(1); -const pageSizes = ref(10); -const total = ref(0); - -// 鏌ヨ鍙傛暟 -const queryParams = reactive({ - searchAll: "", +const state = reactive({ + form: initFormState(), + title: "", + copyForm: {}, + addOrEdit: "add", + loading: false, + activeTab: "management", + selectedRows: [], + tableData: [], + // 寮圭獥鐘舵�� + dialogs: { + management: false, + equipmentRequisition: false, + usageRecord: false, + detailTable: false, + }, + // 璇︽儏琛ㄦ牸鐘舵�� + detailTable: { + data: [], + columns: [], + title: "", + }, + // 鍒嗛〉鐘舵�� + pagination: { + pageNum: 1, + pageSize: 10, + total: 0, + }, + // 鏌ヨ鍙傛暟 + queryParams: { + searchAll: "", + }, }); + +// 浣跨敤瑙f瀯绠�鍖栬闂� +const { + form, + title, + copyForm, + addOrEdit, + loading, + activeTab, + selectedRows, + tableData, + dialogs, + detailTable, + pagination, + queryParams, +} = toRefs(state); // 鏍囩椤甸厤缃� - 渚夸簬鍚庣画鎵╁睍 const tabsConfig = { @@ -204,12 +222,16 @@ { prop: "equipmentNo", label: "璁惧缂栧彿", minWidth: 100 }, { prop: "equipmentName", label: "璁惧鍚嶇О", minWidth: 100 }, { prop: "usageQuantity", label: "棰嗙敤鏁伴噺", minWidth: 100 }, + {prop: "returnQuantity" , label: "褰掕繕鏁伴噺", minWidth: 100, + formatter: (row) => row.returnQuantity || 0 + }, { prop: "equipmentStatus", label: "浣跨敤鐘舵��", minWidth: 100, formatter: (row) => (row.equipmentStatus == 1 ? "浣跨敤涓�" : "宸插綊杩�"), }, + { prop: "usageStartTime", label: "浣跨敤寮�濮嬫椂闂�", minWidth: 100 }, { prop: "usageEndTime", label: "浣跨敤缁撴潫鏃堕棿", minWidth: 100 }, { prop: "remarks", label: "澶囨敞", minWidth: 100 }, @@ -261,6 +283,61 @@ const columns = computed(() => currentTabConfig.value?.columns || []); const selectedCount = computed(() => selectedRows.value.length); +// 鍔ㄦ�佽幏鍙栬〃鏍兼搷浣滈厤缃� +const getTableOperations = () => { + if (activeTab.value === 'equipmentRequisition') { + return [ 'viewRow']; // 璁惧棰嗙敤椤甸潰鍙樉绀虹紪杈戝拰鏌ョ湅 + } + return ['edit', 'viewRow']; // 榛樿鎿嶄綔 +}; + +// 鍔ㄦ�佽幏鍙栨搷浣滃垪瀹藉害 +const getOperationsWidth = () => { + if (activeTab.value === 'equipmentRequisition') { + return 250; // 涓哄綊杩樻寜閽鐣欐洿澶氱┖闂� + } + return 200; // 榛樿瀹藉害 +}; + +// 鍔ㄦ�佽幏鍙栬嚜瀹氫箟鎸夐挳閰嶇疆 +const getCustomButtons = () => { + const buttons = []; + + // 鍦ㄨ澶囬鐢ㄩ〉闈㈡坊鍔犲綊杩樻寜閽� + if (activeTab.value === 'equipmentRequisition') { + buttons.push({ + name: 'return', + label: '褰掕繕', + type: 'success', + size: 'small', + link: true, + show: (row) => row.equipmentStatus == 1 || row.equipmentStatus == 2, // 鍙湁浣跨敤涓殑璁惧鎵嶆樉绀哄綊杩樻寜閽� + disabled: (row) => false, + }); + } + + return buttons; +}; + +// 澶勭悊鑷畾涔夋寜閽偣鍑讳簨浠� +const handleCustomButtonClick = ({ buttonName, row }) => { + switch (buttonName) { + case 'return': + handleReturn(row); + break; + // 鍙互鍦ㄨ繖閲屾坊鍔犳洿澶氳嚜瀹氫箟鎸夐挳鐨勫鐞嗛�昏緫 + default: + console.warn(`鏈鐞嗙殑鑷畾涔夋寜閽�: ${buttonName}`); + } +}; +const handleReturn = (row) => { + form.value = { ...row }; + addOrEdit.value = "return"; // 璁剧疆涓哄綊杩樻ā寮� + title.value = `褰掕繕璁惧`; + copyForm.value = { ...row }; + equipmentRequisitionDialog.value = true; + console.log("褰掕繕璁惧锛�", row); +}; // 浜嬩欢澶勭悊鍑芥暟 const handleTabClick = (tab) => { activeTab.value = tab.props.name; @@ -323,14 +400,74 @@ } }; -const handleView = (row) => { +const handleView = async (row) => { + // 閽堝璁惧绠$悊椤甸潰锛氱洿鎺ユ墦寮�缂栬緫寮圭獥鏌ョ湅 + if (activeTab.value === 'management') { + form.value = { ...row }; + addOrEdit.value = "viewRow"; + title.value = `鏌ョ湅${currentTabConfig.value.label}`; + copyForm.value = { ...row }; + manaDialog.value = true; + return; + } + + // 閽堝璁惧棰嗙敤椤甸潰锛氭墦寮�璇︽儏璁板綍琛ㄦ牸 + if (activeTab.value === 'equipmentRequisition') { + try { + dialogTableTitle.value = `${row.equipmentName || '璁惧'} - 鎿嶄綔璁板綍璇︽儏`; + + // 鏄剧ず鍔犺浇鐘舵�� + dialogTableVisible.value = true; + dialogTableData.value = []; + + // 璋冪敤璇︽儏鎺ュ彛鑾峰彇鏁版嵁 + const { data, code } = await getUsageDetailList(row.id); + + if (code === 200 && data) { + console.log('璁惧鎿嶄綔璁板綍:', data); + + // 澶勭悊鏁扮粍鏁版嵁锛岀洿鎺ユ樉绀烘搷浣滆褰曞垪琛� + if (Array.isArray(data.records)) { + dialogTableData.value = data.records; + dialogTableColumns.value = [ + { prop: 'equipmentNo', label: '璁惧缂栧彿', minWidth: 100 }, + { prop: 'equipmentName', label: '璁惧鍚嶇О', minWidth: 120 }, + { prop: 'specification', label: '瑙勬牸鍨嬪彿', minWidth: 100 }, + { + prop: 'operationType', + label: '鎿嶄綔绫诲瀷', + minWidth: 80, + formatter: (row) => row.operationType === 1 ? '棰嗙敤' : '褰掕繕' + }, + { prop: 'quantity', label: '鎿嶄綔鏁伴噺', minWidth: 80 }, + { prop: 'operator', label: '鎿嶄綔浜�', minWidth: 80 }, + { prop: 'remark', label: '澶囨敞', minWidth: 150, showOverflowTooltip: true }, + { prop: 'createTime', label: '鎿嶄綔鏃堕棿', minWidth: 150 } + ]; + } else { + ElMessage.warning('鏆傛棤鎿嶄綔璁板綍'); + dialogTableVisible.value = false; + } + } else { + ElMessage.error('鑾峰彇璇︽儏鏁版嵁澶辫触'); + dialogTableVisible.value = false; + } + + } catch (error) { + console.error('鑾峰彇璇︽儏澶辫触:', error); + ElMessage.error('鑾峰彇璇︽儏鏁版嵁澶辫触'); + dialogTableVisible.value = false; + } + return; + } + + // 鍏朵粬椤甸潰鐨勯粯璁ゅ鐞� form.value = { ...row }; addOrEdit.value = "viewRow"; title.value = `鏌ョ湅${currentTabConfig.value.label}`; copyForm.value = { ...row }; - if (activeTab.value === "equipmentRequisition") { - equipmentRequisitionDialog.value = true; - } else if (activeTab.value === "usageRecord") { + + if (activeTab.value === "usageRecord") { usageRecordDialog.value = true; } else { manaDialog.value = true; @@ -371,8 +508,7 @@ // 璁惧棰嗙敤寮圭獥鎻愪氦澶勭悊 const onEquipmentRequisitionSubmit = (formData) => { - console.log("璁惧棰嗙敤鎻愪氦鏁版嵁锛�", formData); - if (formData.equipmentStatus == 1) { + if (formData.equipmentStatus == 2) { ElMessage.success("璁惧褰掕繕鎴愬姛"); } else { ElMessage.success("璁惧棰嗙敤鎴愬姛"); -- Gitblit v1.9.3