From 50b6007b336a65b7deb6c77c9fdc608865067608 Mon Sep 17 00:00:00 2001 From: 张诺 <2864490065@qq.com> Date: 星期五, 25 七月 2025 16:31:57 +0800 Subject: [PATCH] 昭德改善销售数量 --- src/views/equipment/management/index.vue | 974 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 486 insertions(+), 488 deletions(-) diff --git a/src/views/equipment/management/index.vue b/src/views/equipment/management/index.vue index 3481d2f..f82ac28 100644 --- a/src/views/equipment/management/index.vue +++ b/src/views/equipment/management/index.vue @@ -30,597 +30,564 @@ <!-- 鎿嶄綔鎸夐挳鍖� --> <el-row :gutter="24" class="table-toolbar"> - <el-button :icon="Plus" type="primary" @click="handleAdd" - >鏂板缓</el-button + <el-button + :icon="Plus" + type="primary" + v-show="activeTab === 'management'" + @click="handleAdd" + >璁惧鏂板</el-button > - <el-button :icon="Delete" type="danger" @click="handleDelete" - >鍒犻櫎</el-button + <el-button + :icon="Plus" + type="primary" + v-show="activeTab === 'equipmentRequisition'" + @click="handleAdd" + >棰嗙敤</el-button > - <!-- <el-button - v-show="canExport" - :icon="Download" - type="info" - @click="handleExport" - >瀵煎嚭</el-button - > --> + <el-button + :icon="Delete" + type="danger" + v-show="activeTab === 'management'" + @click="handleDelete" + :disabled="selectedCount === 0" + >鍒犻櫎 {{ selectedCount > 0 ? `(${selectedCount})` : '' }}</el-button + > </el-row> - <!-- 琛ㄦ牸缁勪欢 --> - <div> + <!-- 琛ㄦ牸缁勪欢 --> + <div class="table-container"> + <!-- 鍔犺浇鐘舵�� --> + <el-skeleton v-if="loading" animated> + <template #template> + <el-skeleton-item variant="h1" style="width: 40%" /> + <div style="padding: 14px;"> + <el-skeleton-item variant="text" /> + <el-skeleton-item variant="text" /> + <el-skeleton-item variant="text" /> + </div> + </template> + </el-skeleton> + + <!-- 鏁版嵁琛ㄦ牸 --> <data-table + v-else + :showOverflowTooltip="false" :border="true" :columns="columns" :loading="loading" style="width: 100%; height: calc(100vh - 29em)" - :show-selection="true" + :show-selection="activeTab === 'management'" :table-data="tableData" @edit="handleEdit" @viewRow="handleView" @selection-change="handleSelectionChange" - :operations="['edit', 'viewRow']" - :operationsWidth="200" + @custom-click="handleCustomButtonClick" + :operations="getTableOperations()" + :operationsWidth="getOperationsWidth()" + :customButtons="getCustomButtons()" > - <!-- 瀛楁鍚嶇О鍒楃殑鑷畾涔夋彃妲� - 鏄剧ず涓烘爣绛� --> - <template - v-if="tabName === 'coalQualityMaintenance'" - #fieldIds="{ row }" - > - <template - v-if=" - typeof row.fieldIds === 'string' && row.fieldIds.includes(',') - " + <!-- 绌虹姸鎬佹彃妲� --> + <template #empty> + <el-empty + :description="`鏆傛棤${currentTabConfig?.label || ''}鏁版嵁`" + :image-size="120" > - <el-tag - v-for="(field, index) in row.fieldIds.split(',')" - :key="index" - size="small" - style="margin-right: 4px; margin-bottom: 2px" - type="primary" - > - {{ getFieldDisplayName(field.trim()) }} - </el-tag> - </template> - <template v-else> - <el-tag size="small" type="primary"> - {{ getFieldDisplayName(row.fieldIds) || "--" }} - </el-tag> - </template> + <template #description> + <p>鏆傛棤{{ currentTabConfig?.label || '' }}鏁版嵁</p> + <p v-if="queryParams.searchAll" class="text-secondary"> + 灏濊瘯璋冩暣鎼滅储鏉′欢鎴� + <el-button type="primary" link @click="resetQuery">娓呯┖鎼滅储</el-button> + </p> + </template> + </el-empty> </template> </data-table> </div> <pagination v-if="total > 0" :layout="'total, prev, pager, next, jumper'" - :limit="pageSizes" + :limit="pageSize" :page="pageNum" :total="total" @pagination="handPagination" /> <managementDialog - + v-if="activeTab == 'management'" + v-model:copyForm="copyForm" + v-model:managementFormDialog="manaDialog" + :addOrEdit="addOrEdit" + :form="form" + @submit="getList" ></managementDialog> + <EquipmentRequisition + v-if="activeTab == 'equipmentRequisition'" + v-model="equipmentRequisitionDialog" + :formData="form" + :maxQuantity="getMaxQuantity()" + :addOrEdit="addOrEdit" + :equipmentStatus="form.equipmentStatus" + @submit="onEquipmentRequisitionSubmit" + /> + <!-- <UsageRecord + v-if="activeTab == 'usageRecord'" + v-model:copyForm="copyForm" + v-model:usageRecordDialog="usageRecordDialog" + :addOrEdit="addOrEdit" + :form="form" + @submit="getList" + /> --> + + <!-- 鏌ョ湅璇︽儏寮圭獥 --> + <DilogTable + v-model="dialogTableVisible" + :title="dialogTableTitle" + :table-data="dialogTableData" + :columns="dialogTableColumns" + width="70%" + height="500px" + /> </el-card> </div> </template> <script setup> -import { - computed, - getCurrentInstance, - onMounted, - reactive, - ref, - nextTick, -} from "vue"; -import { ElMessage, ElMessageBox } from "element-plus"; -import { Delete, Download, Plus } from "@element-plus/icons-vue"; +import { computed, onMounted, reactive, ref, nextTick, toRefs } from "vue"; +import { ElMessage } from "element-plus"; +import { Delete, Plus } from "@element-plus/icons-vue"; -// ===== 缁勪欢瀵煎叆 ===== +// 缁勪欢瀵煎叆 import DataTable from "@/components/Table/ETable.vue"; import Pagination from "@/components/Pagination"; import managementDialog from "./mould/managementDialog.vue"; -// ===== API 鏈嶅姟瀵煎叆 ===== -import { delSupply, getSupply } from "@/api/basicInformation/supplier.js"; +import EquipmentRequisition from "./mould/equipmentRequisitionDialog.vue"; +import DilogTable from "@/components/dialog/DilogTable.vue"; + +// API 鏈嶅姟瀵煎叆 import { useDelete } from "@/hooks/useDelete.js"; -import { testUserList } from "@/api/tool/publicInterface.js"; -const { proxy } = getCurrentInstance(); +import { + getManagementList, + delEquipment, +} from "@/api/equipment/management/index.js"; +import { getUsageRecordList, getUsageDetailList } from "@/api/equipment/requisition/index.js"; -// ===== 鍝嶅簲寮忕姸鎬佺鐞� ===== -const dialogFormVisible = ref(false); -const form = ref({}); -const title = ref(""); -const copyForm = ref({}); -const addOrEdit = ref("add"); - -// 鏁版嵁缂撳瓨鏄犲皠 -const userList = ref([]); -const userMap = ref({}); // 鐢ㄦ埛ID -> 鐢ㄦ埛鍚嶆槧灏勮〃 -const addressMap = ref({}); // 鍦板潃ID -> 鍦板潃淇℃伅鏄犲皠琛� -const coalFieldList = ref([]); // 鐓よ川瀛楁鍒楄〃 - -// 椤甸潰鐘舵�佹帶鍒� -const tabName = ref("management"); -const loading = ref(false); -const activeTab = ref("management"); - -// 鍒嗛〉鐘舵�佺鐞� -const pageNum = ref(1); -const pageSizes = ref(10); -const total = ref(0); - -// 琛ㄦ牸鐘舵�佺鐞� -const selectedRows = ref([]); -const tableData = ref([]); -const columns = ref(); - -// 鏌ヨ鍙傛暟 -const queryParams = reactive({}); - -// 鍦板潃閫夋嫨鏁版嵁 -const addressSelectOptions = ref([]); - -// ===== 閰嶇疆甯搁噺 ===== - -// 鏍囩椤甸厤缃� -const tabs = reactive([ - { name: "management", label: "渚涘簲鍟嗕俊鎭�" }, - { name: "customer", label: "瀹㈡埛淇℃伅" }, -]); - -// ===== 宸ュ叿鍑芥暟 ===== - - -/** - * 鏋勫缓鍦板潃鏄犲皠琛� - * @param {Array} areaData - 鍦板潃鏁版嵁 - * @description 閫掑綊鏋勫缓鍦板潃鏄犲皠琛紝鏀寔澶氱骇鍦板潃鏌ユ壘 - */ -const buildAddressMap = (areaData) => { - const buildMap = (list, pathList = []) => { - list.forEach((item) => { - const currentPath = [...pathList, item.label]; - addressMap.value[item.id] = { - name: item.label, - fullPath: currentPath.join(" / "), - }; - if (item.children && item.children.length > 0) { - buildMap(item.children, currentPath); - } - }); - }; - buildMap(areaData); +// 璁惧鐘舵�佹灇涓� +const EQUIPMENT_STATUS = { + USING: 1, // 浣跨敤涓� + PARTIAL_RETURN: 2, // 閮ㄥ垎褰掕繕 + RETURNED: 3 // 宸插綊杩� }; -/** - * 鏍煎紡鍖栧湴鍧�鏁扮粍涓烘樉绀哄瓧绗︿覆 - * @param {Array} addressIds - 鍦板潃ID鏁扮粍 - * @returns {string} 鏍煎紡鍖栧悗鐨勫湴鍧�瀛楃涓� - * @description 灏嗗湴鍧�ID鏁扮粍杞崲涓哄彲璇荤殑鍦板潃瀛楃涓� - */ -const formatAddressArray = (addressIds) => { - if ( - !addressMap.value || - Object.keys(addressMap.value).length === 0 || - !addressIds || - !Array.isArray(addressIds) || - addressIds.length === 0 || - addressIds.every((id) => !id) - ) { - return "--"; - } - - const addressNames = addressIds.map( - (id) => addressMap.value[id]?.name || "--" - ); - - if (addressNames.every((name) => name === "--")) { - return "--"; - } - - return addressNames.filter((name) => name !== "--").join(" / "); -}; - -/** - * 鑾峰彇鐢ㄦ埛鍒楄〃鏁版嵁骞舵瀯寤烘槧灏勮〃 - * @description 鑾峰彇鐢ㄦ埛鏁版嵁骞舵瀯寤篒D鍒扮敤鎴峰悕鐨勬槧灏勫叧绯� - */ -const getUserList = async () => { - try { - const res = await testUserList(); - console.log("鑾峰彇鐢ㄦ埛鍒楄〃鏁版嵁:", res); - console.log("userMap:", userMap.value); - if (res && res.data) { - userList.value = res.data; - userList.value.forEach((user) => { - userMap.value[user.userId] = user.nickName; - }); - } - } catch (error) { - console.error("鑾峰彇鐢ㄦ埛鍒楄〃澶辫触:", error); +// 鑾峰彇鐘舵�佹枃鏈� +const getStatusText = (status) => { + switch(status) { + case EQUIPMENT_STATUS.USING: return "浣跨敤涓�"; + case EQUIPMENT_STATUS.PARTIAL_RETURN: return "閮ㄥ垎褰掕繕"; + case EQUIPMENT_STATUS.RETURNED: return "宸插綊杩�"; + default: return "鏈煡鐘舵��"; } }; -/** - * 鏍规嵁瀛楁ID鑾峰彇瀛楁鏄剧ず鍚嶇О - * @param {string|number} fieldId - 瀛楁ID - * @returns {string} 瀛楁鏄剧ず鍚嶇О - * @description 閫氳繃瀛楁ID鍖归厤瀵瑰簲鐨勫瓧娈靛悕绉� - */ -const getFieldDisplayName = (fieldId) => { - if (!fieldId) return "--"; - - const numId = parseInt(fieldId); - const matchedField = coalFieldList.value.find((item) => item.id === numId); - - return matchedField ? matchedField.fieldName : numId; +// 鑾峰彇鐘舵�侀鑹� +const getStatusColor = (status) => { + switch(status) { + case EQUIPMENT_STATUS.USING: return '#409eff'; // 钃濊壊 + case EQUIPMENT_STATUS.PARTIAL_RETURN: return '#e6a23c'; // 姗欒壊 + case EQUIPMENT_STATUS.RETURNED: return '#67c23a'; // 缁胯壊 + default: return '#909399'; // 鐏拌壊 + } }; -/** - * 褰撳墠鏍囩椤垫槸鍚︽敮鎸佸鍑哄姛鑳� - */ -const canExport = computed(() => { - return ["management"].includes(tabName.value); +// 鍝嶅簲寮忕姸鎬佺鐞� - 浣跨敤瑙f瀯鍜岄粯璁ゅ�� +const initFormState = () => ({ consumables: false }); + +const state = reactive({ + form: initFormState(), + title: "", + copyForm: {}, + addOrEdit: "add", + loading: false, + activeTab: "management", + selectedRows: [], + tableData: [], + // 鍒嗛〉鐘舵�� + pageNum: 1, + pageSize: 10, + total: 0, + // 鏌ヨ鍙傛暟 + queryParams: { + searchAll: "", + }, }); -/** - * 鎼滅储妗嗗崰浣嶇鏂囨湰 - */ -const searchPlaceholder = computed(() => { - const placeholderMap = { - management: "渚涘簲鍟�/缁熶竴璇嗗埆鐮�/璇︾粏鍦板潃", - }; - return placeholderMap[tabName.value] || "璇疯緭鍏ユ悳绱俊鎭�"; -}); +// 浣跨敤瑙f瀯绠�鍖栬闂� +const { + form, + title, + copyForm, + addOrEdit, + loading, + activeTab, + selectedRows, + tableData, + pageNum, + pageSize, + total, + queryParams, +} = toRefs(state); -/** - * 鏄惁鏄剧ず鎼滅储妗� - */ -const shouldShowSearch = computed(() => { - return [ - "management", - ].includes(tabName.value); -}); +// 娣诲姞缂哄け鐨勫搷搴斿紡鍙橀噺 +const manaDialog = ref(false); +const equipmentRequisitionDialog = ref(false); +const usageRecordDialog = ref(false); +const dialogTableVisible = ref(false); +const dialogTableTitle = ref(''); +const dialogTableData = ref([]); +const dialogTableColumns = ref([]); -/** - * 褰撳墠閫変腑琛屾暟閲� - */ +// 鏍囩椤甸厤缃� - 渚夸簬鍚庣画鎵╁睍 +const tabsConfig = { + management: { + label: "璁惧鍒楄〃", + searchPlaceholder: "璁惧缂栧彿/璁惧鍚嶇О/瑙勬牸鍨嬪彿", + showSearch: true, + api: getManagementList, + deleteApi: delEquipment, + columns: [ + { prop: "equipmentNo", label: "璁惧缂栧彿", minWidth: 100 }, + { prop: "equipmentName", label: "璁惧鍚嶇О", minWidth: 100 }, + { prop: "consumables", label: "鑰楁潗", + formatter: (row) => (row.consumables ? "鏄�" : "鍚�"), minWidth: 100 }, + { prop: "quantity", label: "鎬绘暟閲�", minWidth: 100 }, + { prop: "usedNo", label: "宸蹭娇鐢ㄦ暟閲�", minWidth: 100 }, + { prop: "specification", label: "瑙勬牸鍨嬪彿", minWidth: 100 }, + { prop: "purchaseDate", label: "閲囪喘鏃ユ湡", minWidth: 100 }, + { prop: "purchasePrice", label: "閲囪喘浠锋牸", minWidth: 100 }, + ], + }, + equipmentRequisition: { + label: "璁惧棰嗙敤", + searchPlaceholder: "璁惧缂栧彿/璁惧鍚嶇О/瑙勬牸鍨嬪彿", + showSearch: true, + api: getUsageRecordList, + deleteApi: null, + columns: [ + { prop: "userName", label: "棰嗙敤浜�", minWidth: 100 }, + { 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) => getStatusText(row.equipmentStatus), + cellStyle: (row) => ({ color: getStatusColor(row.equipmentStatus) }), + }, + { prop: "usageStartTime", label: "浣跨敤寮�濮嬫椂闂�", minWidth: 100 }, + { prop: "usageEndTime", label: "浣跨敤缁撴潫鏃堕棿", minWidth: 100 }, + { prop: "remarks", label: "澶囨敞", minWidth: 100 }, + ], + }, +}; + +// 鏍囩椤垫暟鎹� +const tabs = reactive( + Object.entries(tabsConfig).map(([name, config]) => ({ + name, + label: config.label, + })) +); + +// 褰撳墠鏍囩椤甸厤缃� +const currentTabConfig = computed(() => tabsConfig[activeTab.value]); + +// 璁$畻灞炴�� +const searchPlaceholder = computed( + () => currentTabConfig.value?.searchPlaceholder || "璇疯緭鍏ユ悳绱俊鎭�" +); +const shouldShowSearch = computed( + () => currentTabConfig.value?.showSearch || false +); +const columns = computed(() => currentTabConfig.value?.columns || []); const selectedCount = computed(() => selectedRows.value.length); -// ===== 琛ㄦ牸鍒楅厤缃� ===== - -/** - * 渚涘簲鍟嗚〃鏍煎垪閰嶇疆 - */ -const management = ref([ - { prop: "equipmentId", label: "璁惧缂栧彿", minWidth: 100 }, - { prop: "equipmentName", label: "璁惧鍚嶇О", minWidth: 100 }, - { prop: "quantity", label: "鏁伴噺", minWidth: 100 }, - { prop: "specification", label: "瑙勬牸鍨嬪彿", minWidth: 100 }, - { prop: "usageStatus", label: "浣跨敤鐘舵��", minWidth: 100 }, - { prop: "usingDepartment", label: "浣跨敤閮ㄩ棬", minWidth: 100 }, - { prop: "userId", label: "浣跨敤浜�", minWidth: 100 }, - { prop: "purchaseDate", label: "閲囪喘鏃ユ湡", minWidth: 100 }, - { prop: "purchasePrice", label: "閲囪喘浠锋牸", minWidth: 100 }, -]); - - -// ===== 浜嬩欢澶勭悊鍑芥暟 ===== - -/** - * 鏍囩椤靛垏鎹簨浠跺鐞� - * @param {Object} tab - 鏍囩椤靛璞� - * @description 澶勭悊鏍囩椤靛垏鎹紝閲嶇疆琛ㄥ崟鍜岀姸鎬侊紝鍔犺浇瀵瑰簲鏁版嵁 - */ -const handleTabClick = (tab) => { - // 閲嶇疆琛ㄥ崟鍜岀姸鎬� - form.value = {}; - addOrEdit.value = "add"; - loading.value = true; - tabName.value = tab.props.name; - tableData.value = []; - pageNum.value = 1; - pageSizes.value = 10; - total.value = 0; - queryParams.searchAll = ""; - // 鏍规嵁鏍囩椤电被鍨嬭缃搴旂殑鍒楅厤缃� - const tabConfig = { - management: () => { - columns.value = management.value; - getList(); - }, - }; - - // 鎵ц瀵瑰簲鐨勯厤缃嚱鏁� - const configFn = tabConfig[tabName.value]; - if (configFn) { - configFn(); +// 鍔ㄦ�佽幏鍙栬〃鏍兼搷浣滈厤缃� +const getTableOperations = () => { + if (activeTab.value === 'equipmentRequisition') { + return [ 'viewRow']; // 璁惧棰嗙敤椤甸潰鍙樉绀虹紪杈戝拰鏌ョ湅 } + return ['edit', 'viewRow']; // 榛樿鎿嶄綔 }; -/** - * 閲嶇疆鏌ヨ鏉′欢 - * @description 閲嶇疆鏌ヨ鍙傛暟骞堕噸鏂板姞杞芥暟鎹� - */ -const resetQuery = () => { - Object.keys(queryParams).forEach((key) => { - if (key !== "pageNum" && key !== "pageSizes") { - queryParams[key] = ""; - } - }); +// 鍔ㄦ�佽幏鍙栨搷浣滃垪瀹藉害 +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 === EQUIPMENT_STATUS.USING || row.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN, + disabled: (row) => row.equipmentStatus === EQUIPMENT_STATUS.RETURNED, + }); + } + + return buttons; +}; + +// 澶勭悊鑷畾涔夋寜閽偣鍑讳簨浠� +const handleCustomButtonClick = ({ buttonName, row }) => { + switch (buttonName) { + case 'return': + handleReturn(row); + break; + // 鍙互鍦ㄨ繖閲屾坊鍔犳洿澶氳嚜瀹氫箟鎸夐挳鐨勫鐞嗛�昏緫 + default: + console.warn(`鏈鐞嗙殑鑷畾涔夋寜閽�: ${buttonName}`); + } +}; +const handleReturn = (row) => { + // 妫�鏌ヨ澶囩姸鎬� + if (row.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { + ElMessage.warning('璇ヨ澶囧凡褰掕繕瀹屾垚锛屾棤闇�鍐嶆褰掕繕'); + return; + } + + if (row.equipmentStatus !== EQUIPMENT_STATUS.USING && row.equipmentStatus !== EQUIPMENT_STATUS.PARTIAL_RETURN) { + ElMessage.warning('璇ヨ澶囧綋鍓嶇姸鎬佷笉鏀寔褰掕繕鎿嶄綔'); + return; + } + + form.value = { ...row }; + addOrEdit.value = "return"; // 璁剧疆涓哄綊杩樻ā寮� + title.value = `褰掕繕璁惧 - ${row.equipmentName || ''}`; + copyForm.value = { ...row }; + equipmentRequisitionDialog.value = true; + console.log("褰掕繕璁惧锛�", row); +}; +// 浜嬩欢澶勭悊鍑芥暟 +const handleTabClick = (tab) => { + activeTab.value = tab.props.name; + resetState(); getList(); }; -/** - * 鎼滅储鍔熻兘 - * @description 閲嶇疆椤电爜骞舵墽琛屾悳绱� - */ +const resetState = () => { + form.value = { + consumables: false, + }; + addOrEdit.value = "add"; + loading.value = true; + tableData.value = []; + pageNum.value = 1; + pageSize.value = 10; + total.value = 0; + queryParams.value.searchAll = ""; +}; + +const resetQuery = () => { + queryParams.value.searchAll = ""; + pageNum.value = 1; + getList(); +}; + const search = () => { pageNum.value = 1; getList(); }; -/** - * 鏂板鎸夐挳鐐瑰嚮澶勭悊 - */ const handleAdd = () => { addOrEdit.value = "add"; - handleAddEdit(tabName.value); -}; - -/** - * 鏂板/缂栬緫寮圭獥澶勭悊 - * @param {string} currentTabName - 褰撳墠鏍囩椤靛悕绉� - * @description 鏍规嵁鏍囩椤电被鍨嬭缃脊绐楁爣棰樺苟鎵撳紑寮圭獥 - */ -const handleAddEdit = (currentTabName) => { - const actionText = - addOrEdit.value === "add" - ? "鏂板" - : addOrEdit.value === "edit" - ? "缂栬緫" - : "鏌ョ湅"; - - const tabTitleMap = { - supplier: "渚涘簲鍟嗕俊鎭�", - customer: "瀹㈡埛淇℃伅", + form.value = { + consumables: false, }; - - title.value = `${actionText}${tabTitleMap[currentTabName] || ""}`; - openDialog(); -}; - -/** - * 鎵撳紑寮圭獥 - * @description 鏍规嵁缂栬緫鐘舵�佸喅瀹氭槸鍚﹀鍒惰〃鍗曟暟鎹� - */ -const openDialog = () => { - if (addOrEdit.value === "edit" || addOrEdit.value === "viewRow") { - copyForm.value = JSON.parse(JSON.stringify(form.value)); + title.value = `鏂板${currentTabConfig.value.label}`; + // 閫氱敤鐨� + copyForm.value = {}; + if (activeTab.value === "equipmentRequisition") { + equipmentRequisitionDialog.value = true; + } else if (activeTab.value === "usageRecord") { + usageRecordDialog.value = true; } else { - form.value = {}; + manaDialog.value = true; } - dialogFormVisible.value = true; }; -/** - * 鍒嗛〉澶勭悊 - * @param {Object} val - 鍒嗛〉鍙傛暟瀵硅薄 - */ -const handPagination = (val) => { - pageNum.value = val.page; - pageSizes.value = val.limit; - getList(); +const handleEdit = (row) => { + form.value = { ...row }; + addOrEdit.value = "edit"; + title.value = `缂栬緫${currentTabConfig.value.label}`; + copyForm.value = { ...row }; + if (activeTab.value === "equipmentRequisition") { + equipmentRequisitionDialog.value = true; + } else if (activeTab.value === "usageRecord") { + usageRecordDialog.value = true; + } else { + manaDialog.value = true; + } }; -/** - * 琛ㄥ崟鎻愪氦澶勭悊 - * @param {Object} val - 鎻愪氦缁撴灉瀵硅薄 - */ -const handleSubmit = async (val) => { - if (val.result.code !== 200) { - ElMessage.error("鎿嶄綔澶辫触锛�" + val.result.msg); +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; } - ElMessage.success(val.title + val.result.msg); - dialogFormVisible.value = false; + + // 閽堝璁惧棰嗙敤椤甸潰锛氭墦寮�璇︽儏璁板綍琛ㄦ牸 + 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) { + // 澶勭悊鏁扮粍鏁版嵁锛岀洿鎺ユ樉绀烘搷浣滆褰曞垪琛� + if (Array.isArray(data)) { + dialogTableData.value = data; + 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('鏆傛棤鎿嶄綔璁板綍'); + } + } 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 === "usageRecord") { + usageRecordDialog.value = true; + } else { + manaDialog.value = true; + } +}; + +const handPagination = (val) => { + pageNum.value = val.page; + pageSize.value = val.limit; getList(); }; -/** - * 寮圭獥鏄剧ず鐘舵�佸鐞� - * @param {boolean} value - 鏄剧ず鐘舵�� - */ -const handleDialogFormVisible = (value) => { - dialogFormVisible.value = value; -}; - -/** - * 琛ㄦ牸琛岄�夋嫨澶勭悊 - * @param {Array} selection - 閫変腑鐨勮鏁版嵁 - */ const handleSelectionChange = (selection) => { selectedRows.value = selection; }; -/** - * 缂栬緫鎸夐挳鐐瑰嚮澶勭悊 - * @param {Object} row - 琛屾暟鎹� - * @description 澶勭悊缂栬緫鎿嶄綔锛屾瀯寤哄湴鍧�鏁扮粍骞舵墦寮�缂栬緫寮圭獥 - */ -const handleEdit = (row) => { - form.value = JSON.parse(JSON.stringify(row)); - // 鏋勫缓渚涘簲鍟嗕笟鍔″湴鍧�鏁扮粍 - if (form.value.bprovinceId && form.value.bdistrictId && form.value.bcityId) { - form.value.bids = [row.bprovinceId, row.bcityId, row.bdistrictId]; - } - - // 鏋勫缓渚涘簲鍟嗚仈绯诲湴鍧�鏁扮粍 - if (form.value.cprovinceId && form.value.cdistrictId && form.value.ccityId) { - form.value.cids = [row.cprovinceId, row.ccityId, row.cdistrictId]; - } - - // 鏋勫缓瀹㈡埛涓氬姟鍦板潃鏁扮粍 - if ( - form.value.businessCityId && - form.value.businessDistrictId && - form.value.businessProvinceId - ) { - form.value.bids = [ - row.businessProvinceId, - row.businessCityId, - row.businessDistrictId, - ]; - } - - // 鏋勫缓瀹㈡埛鑱旂郴鍦板潃鏁扮粍 - if (form.value.cityId && form.value.districtId && form.value.provinceId) { - form.value.cids = [row.provinceId, row.cityId, row.districtId]; - } - - addOrEdit.value = "edit"; - handleAddEdit(tabName.value); -}; - - -/** - * 鎵归噺鍒犻櫎澶勭悊 - * @description 鎵归噺鍒犻櫎閫変腑鐨勮褰� - */ - const deleteApiMap = { - management: delSupply, - }; -const {handleDeleteBatch :handleDelete} = useDelete({ - deleteApi: () => deleteApiMap[tabName.value], +// 鍒犻櫎澶勭悊 +const { handleDeleteBatch: handleDelete } = useDelete({ + deleteApi: () => currentTabConfig.value.deleteApi, selectedRows: selectedRows, - getList: () => getList, - tableData: tableData, - total: total, + getList: () => getList(), + tableData, + total, confirmText: "纭鍒犻櫎閫変腑鐨勬暟鎹悧锛�", successText: "鍒犻櫎鎴愬姛", -}) +}); -/** - * 鍏抽棴寮圭獥澶勭悊 - */ -const handleBeforeClose = () => { - dialogFormVisible.value = false; - form.value = {}; +// 鑾峰彇璁惧鏈�澶у彲棰嗙敤鏁伴噺 +const getMaxQuantity = () => { + if (form.value.equipmentId) { + const equipment = tableData.value.find( + (item) => item.equipmentId === form.value.equipmentId + ); + return equipment ? equipment.quantity : null; + } + return null; }; -/** - * 瀵煎嚭鏁版嵁 - * @param {string} api - 瀵煎嚭鎺ュ彛璺緞 - * @param {string} name - 瀵煎嚭鏂囦欢鍚嶅墠缂� - */ -const exportData = (api, name) => { - proxy.download( - api, - { ...queryParams }, - `${name}${new Date().getTime()}.xlsx` - ); - ElMessage.success("瀵煎嚭鏁版嵁锛�" + name); -}; -// ===== 鏁版嵁鑾峰彇鍑芥暟 ===== - -/** - * 鏍规嵁褰撳墠鏍囩椤甸�夋嫨瀵瑰簲鐨凙PI鎺ュ彛 - * @returns {Promise} API璋冪敤Promise - * @description 缁熶竴鐨勬帴鍙i�夋嫨鍑芥暟锛屾牴鎹爣绛鹃〉绫诲瀷璋冪敤瀵瑰簲鐨凙PI - */ -const selectInterface = () => { - const apiParams = { - current: pageNum.value, - pageSize: pageSizes.value, - searchAll: queryParams.searchAll, - }; - - const apiMap = { - management: () => getSupply(apiParams), - customer: () => getCustomerList(apiParams), - coal: () => getCoalInfo(apiParams), - coalQualityMaintenance: () => getCoalPlanList(apiParams), - coalMeiZhiZiDuanWeiHu: () => coalField(apiParams), - }; - - const apiFunction = apiMap[tabName.value]; - return apiFunction - ? apiFunction() - : Promise.reject(new Error("鏈壘鍒板搴旂殑API鎺ュ彛")); +// 璁惧棰嗙敤寮圭獥鎻愪氦澶勭悊 +const onEquipmentRequisitionSubmit = (formData) => { + if (formData.equipmentStatus === EQUIPMENT_STATUS.RETURNED) { + ElMessage.success("璁惧宸插畬鍏ㄥ綊杩�"); + } else if (formData.equipmentStatus === EQUIPMENT_STATUS.PARTIAL_RETURN) { + } else if (formData.equipmentStatus === EQUIPMENT_STATUS.USING) { + ElMessage.success("璁惧棰嗙敤鎴愬姛"); + } else { + ElMessage.success("鎿嶄綔鎴愬姛"); + } + equipmentRequisitionDialog.value = false; + nextTick(() => { + form.value = {}; + getList(); + }); }; -/** - * 鑾峰彇鍒楄〃鏁版嵁 - * @description 缁熶竴鐨勬暟鎹幏鍙栧嚱鏁帮紝澶勭悊鍔犺浇鐘舵�佸拰閿欒澶勭悊 - */ +// 鏁版嵁鑾峰彇 const getList = async () => { try { loading.value = true; - const { data, code } = await selectInterface(); + const apiParams = { + current: pageNum.value, + pageSize: pageSize.value, + searchAll: queryParams.value.searchAll, + }; + + const { data, code } = await currentTabConfig.value.api(apiParams); if (code !== 200) { - ElMessage.error("鑾峰彇鏁版嵁澶辫触锛�" + (data?.msg || "鏈煡閿欒")); + // ElMessage.error("鑾峰彇鏁版嵁澶辫触锛�" + (data?.msg || "鏈煡閿欒")); return; } tableData.value = data.records || []; total.value = data.total || 0; } catch (error) { - console.error("鑾峰彇鍒楄〃鏁版嵁澶辫触:", error); ElMessage.error("鑾峰彇鏁版嵁澶辫触锛岃绋嶅悗鍐嶈瘯"); } finally { loading.value = false; } }; -const handleView = (row) => { - form.value = JSON.parse(JSON.stringify(row)); - // 鏋勫缓渚涘簲鍟嗕笟鍔″湴鍧�鏁扮粍 - if (form.value.bprovinceId && form.value.bdistrictId && form.value.bcityId) { - form.value.bids = [row.bprovinceId, row.bcityId, row.bdistrictId]; - } - - // 鏋勫缓渚涘簲鍟嗚仈绯诲湴鍧�鏁扮粍 - if (form.value.cprovinceId && form.value.cdistrictId && form.value.ccityId) { - form.value.cids = [row.cprovinceId, row.ccityId, row.cdistrictId]; - } - - // 鏋勫缓瀹㈡埛涓氬姟鍦板潃鏁扮粍 - if ( - form.value.businessCityId && - form.value.businessDistrictId && - form.value.businessProvinceId - ) { - form.value.bids = [ - row.businessProvinceId, - row.businessCityId, - row.businessDistrictId, - ]; - } - - // 鏋勫缓瀹㈡埛鑱旂郴鍦板潃鏁扮粍 - if (form.value.cityId && form.value.districtId && form.value.provinceId) { - form.value.cids = [row.provinceId, row.cityId, row.districtId]; - } - addOrEdit.value = "viewRow"; - handleAddEdit(tabName.value); -}; - - -// ===== 鐢熷懡鍛ㄦ湡閽╁瓙 ===== - -/** - * 缁勪欢鎸傝浇鍚庣殑鍒濆鍖栨搷浣� - */ -onMounted(async () => { - try { - // 骞惰鎵ц鍒濆鍖栨搷浣� - await Promise.all([ - handleTabClick({ props: { name: "management" } }), - getUserList(), - ]); - } catch (error) { - console.error("缁勪欢鍒濆鍖栧け璐�:", error); - ElMessage.error("椤甸潰鍒濆鍖栧け璐ワ紝璇峰埛鏂伴噸璇�"); - } +// 缁勪欢鎸傝浇 +onMounted(() => { + handleTabClick({ props: { name: "management" } }); }); </script> @@ -644,7 +611,9 @@ flex-wrap: wrap; gap: 10px; } - +.app-container { + padding: 18px !important; +} /* 鍝嶅簲寮忚〃鏍� */ @media screen and (max-width: 768px) { .table-toolbar { @@ -673,4 +642,33 @@ .main-container { background: red !important; } + +/* 璁惧鐘舵�佹牱寮� */ +.status-using { + color: #409eff; + font-weight: 500; +} + +.status-partial-return { + color: #e6a23c; + font-weight: 500; +} + +.status-returned { + color: #67c23a; + font-weight: 500; +} + +.status-unknown { + color: #909399; + font-weight: 500; +} + +/* 鐘舵�佹爣绛炬牱寮� */ +:deep(.el-table .cell .status-tag) { + font-size: 12px; + padding: 2px 6px; + border-radius: 4px; + white-space: nowrap; +} </style> -- Gitblit v1.9.3