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