From 5da536668e047dbaefbb79731ab2cacfdf70dc56 Mon Sep 17 00:00:00 2001 From: zhang_12370 <z2864490065@outlook.com> Date: 星期二, 22 七月 2025 17:36:38 +0800 Subject: [PATCH] 1、提交配煤计算器 解除煤种限制 2、增加销售出库的导出功能 3、库存管理正式库的导出功能 4、文档管理优化 5、优化设备管理模块 --- src/views/warehouseManagement/index.vue | 723 ++++++++++++++++++++++---------- src/views/calculator/index.vue | 6 src/views/equipment/management/index.vue | 14 src/views/salesOutbound/index.vue | 27 + src/views/equipment/management/mould/equipmentRequisitionDialog.vue | 79 ++ src/views/salesOutbound/components/formDia.vue | 12 src/views/equipment/management/mould/managementDialog.vue | 11 src/views/archiveManagement/index.vue | 393 +++++++++++++++-- 8 files changed, 952 insertions(+), 313 deletions(-) diff --git a/src/views/archiveManagement/index.vue b/src/views/archiveManagement/index.vue index 81d3a18..8db8de6 100644 --- a/src/views/archiveManagement/index.vue +++ b/src/views/archiveManagement/index.vue @@ -34,13 +34,21 @@ :expand-on-click-node="false" :filter-node-method="filterNode" :props="props" + :lazy="false" + :load="undefined" + :render-after-expand="true" + :auto-expand-parent="true" + :indent="20" class="custom-tree" node-key="id" @node-click="handleNodeClick" + @node-expand="handleNodeExpand" > <template #default="{ node, data }"> <div class="tree-node-content" + :data-temp-id="data._tempId" + :data-node-id="data.id" @dblclick="headerDbClick(node, data)" > <div class="node-icon"> @@ -61,7 +69,7 @@ }}</span> <el-input v-else - :ref="(el) => setInputRef(el, data)" + :ref="(el) => setInputRef(data.id || data._tempId, el)" v-model="newName" autofocus class="tree-input" @@ -69,6 +77,7 @@ size="small" @blur="(event) => handleInputBlur(event, data, node)" @keyup.enter="(event) => handleInputBlur(event, data, node)" + @keyup.esc="() => cancelEdit(data, node)" /> </div> <div v-show="!data.isEdit" class="node-actions"> @@ -76,7 +85,8 @@ icon="Plus" link size="small" - title="鏂板瀛愯妭鐐�" + :title="getNodeDepth(data) >= 7 ? '宸茶揪鍒版渶澶у祵濂楀眰绾э紙7灞傦級' : '鏂板瀛愯妭鐐�'" + :disabled="getNodeDepth(data) >= 7" @click.stop="append(data)" ></el-button> <el-button @@ -165,7 +175,7 @@ </el-card> </template> <script setup> -import { nextTick, onMounted, reactive, ref } from "vue"; +import { computed, nextTick, onMounted, reactive, ref } from "vue"; import ETable from "@/components/Table/ETable.vue"; import { ElButton, @@ -226,6 +236,41 @@ label: "name", children: "children", isLeaf: "leaf", +}; + +// ===== 璁$畻灞炴�� ===== +// 璁$畻鎬昏妭鐐规暟 +const totalNodeCount = computed(() => { + const countNodes = (nodes) => { + let count = 0; + for (const node of nodes || []) { + count += 1; + if (node.children) { + count += countNodes(node.children); + } + } + return count; + }; + return countNodes(treeData.value); +}); + +// 妫�鏌ユ槸鍚︿负澶ч噺鑺傜偣锛堣秴杩�1000涓妭鐐规椂鎻愮ず鎬ц兘浼樺寲锛� +const isLargeTree = computed(() => totalNodeCount.value > 1000); + +// 鑾峰彇鑺傜偣娣卞害鐨勫嚱鏁� +const getNodeDepth = (nodeData) => { + if (!nodeData || !nodeData.id) return 0; + + let depth = 1; + const node = treeRef.value?.getNode(nodeData.id); + let parentNode = node?.parent; + + while (parentNode && parentNode.data && parentNode.data.id) { + depth++; + parentNode = parentNode.parent; + } + + return depth; }; // ===== 宸ュ叿鍑芥暟 ===== @@ -337,6 +382,20 @@ getArchiveListData(); }; +// 鑺傜偣灞曞紑浜嬩欢澶勭悊 +const handleNodeExpand = (data, node, instance) => { + // 灞曞紑鍚庣◢寰欢杩燂紝纭繚瀛愯妭鐐规覆鏌撳畬鎴� + setTimeout(() => { + // 濡傛灉鏈夋柊娣诲姞鐨勭紪杈戠姸鎬佽妭鐐癸紝鑱氱劍鍒板畠 + if (data.children && data.children.length > 0) { + const editingChild = data.children.find(child => child.isEdit && child._tempId); + if (editingChild) { + focusInput(editingChild._tempId, 200); + } + } + }, 100); +}; + const handlePageChange = (pagination) => { try { const { page, limit } = pagination; @@ -427,22 +486,62 @@ } }; // ===== 鏍戣妭鐐圭紪杈戝嚱鏁� ===== -const setInputRef = (el, data) => { - if (el) { - inputRefs.value.set(data.id || data, el); +const setInputRef = (key, el) => { + if (el && key) { + inputRefs.value.set(key, el); } }; const headerDbClick = (node, data) => { - data.isEdit = true; - newName.value = data.name; - nextTick(() => { - const inputEl = inputRefs.value.get(data.id || data); - if (inputEl) { - inputEl.focus(); - inputEl.select(); + try { + data.isEdit = true; + newName.value = data.name; + + nextTick(() => { + const key = data._tempId || data.id; + if (key) { + focusInput(key, 50); + } + }); + } catch (error) { + console.error('杩涘叆缂栬緫妯″紡澶辫触:', error); + ElMessage.error('杩涘叆缂栬緫妯″紡澶辫触'); + } +}; + +// 鍙栨秷缂栬緫鍔熻兘 +const cancelEdit = (data, node) => { + try { + data.isEdit = false; + + // 濡傛灉鏄柊鍒涘缓鐨勪复鏃惰妭鐐癸紝鍒犻櫎瀹� + if (data._tempId && !data.id) { + if (node.parent) { + const parent = node.parent.data; + const index = parent.children?.indexOf(data); + if (index > -1) { + parent.children.splice(index, 1); + } + } else { + // 鏍硅妭鐐� + const index = treeData.value.indexOf(data); + if (index > -1) { + treeData.value.splice(index, 1); + } + } + + // 娓呯悊杈撳叆妗嗗紩鐢� + const key = data._tempId; + if (inputRefs.value.has(key)) { + inputRefs.value.delete(key); + } } - }); + + // 閲嶇疆鍚嶇О + newName.value = ""; + } catch (error) { + console.error('鍙栨秷缂栬緫澶辫触:', error); + } }; const expandParentNodes = (node) => { @@ -460,11 +559,21 @@ comeTreeData.isEdit = false; const newValue = newName.value.trim(); - if (comeTreeData.name === newValue) return; - + // 濡傛灉鍚嶇О涓虹┖锛屽鐞嗙┖鍚嶇О鎯呭喌 if (!newValue) { - newName.value = comeTreeData.name || "鏂拌妭鐐�"; + // 濡傛灉鏄柊鍒涘缓鐨勪复鏃惰妭鐐癸紝鍒犻櫎瀹� + if (comeTreeData._tempId && !comeTreeData.id) { + cancelEdit(comeTreeData, node); + } else { + // 宸插瓨鍦ㄧ殑鑺傜偣锛屾仮澶嶅師鍚嶇О + newName.value = comeTreeData.name || "鏂拌妭鐐�"; + } ElMessage.warning("鑺傜偣鍚嶇О涓嶈兘涓虹┖"); + return; + } + + // 濡傛灉鍚嶇О娌℃湁鏀瑰彉锛岀洿鎺ヨ繑鍥� + if (comeTreeData.name === newValue) { return; } @@ -480,6 +589,20 @@ comeTreeData.name = newValue; if (!comeTreeData.id && result.data) { comeTreeData.id = result.data.id || result.data; + // 娓呯悊涓存椂ID + if (comeTreeData._tempId) { + const tempKey = comeTreeData._tempId; + delete comeTreeData._tempId; + + // 鏇存柊寮曠敤鏄犲皠 + if (inputRefs.value.has(tempKey)) { + const inputEl = inputRefs.value.get(tempKey); + inputRefs.value.delete(tempKey); + if (comeTreeData.id && inputEl) { + inputRefs.value.set(comeTreeData.id, inputEl); + } + } + } } showSuccess("淇濆瓨鎴愬姛"); @@ -490,18 +613,42 @@ if (currentNodeId && treeRef.value) { const targetNode = treeRef.value.getNode(currentNodeId); if (targetNode) { + // 灞曞紑褰撳墠鑺傜偣 targetNode.expanded = true; + + // 灞曞紑鎵�鏈夌埗鑺傜偣 expandParentNodes(targetNode); + + // 婊氬姩鍒拌妭鐐逛綅缃� + setTimeout(() => { + const nodeElement = document.querySelector(`[data-node-id="${currentNodeId}"]`); + if (nodeElement) { + nodeElement.scrollIntoView({ + behavior: 'smooth', + block: 'center' + }); + } + }, 300); } } }); } else { - comeTreeData.name = comeTreeData.name || "鏂拌妭鐐�"; + // 淇濆瓨澶辫触锛屾仮澶嶅師鍚嶇О鎴栧垹闄や复鏃惰妭鐐� + if (comeTreeData._tempId && !comeTreeData.id) { + cancelEdit(comeTreeData, node); + } else { + comeTreeData.name = comeTreeData.name || "鏂拌妭鐐�"; + } ElMessage.error("淇濆瓨澶辫触: " + (result.msg || "鏈煡閿欒")); } } catch (error) { handleError(error, "淇濆瓨鑺傜偣澶辫触"); - comeTreeData.name = comeTreeData.name || "鏂拌妭鐐�"; + // 鍑洪敊鏃跺鐞嗕复鏃惰妭鐐� + if (comeTreeData._tempId && !comeTreeData.id) { + cancelEdit(comeTreeData, node); + } else { + comeTreeData.name = comeTreeData.name || "鏂拌妭鐐�"; + } } }; @@ -509,51 +656,167 @@ const createNewNode = (name, isEdit = true) => ({ name, isEdit, + _tempId: Date.now() + Math.random(), // 娣诲姞涓存椂ID }); -const focusInput = (nodeData, delay = 50) => { +const focusInput = (nodeKey, delay = 100) => { setTimeout(() => { - const inputEl = inputRefs.value.get(nodeData.id || nodeData); + const inputEl = inputRefs.value.get(nodeKey); if (inputEl) { - inputEl.focus(); - inputEl.select(); - inputEl.$el?.scrollIntoView?.({ - behavior: "smooth", - block: "nearest", - }); + try { + // 鍏堟粴鍔ㄥ埌鍙鍖哄煙 + inputEl.$el?.scrollIntoView?.({ + behavior: "smooth", + block: "center", + }); + + // 鑱氱劍骞堕�変腑鎵�鏈夋枃鏈紝纭繚鍙互鐩存帴缂栬緫 + setTimeout(() => { + inputEl.focus(); + inputEl.select(); + + // 纭繚鍏夋爣鍦ㄨ緭鍏ユ鏈熬锛堝鏋渟elect澶辫触鐨勮瘽锛� + const inputElement = inputEl.ref || inputEl.input || inputEl.$el?.querySelector('input'); + if (inputElement) { + inputElement.setSelectionRange(0, inputElement.value.length); + + // 纭繚杈撳叆妗嗗湪瑙嗗彛涓ぎ + setTimeout(() => { + inputElement.scrollIntoView({ + behavior: 'smooth', + block: 'center' + }); + }, 100); + } + }, 100); + } catch (error) { + console.warn('鑱氱劍杈撳叆妗嗗け璐�:', error); + // 澶囩敤鏂规锛氱洿鎺ヨ仛鐒� + try { + inputEl.focus(); + // 灏濊瘯閫変腑鏂囨湰 + setTimeout(() => { + const inputElement = inputEl.ref || inputEl.input || inputEl.$el?.querySelector('input'); + if (inputElement) { + inputElement.select(); + } + }, 200); + } catch (e) { + console.warn('澶囩敤鑱氱劍鏂规涔熷け璐�:', e); + } + } + } else { + console.warn('鏈壘鍒拌緭鍏ユ鍏冪礌锛宬ey:', nodeKey); } }, delay); }; const append = async (data) => { - if (data === "") { - // 鏂板鏍硅妭鐐� - const newNode = createNewNode("鏂拌妭鐐�"); - treeData.value.push(newNode); - newName.value = "鏂拌妭鐐�"; + try { + // 妫�鏌ュ祵濂楀眰绾ч檺鍒� + const getNodeDepth = (nodeData, currentDepth = 1) => { + if (!nodeData || data === "") return 0; // 鏍硅妭鐐逛笉绠楀眰绾� + + let depth = currentDepth; + let current = nodeData; + + // 閫氳繃鏍戠粍浠惰幏鍙栫埗鑺傜偣鏉ヨ绠楁繁搴� + if (current.id) { + const node = treeRef.value?.getNode(current.id); + let parentNode = node?.parent; + + while (parentNode && parentNode.data && parentNode.data.id) { + depth++; + parentNode = parentNode.parent; + } + } + + return depth; + }; - nextTick(() => focusInput(newNode)); - } else { - const hasChildren = data.children; - const nodeKey = data.id || data; - const node = treeRef.value?.getNode(nodeKey); - const isExpanded = node?.expanded; - - // 濡傛灉鏈夊瓙绾т笖鏈睍寮�锛屽厛灞曞紑鑺傜偣 - if (hasChildren && !isExpanded && treeRef.value?.store?.nodesMap[nodeKey]) { - treeRef.value.store.nodesMap[nodeKey].expanded = true; + const currentDepth = getNodeDepth(data); + + // 闄愬埗鏈�澶�7灞傚祵濂� + if (currentDepth >= 7) { + ElMessage.warning('鏈�澶氬彧鑳藉祵濂�7灞傝妭鐐癸紝褰撳墠宸茶揪鍒版渶澶у眰绾ч檺鍒�'); + return; } - const newNode = createNewNode("鏂板瓙鑺傜偣"); - - if (!data.children) { - data.children = []; + // 鍦ㄥぇ閲忚妭鐐规椂鎻愮ず鎬ц兘娉ㄦ剰浜嬮」 + if (isLargeTree.value && totalNodeCount.value > 2000) { + const confirmed = await ElMessageBox.confirm( + `褰撳墠鏍戠粨鏋勫寘鍚� ${totalNodeCount.value} 涓妭鐐癸紝鑺傜偣杈冨鍙兘褰卞搷鎬ц兘銆傚缓璁�冭檻鍒嗗眰绠$悊銆傛槸鍚︾户缁坊鍔狅紵`, + '鎬ц兘鎻愮ず', + { + confirmButtonText: '缁х画娣诲姞', + cancelButtonText: '鍙栨秷', + type: 'warning', + } + ).catch(() => false); + + if (!confirmed) return; } - data.children.push(newNode); - newName.value = "鏂板瓙鑺傜偣"; - const delay = hasChildren && !isExpanded ? 200 : 50; - nextTick(() => focusInput(newNode, delay)); + if (data === "") { + // 鏂板鏍硅妭鐐� + const newNode = createNewNode("鏂拌妭鐐�"); + treeData.value.push(newNode); + newName.value = "鏂拌妭鐐�"; + + await nextTick(); + focusInput(newNode._tempId, 200); + } else { + const hasChildren = data.children && data.children.length > 0; + const nodeKey = data.id || data; + const node = treeRef.value?.getNode(nodeKey); + + // 鍒涘缓鏂板瓙鑺傜偣 + const newNode = createNewNode("鏂板瓙鑺傜偣"); + + if (!data.children) { + data.children = []; + } + data.children.push(newNode); + newName.value = "鏂板瓙鑺傜偣"; + + // 寮哄埗鏇存柊鏍戠粨鏋� + await nextTick(); + + // 纭繚鐖惰妭鐐瑰睍寮�浠ユ樉绀烘柊鑺傜偣 + if (node) { + node.expanded = true; + + // 濡傛灉鏄涓�娆℃坊鍔犲瓙鑺傜偣锛岀瓑寰呭睍寮�鍔ㄧ敾骞剁‘淇濆彲瑙� + if (!hasChildren) { + await new Promise(resolve => setTimeout(resolve, 300)); + + // 灞曞紑鍚庢粴鍔ㄥ埌鏂拌妭鐐逛綅缃� + setTimeout(() => { + const newNodeElement = document.querySelector(`[data-temp-id="${newNode._tempId}"]`); + if (newNodeElement) { + newNodeElement.scrollIntoView({ + behavior: 'smooth', + block: 'center' + }); + } + }, 100); + } + + // 灞曞紑鎵�鏈夌埗鑺傜偣纭繚瀹屽叏鍙 + let parentNode = node.parent; + while (parentNode && parentNode.data && parentNode.data.id) { + parentNode.expanded = true; + parentNode = parentNode.parent; + } + } + + // 鑱氱劍鍒版柊鍒涘缓鐨勮緭鍏ユ + const delay = hasChildren ? 150 : 500; // 濡傛灉涔嬪墠娌℃湁瀛愯妭鐐癸紝寤惰繜鏇撮暱鏃堕棿绛夊睍寮� + focusInput(newNode._tempId, delay); + } + } catch (error) { + console.error('鏂板鑺傜偣澶辫触:', error); + ElMessage.error('鏂板鑺傜偣澶辫触锛岃閲嶈瘯'); } }; @@ -618,18 +881,27 @@ border-radius: 8px; background: #fff; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); + max-height: calc(100vh - 240px); // 闄愬埗鏈�澶ч珮搴︼紝鍚敤婊氬姩 .custom-tree { padding: 8px; background: transparent; + // 浣跨敤GPU鍔犻�熸彁鍗囨粴鍔ㄦ�ц兘 + transform: translateZ(0); + will-change: scroll-position; :deep(.el-tree-node) { + // 鍑忓皯涓嶅繀瑕佺殑閲嶇粯 + contain: layout style; + .el-tree-node__content { height: 36px; padding: 0 8px; border-radius: 6px; margin: 2px 0; transition: all 0.2s ease; + // 浼樺寲娓叉煋鎬ц兘 + will-change: background-color; &:hover { background-color: #f0f9ff; @@ -709,13 +981,19 @@ color: #909399; min-height: auto; - &:hover { + &:hover:not(:disabled) { color: #1890ff; background-color: #f0f9ff; } - &.el-button--text:hover { + &.el-button--text:hover:not(:disabled) { background-color: #f0f9ff; + } + + &:disabled { + color: #c0c4cc; + cursor: not-allowed; + background-color: transparent; } } } @@ -731,11 +1009,13 @@ :deep(.el-input__wrapper) { border-radius: 4px; - border: 1px solid #d9d9d9; + border: 1px solid #40a9ff; transition: all 0.2s ease; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.1); &:hover { - border-color: #40a9ff; + border-color: #1890ff; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.15); } &.is-focus { @@ -748,10 +1028,15 @@ padding: 4px 8px; font-size: 14px; color: #303133; + background-color: #fff; &::placeholder { color: #bfbfbf; } + + &:focus { + background-color: #f8fcff; + } } } diff --git a/src/views/calculator/index.vue b/src/views/calculator/index.vue index 814e57f..e09e4c9 100644 --- a/src/views/calculator/index.vue +++ b/src/views/calculator/index.vue @@ -826,12 +826,6 @@ const createCoalExists = coalInfoList.value.some( item => item.key === result.value.optimal.props.coalId ); - - if (!createCoalExists) { - ElMessage.warning("鐢熸垚鐓ょ鏄湭鐭ョ叅绉嶏紝鏃犳硶娣诲姞鑷冲緟鍏ュ簱"); - return; - } - // 鍑嗗鏁版嵁 const optimalData = result.value.optimal; optimalData.props.totalTonnage = formInline.value.totalTonnage; diff --git a/src/views/equipment/management/index.vue b/src/views/equipment/management/index.vue index 97ca889..0654e82 100644 --- a/src/views/equipment/management/index.vue +++ b/src/views/equipment/management/index.vue @@ -184,6 +184,8 @@ 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 }, @@ -206,7 +208,7 @@ prop: "equipmentStatus", label: "浣跨敤鐘舵��", minWidth: 100, - formatter: (row) => (row.equipmentStatus == "0" ? "浣跨敤涓�" : "宸插綊杩�"), + formatter: (row) => (row.equipmentStatus == 1 ? "浣跨敤涓�" : "宸插綊杩�"), }, { prop: "usageStartTime", label: "浣跨敤寮�濮嬫椂闂�", minWidth: 100 }, { prop: "usageEndTime", label: "浣跨敤缁撴潫鏃堕棿", minWidth: 100 }, @@ -267,7 +269,9 @@ }; const resetState = () => { - form.value = {}; + form.value = { + consumables: false, + }; addOrEdit.value = "add"; loading.value = true; tableData.value = []; @@ -290,7 +294,9 @@ const handleAdd = () => { addOrEdit.value = "add"; - form.value = {}; + form.value = { + consumables: false, + }; title.value = `鏂板${currentTabConfig.value.label}`; // 閫氱敤鐨� copyForm.value = {}; @@ -366,7 +372,7 @@ // 璁惧棰嗙敤寮圭獥鎻愪氦澶勭悊 const onEquipmentRequisitionSubmit = (formData) => { console.log("璁惧棰嗙敤鎻愪氦鏁版嵁锛�", formData); - if (formData.equipmentStatus == "1") { + if (formData.equipmentStatus == 1) { ElMessage.success("璁惧褰掕繕鎴愬姛"); } else { ElMessage.success("璁惧棰嗙敤鎴愬姛"); diff --git a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue index 82b6f85..8438624 100644 --- a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue +++ b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue @@ -7,7 +7,12 @@ > <el-form :model="form" :rules="rules" ref="formRef" label-width="150px"> <el-form-item label="棰嗙敤浜�" prop="userId"> - <el-select v-model="form.userId" placeholder="璇烽�夋嫨" :disabled="isViewMode"> + <el-select + v-model="form.userId" + placeholder="璇烽�夋嫨" + :disabled="isViewMode" + @change="getEquipment" + > <el-option v-for="item in userList" :key="item.userId" @@ -17,7 +22,11 @@ </el-select> </el-form-item> <el-form-item label="璁惧鍚嶇О" prop="equipmentId"> - <el-select v-model="form.equipmentId" placeholder="璇烽�夋嫨" :disabled="isViewMode"> + <el-select + v-model="form.equipmentId" + placeholder="璇烽�夋嫨" + :disabled="isViewMode" + > <el-option v-for="item in equipmentList" :key="item.id" @@ -52,9 +61,14 @@ </el-form-item> <el-form-item label="浣跨敤鐘舵��" prop="equipmentStatus"> <!-- 缂栬緫鐨勬椂鍊欒嚜鍔ㄥ尮閰� --> - <el-select v-model="form.equipmentStatus" placeholder="璇烽�夋嫨" :disabled="isViewMode"> - <el-option label="浣跨敤涓�" value="0" /> - <el-option label="宸插綊杩�" value="1" /> + <el-select + v-model="form.equipmentStatus" + placeholder="璇烽�夋嫨" + :disabled="isViewMode" + default-first-option + > + <el-option label="浣跨敤涓�" :value="1" /> + <el-option label="宸插綊杩�" :value="2" :disabled="props.id" /> </el-select> </el-form-item> <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime"> @@ -87,7 +101,9 @@ </el-form> <template #footer> <el-button @click="handleClose">鍙栨秷</el-button> - <el-button type="primary" @click="handleSubmit" v-if="!isViewMode">纭畾</el-button> + <el-button type="primary" @click="handleSubmit" v-if="!isViewMode" + >纭畾</el-button + > </template> </el-dialog> </template> @@ -100,7 +116,6 @@ import useUserStore from "@/store/modules/user"; -onMounted(() => {}); const userStore = useUserStore(); let userList = ref([]); userStore.getUserList().then((res) => { @@ -108,9 +123,17 @@ }); // 鑾峰彇璁惧鍒楄〃 const equipmentList = ref([]); -getEquipmentList().then((res) => { - equipmentList.value = res.data; -}); +// 鑾峰彇鏈�鏂版暟鎹� +const getEquipment = async () => { + try { + await getEquipmentList().then((res) => { + equipmentList.value = res.data; + }); + } catch (error) { + ElMessage.error("鑾峰彇璁惧鍒楄〃澶辫触"); + } +}; + const props = defineProps({ modelValue: Boolean, formData: { @@ -129,10 +152,10 @@ type: String, default: "", }, - equipmentStatus:{ - type: String, - default: "0" - } + equipmentStatus: { + type: [Number, String], // 鍏佽鏁板瓧鎴栧瓧绗︿覆 + default: 1, + }, }); const maxQuantity = computed(() => { if (!form.value.equipmentId) return 0; @@ -148,7 +171,12 @@ get: () => props.modelValue, set: (v) => emit("update:modelValue", v), }); -const isViewMode = computed(() => props.addOrEdit === "view" || props.addOrEdit === "viewRow" || props.equipmentStatus ==="1"); +const isViewMode = computed( + () => + props.addOrEdit === "view" || + props.addOrEdit === "viewRow" || + Number(props.equipmentStatus) === 2 +); const isEdit = computed(() => !!props.formData?.id); const formRef = ref(); @@ -158,19 +186,32 @@ userId: "", equipmentId: "", usageQuantity: 1, - equipmentStatus: 1, + equipmentStatus: 1, // 榛樿浣跨敤涓� usageStartTime: "", - remarks: "" + remarks: "", }; const form = ref({ ...defaultForm }); + +// 纭繚鍒濆鍖栨椂浣跨敤鐘舵�佹湁榛樿鍊� +onMounted(() => { + if ( + form.value.equipmentStatus === undefined || + form.value.equipmentStatus === null + ) { + console.log(form.value.equipmentStatus); + form.value.equipmentStatus = 1; + } + getEquipment(); +}); watch( () => props.formData, (val) => { if (val && Object.keys(val).length > 0) { - form.value = { ...defaultForm, ...val }; + // 缂栬緫妯″紡锛岀洿鎺ヨ祴鍊硷紝涓嶄娇鐢ㄩ粯璁ゅ�煎悎骞� + form.value = { ...val }; } else { - // 鏂板缓鏃堕噸缃负鍒濆鍊硷紝闃叉鑴忔暟鎹� + // 鏂板妯″紡锛屼娇鐢ㄩ粯璁ゅ�� form.value = { ...defaultForm }; } }, diff --git a/src/views/equipment/management/mould/managementDialog.vue b/src/views/equipment/management/mould/managementDialog.vue index 80b22f1..8f72187 100644 --- a/src/views/equipment/management/mould/managementDialog.vue +++ b/src/views/equipment/management/mould/managementDialog.vue @@ -36,6 +36,14 @@ </el-form-item> </el-col> <el-col :span="11"> + <el-form-item label="鏄惁涓鸿�楁潗" prop="consumables"> + <el-select v-model="formData.consumables" placeholder="璇烽�夋嫨鏄惁涓鸿�楁潗绫诲瀷" :disabled="isViewMode"> + <el-option label="鏄�" :value="true" /> + <el-option label="鍚�" :value="false" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="11"> <el-form-item label="鏁伴噺" prop="quantity"> <el-input v-model="formData.quantity" @@ -225,6 +233,9 @@ equipmentName: [ { required: true, message: "璇疯緭鍏ヤ緵璐у晢鍚嶇О", trigger: "blur" }, ], + consumables: [ + { required: true, message: "璇烽�夋嫨鏄惁涓鸿�楁潗", trigger: "change" }, + ], }); </script> <style lang="scss" scoped> diff --git a/src/views/salesOutbound/components/formDia.vue b/src/views/salesOutbound/components/formDia.vue index 9797549..e990bc8 100644 --- a/src/views/salesOutbound/components/formDia.vue +++ b/src/views/salesOutbound/components/formDia.vue @@ -110,6 +110,16 @@ </el-form-item> </el-col> </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="娣诲姞鑷冲緟琛ュ簱" prop="isPendingRestock"> + <el-select v-model="form.isPendingRestock" placeholder=""> + <el-option label="鏄�" :value="true" /> + <el-option label="鍚�" :value="false" /> + </el-select> + </el-form-item> + </el-col> + </el-row> </el-form> <template #footer> <div class="dialog-footer"> @@ -149,6 +159,7 @@ netProfit: '', inventoryQuantity: '', priceIncludingTax: '', + isPendingRestock: false }, rules: { saleDate: [{ required: true, message: "璇烽�夋嫨鏃ユ湡", trigger: "change" },], @@ -165,6 +176,7 @@ netProfit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },], inventoryQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },], priceIncludingTax: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },], + isPendingRestock: [{ required: true, message: "璇烽�夋嫨鏄惁娣诲姞鑷冲緟琛ュ簱", trigger: "change" },], } }) diff --git a/src/views/salesOutbound/index.vue b/src/views/salesOutbound/index.vue index b9d38ce..8704650 100644 --- a/src/views/salesOutbound/index.vue +++ b/src/views/salesOutbound/index.vue @@ -39,7 +39,7 @@ <el-space> <el-button type="primary" :icon="Plus" @click="openDia(undefined, 'add')">鏂板缓</el-button> <el-button type="danger" :icon="Delete" @click="handleDelete">鍒犻櫎</el-button> - <!-- <el-button type="info" plain :icon="Download" @click="handleExport">瀵煎嚭</el-button> --> + <el-button type="info" plain :icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-space> <!-- 琛ㄦ牸缁勪欢 --> <div> @@ -169,7 +169,30 @@ }; // 瀵煎嚭鍑哄簱 const handleExport = () => { - + const config = { api: "/salesRecord/export", name: "閿�鍞嚭搴�" }; + proxy.$modal + .confirm( + "鏄惁瑕佸鍑�" + + (selectedRows.value.length > 0 + ? `閫変腑鐨�${selectedRows.value.length}鏉 + : "鍏ㄩ儴") + + "鏁版嵁锛�" + ) + .then((res) => { + if (res) { + ElMessage.success("姝e湪瀵煎嚭鏁版嵁锛岃绋嶅��..."); + exportData(config.api, config.name); + } + }) + .catch(() => {}); +}; +const exportData = (api, name) => { + proxy.download( + api, + { exportIds: selectedRows.value.map((row) => row.id) }, + `${new Date().getTime()}${name}${new Date().toLocaleDateString("en-CA")}.xlsx` + ); + ElMessage.success("瀵煎嚭鏁版嵁锛�" + name); }; // 閫夋嫨琛� const handleSelectionChange = (selection) => { diff --git a/src/views/warehouseManagement/index.vue b/src/views/warehouseManagement/index.vue index b7bd8a4..02d226f 100644 --- a/src/views/warehouseManagement/index.vue +++ b/src/views/warehouseManagement/index.vue @@ -1,25 +1,25 @@ <template> <div class="app-container"> <el-form :inline="true" :model="queryParams" class="search-form"> - <el-form-item label="鐧昏鏃ユ湡"> - <el-date-picker - v-model="queryParams.registrationDate" - type="date" - value-format="YYYY-MM-DD" - format="YYYY-MM-DD" - clearable - style="width: 100%" - placeholder="璇烽�夋嫨鏃ユ湡" - /> - </el-form-item> - <el-form-item label="鐓ょ"> - <el-input - v-model="queryParams.coal" - placeholder="璇疯緭鍏ョ叅绉�" - clearable - :style="{ width: '100%' }" - /> - </el-form-item> + <el-form-item label="鐧昏鏃ユ湡"> + <el-date-picker + v-model="queryParams.registrationDate" + type="date" + value-format="YYYY-MM-DD" + format="YYYY-MM-DD" + clearable + style="width: 100%" + placeholder="璇烽�夋嫨鏃ユ湡" + /> + </el-form-item> + <el-form-item label="鐓ょ"> + <el-input + v-model="queryParams.coal" + placeholder="璇疯緭鍏ョ叅绉�" + clearable + :style="{ width: '100%' }" + /> + </el-form-item> <el-form-item> <el-button type="primary" @click="handleQuery">鏌ヨ</el-button> <el-button @click="resetQuery">閲嶇疆</el-button> @@ -28,56 +28,158 @@ <el-card> <!-- 鏍囩椤� --> <el-tabs - v-model="activeTab" - class="info-tabs" - @tab-click="handleTabClick" + v-model="activeTab" + class="info-tabs" + @tab-click="handleTabClick" > <el-tab-pane - v-for="tab in tabs" - :key="tab.name" - :label="tab.label" - :name="tab.name" + v-for="tab in tabs" + :key="tab.name" + :label="tab.label" + :name="tab.name" /> </el-tabs> <!-- 鎿嶄綔鎸夐挳鍖� --> <el-space> -<!-- <el-button type="danger" :icon="Delete">鍒犻櫎</el-button>--> + <!-- <el-button type="danger" :icon="Delete">鍒犻櫎</el-button>--> <!-- <el-button type="info" plain :icon="Download">瀵煎嚭</el-button> --> - <el-button type="success" plain :icon="Refresh" v-if="activeTab=== 'officialInventory'" @click="mergeRows('merge')">鍚堝苟</el-button> + <el-button + type="success" + plain + :icon="Refresh" + v-if="activeTab === 'officialInventory'" + @click="mergeRows('merge')" + >鍚堝苟</el-button + > + <el-button + type="info" + plain + :icon="Download" + v-if="activeTab === 'officialInventory'" + @click="handleExport" + >瀵煎嚭</el-button + > </el-space> <div> - <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%;height: calc(100vh - 30em)" show-summary :summary-method="summarizeChildrenTable"> + <el-table + :data="tableData" + border + @selection-change="selectionChange" + style="width: 100%; height: calc(100vh - 30em)" + show-summary + :summary-method="summarizeChildrenTable" + > <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="搴忓彿" type="index" width="60" align="center" /> - <el-table-column prop="supplierName" label="渚涜揣鍟嗗悕绉�" width="180" sortable/> - <el-table-column prop="coal" label="鐓ょ" sortable/> - <el-table-column prop="unit" label="鍗曚綅" width="70"/> - <el-table-column prop="inventoryQuantity" label="搴撳瓨鏁伴噺" sortable min-width="110"/> - <el-table-column prop="priceIncludingTax" label="鍗曚环(鍚◣)" sortable width="130"/> - <el-table-column prop="totalPriceIncludingTax" label="鎬讳环(鍚◣)" width="130" /> - <el-table-column prop="priceExcludingTax" label="鍗曚环(涓嶅惈绋�)" width="130" /> - <el-table-column prop="totalPriceExcludingTax" label="鎬讳环(涓嶅惈绋�)" width="130" /> - <el-table-column prop="pendingReplenishment" label="寰呰ˉ搴�" width="130" v-if="activeTab=== 'officialInventory'"/> - <el-table-column label="鐓よ川" align="center" v-if="activeTab=== 'officialInventory'" width="600"> - <el-table-column v-for="col in columnTitle" :key="col.prop" :prop="col.prop" :label="col.label" align="center" sortable min-width="200"/> + <el-table-column + label="搴忓彿" + type="index" + width="60" + align="center" + /> + <el-table-column + prop="supplierName" + label="渚涜揣鍟嗗悕绉�" + width="180" + sortable + /> + <el-table-column prop="coal" label="鐓ょ" sortable /> + <el-table-column prop="unit" label="鍗曚綅" width="70" /> + <el-table-column + prop="inventoryQuantity" + label="搴撳瓨鏁伴噺" + sortable + min-width="110" + /> + <el-table-column + prop="priceIncludingTax" + label="鍗曚环(鍚◣)" + sortable + width="130" + /> + <el-table-column + prop="totalPriceIncludingTax" + label="鎬讳环(鍚◣)" + width="130" + /> + <el-table-column + prop="priceExcludingTax" + label="鍗曚环(涓嶅惈绋�)" + width="130" + /> + <el-table-column + prop="totalPriceExcludingTax" + label="鎬讳环(涓嶅惈绋�)" + width="130" + /> + <el-table-column + prop="pendingReplenishment" + label="寰呰ˉ搴�" + width="130" + v-if="activeTab === 'officialInventory'" + /> + <el-table-column + label="鐓よ川" + align="center" + v-if="activeTab === 'officialInventory'" + width="600" + > + <el-table-column + v-for="col in columnTitle" + :key="col.prop" + :prop="col.prop" + :label="col.label" + align="center" + sortable + min-width="200" + /> </el-table-column> - <el-table-column prop="registrant" label="鐧昏浜�" width="180"/> - <el-table-column prop="registrationDate" label="鐧昏鏃ユ湡" width="180"/> - <el-table-column fixed="right" label="鎿嶄綔" min-width="100" align="center"> + <el-table-column prop="registrant" label="鐧昏浜�" width="180" /> + <el-table-column + prop="registrationDate" + label="鐧昏鏃ユ湡" + width="180" + /> + <el-table-column + fixed="right" + label="鎿嶄綔" + min-width="100" + align="center" + > <template #default="scope"> - <el-button link type="primary" size="small" @click="reviewDia(scope.row)" v-if="activeTab !== 'officialInventory'">瀹℃牳</el-button> - <el-button link type="primary" size="small" @click="mergeRows('edit', scope.row)" v-if="activeTab === 'officialInventory'">缂栬緫</el-button> - <el-button link type="primary" size="small" @click="mergeRows('view', scope.row)" v-if="activeTab === 'officialInventory'">璇︽儏</el-button> + <el-button + link + type="primary" + size="small" + @click="reviewDia(scope.row)" + v-if="activeTab !== 'officialInventory'" + >瀹℃牳</el-button + > + <el-button + link + type="primary" + size="small" + @click="mergeRows('edit', scope.row)" + v-if="activeTab === 'officialInventory'" + >缂栬緫</el-button + > + <el-button + link + type="primary" + size="small" + @click="mergeRows('view', scope.row)" + v-if="activeTab === 'officialInventory'" + >璇︽儏</el-button + > </template> </el-table-column> </el-table> <pagination - v-if="total>0" - :page="pageNum" - :limit="pageSize" - :total="total" - @pagination="handlePagination" - :layout="'total, prev, pager, next, jumper'" + v-if="total > 0" + :page="pageNum" + :limit="pageSize" + :total="total" + @pagination="handlePagination" + :layout="'total, prev, pager, next, jumper'" /> </div> </el-card> @@ -88,14 +190,24 @@ <el-col :span="12"> <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId"> <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�"> - <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/> + <el-option + :label="item.label" + v-for="item in supplyList" + :key="item.value" + :value="item.value" + /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鐓ょ" prop="coalId"> <el-select v-model="form.coalId" placeholder="璇烽�夋嫨鐓ょ"> - <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/> + <el-option + :label="item.label" + v-for="item in coalList" + :key="item.value" + :value="item.value" + /> </el-select> </el-form-item> </el-col> @@ -103,48 +215,78 @@ <el-row> <el-col :span="12"> <el-form-item label="鍗曚綅" prop="unit"> - <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" maxlength="30" /> + <el-input + v-model="form.unit" + placeholder="璇疯緭鍏ュ崟浣�" + maxlength="30" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="搴撳瓨鏁伴噺" prop="inventoryQuantity"> - <el-input v-model="form.inventoryQuantity" placeholder="璇疯緭鍏ュ簱瀛樻暟閲�" :max="inventoryQuantity" type="number"/> + <el-input + v-model="form.inventoryQuantity" + placeholder="璇疯緭鍏ュ簱瀛樻暟閲�" + :max="inventoryQuantity" + type="number" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax"> - <el-input v-model="form.priceIncludingTax" placeholder="璇疯緭鍏ュ崟浠�(鍚◣)" maxlength="30" /> + <el-input + v-model="form.priceIncludingTax" + placeholder="璇疯緭鍏ュ崟浠�(鍚◣)" + maxlength="30" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax"> - <el-input v-model="form.totalPriceIncludingTax" placeholder="璇疯緭鍏ユ�讳环(鍚◣)" maxlength="30" /> + <el-input + v-model="form.totalPriceIncludingTax" + placeholder="璇疯緭鍏ユ�讳环(鍚◣)" + maxlength="30" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax"> - <el-input v-model="form.priceExcludingTax" placeholder="璇疯緭鍏ユ垚鏈崟浠�" maxlength="30" /> + <el-input + v-model="form.priceExcludingTax" + placeholder="璇疯緭鍏ユ垚鏈崟浠�" + maxlength="30" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax"> - <el-input v-model="form.totalPriceExcludingTax" placeholder="璇疯緭鍏ユ垚鏈崟浠�" maxlength="30" /> + <el-input + v-model="form.totalPriceExcludingTax" + placeholder="璇疯緭鍏ユ垚鏈崟浠�" + maxlength="30" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鐓よ川鏂规" prop="coalPlanId"> - <el-select v-model="form.coalPlanId" placeholder="璇烽�夋嫨" @change="coalPlanByIdList" clearable> + <el-select + v-model="form.coalPlanId" + placeholder="璇烽�夋嫨" + @change="coalPlanByIdList" + clearable + > <el-option - v-for="dict in qualityPlanOption" - :key="dict.id" - :label="dict.plan" - :value="dict.id" + v-for="dict in qualityPlanOption" + :key="dict.id" + :label="dict.plan" + :value="dict.id" ></el-option> </el-select> </el-form-item> @@ -167,20 +309,47 @@ </template> </el-dialog> <!-- 鍚堝苟鏁版嵁寮规 --> - <el-dialog :title="operationType.value === 'edit' ? '缂栬緫搴撳瓨' : '鍚堝苟搴撳瓨'" v-model="mergeVisible" width="800px"> - <el-form :model="mergeForm" :rules="mergeRules" ref="mergeRef" label-width="100px"> + <el-dialog + :title="operationType.value === 'edit' ? '缂栬緫搴撳瓨' : '鍚堝苟搴撳瓨'" + v-model="mergeVisible" + width="800px" + > + <el-form + :model="mergeForm" + :rules="mergeRules" + ref="mergeRef" + label-width="100px" + > <el-row> <el-col :span="12"> <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId"> - <el-select v-model="mergeForm.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" :disabled="operationType === 'view'"> - <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/> + <el-select + v-model="mergeForm.supplierId" + placeholder="璇烽�夋嫨渚涘簲鍟�" + :disabled="operationType === 'view'" + > + <el-option + :label="item.label" + v-for="item in supplyList" + :key="item.value" + :value="item.value" + /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鐓ょ" prop="coalId"> - <el-select v-model="mergeForm.coalId" placeholder="璇烽�夋嫨鐓ょ" :disabled="operationType === 'view'"> - <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/> + <el-select + v-model="mergeForm.coalId" + placeholder="璇烽�夋嫨鐓ょ" + :disabled="operationType === 'view'" + > + <el-option + :label="item.label" + v-for="item in coalList" + :key="item.value" + :value="item.value" + /> </el-select> </el-form-item> </el-col> @@ -188,48 +357,85 @@ <el-row> <el-col :span="12"> <el-form-item label="鍗曚綅" prop="unit"> - <el-input v-model="mergeForm.unit" placeholder="璇疯緭鍏ュ崟浣�" maxlength="30" :disabled="operationType === 'view'"/> + <el-input + v-model="mergeForm.unit" + placeholder="璇疯緭鍏ュ崟浣�" + maxlength="30" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="搴撳瓨鏁伴噺" prop="inventoryQuantity"> - <el-input v-model="mergeForm.inventoryQuantity" placeholder="璇疯緭鍏ュ簱瀛樻暟閲�" :max="inventoryQuantity" type="number" :disabled="operationType === 'view'"/> + <el-input + v-model="mergeForm.inventoryQuantity" + placeholder="璇疯緭鍏ュ簱瀛樻暟閲�" + :max="inventoryQuantity" + type="number" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax"> - <el-input v-model="mergeForm.priceIncludingTax" placeholder="璇疯緭鍏ュ崟浠�(鍚◣)" maxlength="30" :disabled="operationType === 'view'" /> + <el-input + v-model="mergeForm.priceIncludingTax" + placeholder="璇疯緭鍏ュ崟浠�(鍚◣)" + maxlength="30" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax"> - <el-input v-model="mergeForm.totalPriceIncludingTax" placeholder="璇疯緭鍏ユ�讳环(鍚◣)" maxlength="30" :disabled="operationType === 'view'" /> + <el-input + v-model="mergeForm.totalPriceIncludingTax" + placeholder="璇疯緭鍏ユ�讳环(鍚◣)" + maxlength="30" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax"> - <el-input v-model="mergeForm.priceExcludingTax" placeholder="璇疯緭鍏ュ崟浠�(涓嶅惈绋�)" maxlength="30" :disabled="operationType === 'view'" /> + <el-input + v-model="mergeForm.priceExcludingTax" + placeholder="璇疯緭鍏ュ崟浠�(涓嶅惈绋�)" + maxlength="30" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax"> - <el-input v-model="mergeForm.totalPriceExcludingTax" placeholder="璇疯緭鍏ユ�讳环(涓嶅惈绋�)" maxlength="30" :disabled="operationType === 'view'" /> + <el-input + v-model="mergeForm.totalPriceExcludingTax" + placeholder="璇疯緭鍏ユ�讳环(涓嶅惈绋�)" + maxlength="30" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="鐓よ川鏂规" prop="coalPlanId"> - <el-select v-model="mergeForm.coalPlanId" placeholder="璇烽�夋嫨" @change="coalPlanByIdList" clearable :disabled="operationType === 'view'"> + <el-select + v-model="mergeForm.coalPlanId" + placeholder="璇烽�夋嫨" + @change="coalPlanByIdList" + clearable + :disabled="operationType === 'view'" + > <el-option - v-for="dict in qualityPlanOption" - :key="dict.id" - :label="dict.plan" - :value="dict.id" + v-for="dict in qualityPlanOption" + :key="dict.id" + :label="dict.plan" + :value="dict.id" ></el-option> </el-select> </el-form-item> @@ -239,7 +445,10 @@ <el-row> <el-col :span="12" v-for="item in filteredList" :key="item.id"> <el-form-item :label="item.fieldName"> - <el-input v-model="mergeForm[item.fields]" :disabled="operationType === 'view'" /> + <el-input + v-model="mergeForm[item.fields]" + :disabled="operationType === 'view'" + /> </el-form-item> </el-col> </el-row> @@ -255,25 +464,28 @@ </template> <script setup> -import {onMounted, ref} from "vue"; -import {Delete, Download, Refresh} from "@element-plus/icons-vue"; +import { onMounted, ref } from "vue"; +import { Delete, Download, Refresh } from "@element-plus/icons-vue"; import Pagination from "@/components/Pagination/index.vue"; import { addOrEditCoalValue, - coalFieldList, coalPlanById, - coalPlanList, officialInventoryList, - pendingInventoryList + coalFieldList, + coalPlanById, + coalPlanList, + officialInventoryList, + pendingInventoryList, } from "@/api/warehouseManagement/index.js"; -import {editOfficial, merge} from "../../api/warehouseManagement/index.js"; -import {getSupplyList} from "@/api/procureMent/index.js"; -import {getCoalInfoList} from "@/api/production/index.js"; +import { editOfficial, merge } from "../../api/warehouseManagement/index.js"; +import { getSupplyList } from "@/api/procureMent/index.js"; +import { getCoalInfoList } from "@/api/production/index.js"; +import { ElMessage } from "element-plus"; -const { proxy } = getCurrentInstance() +const { proxy } = getCurrentInstance(); -const tableData = ref([]) -const selectedRows = ref([]) -const qualityPlanOption = ref([]) -const filteredList = ref([]) +const tableData = ref([]); +const selectedRows = ref([]); +const qualityPlanOption = ref([]); +const filteredList = ref([]); const tableLoading = ref(false); const total = ref(0); const pageNum = ref(1); @@ -285,50 +497,58 @@ // 瀹℃牳寮规 const reviewVisible = ref(false); // 鍚堝苟寮规 -const mergeVisible = ref(false) -const operationType = ref('') +const mergeVisible = ref(false); +const operationType = ref(""); const data = reactive({ form: { - supplierName: '', - coal: '', - unit: '', - inventoryQuantity: '', - priceIncludingTax: '', - totalPriceIncludingTax: '', - priceExcludingTax: '', - totalPriceExcludingTax: '', - coalPlanId: '', - pId: '', + supplierName: "", + coal: "", + unit: "", + inventoryQuantity: "", + priceIncludingTax: "", + totalPriceIncludingTax: "", + priceExcludingTax: "", + totalPriceExcludingTax: "", + coalPlanId: "", + pId: "", }, mergeForm: { - supplierId: '', - coalId: '', - unit: '', - inventoryQuantity: '', - priceIncludingTax: '', - totalPriceIncludingTax: '', - priceExcludingTax: '', - totalPriceExcludingTax: '', - coalPlanId: '', - pId: '', + supplierId: "", + coalId: "", + unit: "", + inventoryQuantity: "", + priceIncludingTax: "", + totalPriceIncludingTax: "", + priceExcludingTax: "", + totalPriceExcludingTax: "", + coalPlanId: "", + pId: "", }, rules: { - supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }], + supplierName: [ + { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }, + ], coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }], unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }], coalPlanId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], - supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }], + supplierId: [ + { required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }, + ], }, mergeRules: { - supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }], + supplierName: [ + { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }, + ], coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }], unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }], coalPlanId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }], - supplierId: [{ required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }], - } -}) + supplierId: [ + { required: true, message: "璇烽�夋嫨渚涘簲鍟�", trigger: "change" }, + ], + }, +}); -const { form, rules, mergeForm, mergeRules } = toRefs(data) +const { form, rules, mergeForm, mergeRules } = toRefs(data); // 褰撳墠鏍囩 const activeTab = ref("pendingInbound"); const tabName = ref("pendingInbound"); @@ -339,10 +559,10 @@ ]); // 鏌ヨ鍙傛暟 const queryParams = reactive({ - registrationDate: "", - coal: "", -}) -const columnTitle = ref([]) + registrationDate: "", + coal: "", +}); +const columnTitle = ref([]); const supplyList = ref([]); const coalList = ref([]); @@ -380,52 +600,66 @@ getList(); }; const summarizeChildrenTable = (param) => { - return proxy.summarizeTable(param, ['inventoryQuantity', 'priceIncludingTax', 'totalPriceIncludingTax','priceExcludingTax','totalPriceExcludingTax']); -} + return proxy.summarizeTable(param, [ + "inventoryQuantity", + "priceIncludingTax", + "totalPriceIncludingTax", + "priceExcludingTax", + "totalPriceExcludingTax", + ]); +}; // 鐐瑰嚮鏌ヨ const handleQuery = () => { - pageNum.value = 1 - pageSize.value = 10 - getList() -} + pageNum.value = 1; + pageSize.value = 10; + getList(); +}; // 鍒嗛〉澶勭悊 const handlePagination = (val) => { - pageNum.value = val.page; - pageSize.value = val.limit; - getList(); + pageNum.value = val.page; + pageSize.value = val.limit; + getList(); }; const getList = () => { tableLoading.value = true; // 璧嬪�肩叅璐ㄨ〃澶村睍绀哄瓧娈� if (tabName.value === "pendingInbound") { - pendingInventoryList({ ...queryParams, current: pageNum.value, size: pageSize.value }).then(res => { + pendingInventoryList({ + ...queryParams, + current: pageNum.value, + size: pageSize.value, + }).then((res) => { tableLoading.value = false; tableData.value = res.data.records; total.value = res.data.total; - }) + }); } else { - officialInventoryList({ ...queryParams, current: pageNum.value, size: pageSize.value }).then(res => { + officialInventoryList({ + ...queryParams, + current: pageNum.value, + size: pageSize.value, + }).then((res) => { tableLoading.value = false; const result = flattenFields(res.data.records); tableData.value = result; total.value = res.data.total; - coalFieldListOption() - }) + coalFieldListOption(); + }); } }; // 鎵佸钩鍖栧鐞嗗嚱鏁� const flattenFields = (data) => { - return data.map(item => { + return data.map((item) => { const mergedFields = item.fields.reduce((acc, obj) => { const key = Object.keys(obj)[0]; acc[key] = obj[key]; return acc; }, {}); - + // 鍚堝苟涓诲璞′笌鎻愬彇鍑虹殑 fields 瀛楁 return { ...item, - ...mergedFields + ...mergedFields, }; }); }; @@ -440,66 +674,91 @@ }; // 琛ㄦ牸閫夋嫨鏁版嵁 const selectionChange = (rows) => { - selectedRows.value = rows -} + selectedRows.value = rows; +}; // 鎵撳紑瀹℃牳寮规 const reviewDia = (row) => { - reviewVisible.value = true - filteredList.value = [] - form.value = {...row} - form.value.pId = row.id - inventoryQuantity.value = row.inventoryQuantity - getDropdownData() - coalPlanListOptions() -} + reviewVisible.value = true; + filteredList.value = []; + form.value = { ...row }; + form.value.pId = row.id; + inventoryQuantity.value = row.inventoryQuantity; + getDropdownData(); + coalPlanListOptions(); +}; // 鏌ヨ鐓よ川鏂规涓嬫媺妗� const coalPlanListOptions = () => { - coalPlanList().then(res => { - qualityPlanOption.value = res.data - }) -} + coalPlanList().then((res) => { + qualityPlanOption.value = res.data; + }); +}; // 鏌ヨ鐓よ川鏂规瀛楁 const coalPlanByIdList = (id) => { - coalPlanById({id: id}).then(res => { - filteredList.value = res.data - if(!id) { - filteredList.value = [] + coalPlanById({ id: id }).then((res) => { + filteredList.value = res.data; + if (!id) { + filteredList.value = []; } - }) -} + }); +}; // 鏌ヨ鐓よ川瀛楁 const coalFieldListOption = () => { - coalFieldList().then(res => { - filteredList.value = res.data - columnTitle.value = res.data.map(item => { + coalFieldList().then((res) => { + filteredList.value = res.data; + columnTitle.value = res.data.map((item) => { return { prop: item.fields, - label: item.fieldName // 浣跨敤 fieldName 浣滀负 label + label: item.fieldName, // 浣跨敤 fieldName 浣滀负 label }; }); - }) -} + }); +}; +const handleExport = () => { + const config = { api: "/officialInventory/export", name: "姝e紡搴�" }; + proxy.$modal + .confirm( + "鏄惁瑕佸鍑�" + + (selectedRows.value.length > 0 + ? `閫変腑鐨�${selectedRows.value.length}鏉 + : "鍏ㄩ儴") + + "鏁版嵁锛�" + ) + .then((res) => { + if (res) { + ElMessage.success("姝e湪瀵煎嚭鏁版嵁锛岃绋嶅��..."); + exportData(config.api, config.name); + } + }) + .catch(() => {}); +}; +const exportData = (api, name) => { + proxy.download( + api, + { exportIds: selectedRows.value.map((row) => row.id) }, + `${new Date().getTime()}${name}${new Date().toLocaleDateString("en-CA")}.xlsx` + ); +}; // 鍚堝苟搴撳瓨鏁版嵁鏂规硶 -const mergeRows = (type,row) => { - getDropdownData() - coalPlanListOptions() - if (type === 'edit') { +const mergeRows = (type, row) => { + getDropdownData(); + coalPlanListOptions(); + if (type === "edit") { mergeVisible.value = true; } operationType.value = type; - if (type !== 'merge') { - mergeForm.value = {...row} + if (type !== "merge") { + mergeForm.value = { ...row }; } else { if (selectedRows.value.length < 2) { - proxy.$modal.msgWarning('璇疯嚦灏戦�夋嫨涓ゆ潯鏁版嵁') - return + proxy.$modal.msgWarning("璇疯嚦灏戦�夋嫨涓ゆ潯鏁版嵁"); + return; } mergeVisible.value = true; - filteredList.value.forEach(item => { - mergeForm.value[item.fields] = '' - }) - const data = selectedRows.value - const selectedIds = selectedRows.value.map(row => row.id); + filteredList.value.forEach((item) => { + mergeForm.value[item.fields] = ""; + }); + const data = selectedRows.value; + const selectedIds = selectedRows.value.map((row) => row.id); // 鍒濆鍖栧悎璁″拰鍧囧�煎彉閲� let totalInventory = 0; let totalPriceIncludingTax = 0; @@ -507,7 +766,7 @@ let priceIncludingTaxSum = 0; let priceExcludingTaxSum = 0; // 閬嶅巻鎵�鏈夐�変腑鏁版嵁锛岀疮鍔犺绠� - data.forEach(row => { + data.forEach((row) => { totalInventory += parseFloat(row.inventoryQuantity) || 0; priceIncludingTaxSum += parseFloat(row.priceIncludingTax) || 0; totalPriceIncludingTax += parseFloat(row.totalPriceIncludingTax) || 0; @@ -515,10 +774,18 @@ totalPriceExcludingTax += parseFloat(row.totalPriceExcludingTax) || 0; }); // 璁$畻骞冲潎鍊煎苟淇濈暀涓や綅灏忔暟 - const avgPriceIncludingTax = Number((priceIncludingTaxSum / data.length).toFixed(2)); - const avgTotalPriceIncludingTax = Number((totalPriceIncludingTax / data.length).toFixed(2)); - const avgPriceExcludingTax = Number((priceExcludingTaxSum / data.length).toFixed(2)); - const avgTotalPriceExcludingTax = Number((totalPriceExcludingTax / data.length).toFixed(2)); + const avgPriceIncludingTax = Number( + (priceIncludingTaxSum / data.length).toFixed(2) + ); + const avgTotalPriceIncludingTax = Number( + (totalPriceIncludingTax / data.length).toFixed(2) + ); + const avgPriceExcludingTax = Number( + (priceExcludingTaxSum / data.length).toFixed(2) + ); + const avgTotalPriceExcludingTax = Number( + (totalPriceExcludingTax / data.length).toFixed(2) + ); // 璁剧疆琛ㄥ崟鏄剧ず mergeForm.value.inventoryQuantity = totalInventory; mergeForm.value.priceIncludingTax = avgPriceIncludingTax; @@ -527,81 +794,81 @@ mergeForm.value.totalPriceExcludingTax = avgTotalPriceExcludingTax; mergeForm.value.ids = selectedIds; } -} +}; // 鎻愪氦鍚堝苟琛ㄥ崟 const submitForm = () => { - proxy.$refs.mergeRef.validate(valid => { + proxy.$refs.mergeRef.validate((valid) => { if (valid) { - delete mergeForm.value.createTime - delete mergeForm.value.updateTime - if (operationType.value === 'edit') { + delete mergeForm.value.createTime; + delete mergeForm.value.updateTime; + if (operationType.value === "edit") { mergeForm.value.fields = filteredList.value.reduce((acc, item) => { const key = item.fields; const value = mergeForm.value[key]; // 鍒ゆ柇鏄惁鏈夊�硷紙浣犲彲浠ユ牴鎹渶瑕佷慨鏀瑰垽鏂潯浠讹級 - if (value !== null && value !== undefined && value !== '') { + if (value !== null && value !== undefined && value !== "") { acc.push({ [key]: value }); } return acc; }, []); editOfficial(mergeForm.value).then(() => { - cancel() - proxy.$modal.msgSuccess('淇敼鎴愬姛') - handleQuery() - }) + cancel(); + proxy.$modal.msgSuccess("淇敼鎴愬姛"); + handleQuery(); + }); } else { mergeForm.value.fields = filteredList.value.reduce((acc, item) => { const key = item.fields; const value = mergeForm.value[key]; // 鍒ゆ柇鏄惁鏈夊�硷紙浣犲彲浠ユ牴鎹渶瑕佷慨鏀瑰垽鏂潯浠讹級 - if (value !== null && value !== undefined && value !== '') { + if (value !== null && value !== undefined && value !== "") { acc.push({ [key]: value }); } return acc; }, []); - mergeForm.value.type = 2 + mergeForm.value.type = 2; merge(mergeForm.value).then(() => { - cancel() - proxy.$modal.msgSuccess('鍚堝苟鎴愬姛') - handleQuery() - }) + cancel(); + proxy.$modal.msgSuccess("鍚堝苟鎴愬姛"); + handleQuery(); + }); } } - }) -} + }); +}; // 鍏抽棴鍚堝苟琛ㄥ崟 const cancel = () => { proxy.$refs.mergeRef.resetFields(); - mergeVisible.value = false -} + mergeVisible.value = false; +}; // 鎻愪氦瀹℃牳琛ㄥ崟 const submitReviewForm = () => { proxy.$refs.formRef.validate((valid) => { if (valid) { - delete form.value.registrationTime - delete form.value.createTime - delete form.value.updateTime - form.value.type = 1 - form.value.fieldValue = filteredList.value.map(item => ({ - [item.fields]: form.value[item.fields] - })) + delete form.value.registrationTime; + delete form.value.createTime; + delete form.value.updateTime; + form.value.type = 1; + form.value.fieldValue = filteredList.value.map((item) => ({ + [item.fields]: form.value[item.fields], + })); addOrEditCoalValue(form.value).then(() => { - cancelReview() - proxy.$modal.msgSuccess('鎻愪氦鎴愬姛') - handleQuery() - }) + cancelReview(); + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + handleQuery(); + }); } - }) -} + }); +}; // 鍏抽棴瀹℃牳寮规 const cancelReview = () => { - proxy.$refs.formRef.resetFields() - reviewVisible.value = false -} + proxy.$refs.formRef.resetFields(); + reviewVisible.value = false; +}; </script> <style scoped> :deep(.el-table) { margin: 20px 0; } -</style> \ No newline at end of file +</style> -- Gitblit v1.9.3