From a14c5ce07d20e9f28058f6942dbc00197fac47f1 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期四, 13 八月 2026 10:19:19 +0800
Subject: [PATCH] fix: 领料功能修改,移除订单领料,添加工序领料功能,支持按工序查询物料与已领料记录
---
src/views/productionManagement/processRoute/processRouteItem/index.vue | 405 ++++++---------------------------------------------------
1 files changed, 46 insertions(+), 359 deletions(-)
diff --git a/src/views/productionManagement/processRoute/processRouteItem/index.vue b/src/views/productionManagement/processRoute/processRouteItem/index.vue
index 41e2109..24b9899 100644
--- a/src/views/productionManagement/processRoute/processRouteItem/index.vue
+++ b/src/views/productionManagement/processRoute/processRouteItem/index.vue
@@ -265,6 +265,12 @@
缂栬緫
</el-button>
<el-button v-if="bomDataValue.isEdit"
+ type="primary"
+ plain
+ @click="addBomItem()">
+ 娣诲姞鐗╂枡
+ </el-button>
+ <el-button v-if="bomDataValue.isEdit"
@click="cancelEditBom">
鍙栨秷
</el-button>
@@ -287,8 +293,6 @@
:model="bomDataValue">
<el-table :data="bomDataValue.dataList"
row-key="tempId"
- default-expand-all
- :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
style="width: 100%">
<el-table-column prop="productName"
label="浜у搧" />
@@ -301,7 +305,7 @@
<el-select v-model="row.model"
placeholder="璇烽�夋嫨瑙勬牸"
clearable
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
+ :disabled="!bomDataValue.isEdit"
style="width: 100%"
@visible-change="(v) => { if (v) openBomDialog(row.tempId) }">
<el-option v-if="row.model"
@@ -315,7 +319,7 @@
label="娑堣�楀伐搴�">
<template #default="{ row }">
<el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="bomDataValue.dataList.some(item => (item).tempId === row.tempId) ? [] : [{ required: true, message: '璇烽�夋嫨娑堣�楀伐搴�', trigger: 'change' }]"
+ :rules="[{ required: true, message: '璇烽�夋嫨娑堣�楀伐搴�', trigger: 'change' }]"
style="margin: 0">
<el-select v-model="row.processId"
placeholder="璇烽�夋嫨"
@@ -323,7 +327,7 @@
clearable
style="width: 100%"
@change="value => handleBomProcessChange(row, value)"
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)">
+ :disabled="!bomDataValue.isEdit">
<el-option v-for="item in bomDataValue.processOptions"
:key="item.id"
:label="item.name"
@@ -332,65 +336,14 @@
</el-form-item>
</template>
</el-table-column>
- <el-table-column prop="unitQuantity"
- label="鍗曚綅浜у嚭鎵�闇�鏁伴噺">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input-number v-model="row.unitQuantity"
- :min="0"
- :step="1"
- controls-position="right"
- style="width: 100%"
- @change="handleUnitQuantityChange"
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column v-if="pageType === 'order'"
- prop="demandedQuantity"
- label="闇�姹傛�婚噺">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ラ渶姹傛�婚噺', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input-number v-model="row.demandedQuantity"
- :min="0"
- :step="1"
- controls-position="right"
- style="width: 100%"
- :disabled="true" />
- </el-form-item>
- </template>
- </el-table-column>
- <el-table-column prop="unit"
- label="鍗曚綅">
- <template #default="{ row }">
- <el-form-item v-if="pageType === 'order' && bomDataValue.isEdit"
- :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣�', trigger: ['blur','change'] }]"
- style="margin: 0">
- <el-input v-model="row.unit"
- placeholder="璇疯緭鍏ュ崟浣�"
- clearable
- :disabled="!bomDataValue.isEdit || bomDataValue.dataList.some(item => (item).tempId === row.tempId)" />
- </el-form-item>
- </template>
- </el-table-column>
<el-table-column label="鎿嶄綔"
fixed="right"
- width="200"
+ width="100"
v-if="pageType === 'order' && bomDataValue.isEdit">
<template #default="{ row }">
- <el-button v-if="bomDataValue.isEdit && !bomDataValue.dataList.some(item => (item).tempId === row.tempId)"
- type="danger"
+ <el-button type="danger"
text
@click="removeBomItem(row.tempId)">鍒犻櫎
- </el-button>
- <el-button v-if="bomDataValue.isEdit"
- type="primary"
- text
- @click="addBomItem(row.tempId)">娣诲姞
</el-button>
</template>
</el-table-column>
@@ -1186,60 +1139,11 @@
item.operationName = processName;
};
- const normalizeTreeData = items => {
+ const normalizeBomData = items => {
items.forEach(item => {
item.tempId = item.tempId || item.id || `${Date.now()}_${Math.random()}`;
syncProcessOperationFields(item);
- if (Array.isArray(item.children) && item.children.length > 0) {
- normalizeTreeData(item.children);
- }
});
- };
-
- const toQuantityNumber = value => {
- const numberValue = Number(value);
- if (!Number.isFinite(numberValue)) {
- return 0;
- }
- return Number(numberValue.toFixed(4));
- };
-
- const syncDemandedQuantityTree = (items, parentDemandedQuantity = null) => {
- items.forEach(item => {
- if (parentDemandedQuantity !== null) {
- item.demandedQuantity = toQuantityNumber(
- parentDemandedQuantity * toQuantityNumber(item.unitQuantity)
- );
- }
-
- if (Array.isArray(item.children) && item.children.length > 0) {
- syncDemandedQuantityTree(
- item.children,
- toQuantityNumber(item.demandedQuantity)
- );
- }
- });
- };
-
- const recalculateDemandedQuantities = () => {
- if (pageType.value !== "order") {
- return;
- }
-
- const rootDemandedQuantity = routeInfo.value.quantity;
- if (
- rootDemandedQuantity === undefined ||
- rootDemandedQuantity === null ||
- rootDemandedQuantity === ""
- ) {
- syncDemandedQuantityTree(bomDataValue.value.dataList);
- return;
- }
-
- syncDemandedQuantityTree(
- bomDataValue.value.dataList,
- toQuantityNumber(rootDemandedQuantity)
- );
};
const processChange = value => {
@@ -1252,40 +1156,9 @@
});
};
- const findSiblings = (items, tempId) => {
- if (!items || items.length === 0) return null;
- // 妫�鏌ュ綋鍓嶅眰绾�
- if (items.some(item => item.tempId === tempId)) {
- return items;
- }
- // 閫掑綊鏌ユ壘瀛愮骇
- for (const item of items) {
- if (item.children && item.children.length > 0) {
- const result = findSiblings(item.children, tempId);
- if (result) return result;
- }
- }
- return null;
- };
-
const handleBomProcessChange = (row, value) => {
row.processId = value || "";
syncProcessOperationFields(row);
-
- // 妫�鏌ュ悓涓�灞傜骇鏄惁宸茬粡鏈夊叾浠栦笉鍚岀殑宸ュ簭琚�変腑
- const siblings = findSiblings(bomDataValue.value.dataList, row.tempId);
- if (siblings && value) {
- const hasDifferentProcess = siblings.some(sibling => {
- return (
- sibling.tempId !== row.tempId &&
- sibling.processId &&
- sibling.processId !== value
- );
- });
- if (hasDifferentProcess) {
- ElMessage.warning("鍚屼竴灞傜骇宸插瓨鍦ㄤ笉鍚岀殑宸ュ簭锛岃鍏堢粺涓�宸ュ簭鍚庡啀杩涜淇敼");
- }
- }
};
const openBomDialog = tempId => {
@@ -1300,29 +1173,10 @@
routeInfo.value.bomId
);
bomDataValue.value.dataList = data || [];
- normalizeTreeData(bomDataValue.value.dataList);
- recalculateDemandedQuantities();
+ normalizeBomData(bomDataValue.value.dataList);
} catch (err) {
console.error("鑾峰彇BOM鏁版嵁澶辫触锛�", err);
}
- };
-
- const childItem = (item, tempId, productData) => {
- if (item.tempId === tempId) {
- item.productName = productData.productName;
- item.model = productData.model;
- item.productModelId = productData.id;
- item.unit = productData.unit || "";
- return true;
- }
- if (item.children && item.children.length > 0) {
- for (let child of item.children) {
- if (childItem(child, tempId, productData)) {
- return true;
- }
- }
- }
- return false;
};
const handleBomProduct = row => {
@@ -1331,219 +1185,51 @@
return;
}
const productData = row[row.length - 1];
-
- const isTopLevel = bomDataValue.value.dataList.some(
+ const currentItem = bomDataValue.value.dataList.find(
item => item.tempId === bomDataValue.value.currentRowName
);
- if (isTopLevel) {
- if (
- productData.productName === bomTableData.value[0].productName &&
- productData.model === bomTableData.value[0].model
- ) {
- const hasOther = bomDataValue.value.dataList.some(
- item =>
- item.tempId !== bomDataValue.value.currentRowName &&
- item.productName === bomTableData.value[0].productName &&
- item.model === bomTableData.value[0].model
- );
- if (hasOther) {
- ElMessage.warning("鏈�澶栧眰鍜屽綋鍓嶄骇鍝佷竴鏍风殑涓�绾у彧鑳芥湁涓�涓�");
- return;
- }
- }
+ if (currentItem) {
+ currentItem.productName = productData.productName;
+ currentItem.model = productData.model;
+ currentItem.productModelId = productData.id;
}
- bomDataValue.value.dataList.forEach(item => {
- if (item.tempId === bomDataValue.value.currentRowName) {
- item.productName = productData.productName;
- item.model = productData.model;
- item.productModelId = productData.id;
- item.unit = productData.unit || "";
- return;
- }
- childItem(item, bomDataValue.value.currentRowName, productData);
- });
bomDataValue.value.showProductDialog = false;
};
const removeBomItem = tempId => {
- const topIndex = bomDataValue.value.dataList.findIndex(
+ const index = bomDataValue.value.dataList.findIndex(
item => item.tempId === tempId
);
- if (topIndex !== -1) {
- bomDataValue.value.dataList.splice(topIndex, 1);
- return;
+ if (index !== -1) {
+ bomDataValue.value.dataList.splice(index, 1);
}
-
- const delchildItem = (items, tempId) => {
- for (let i = 0; i < items.length; i++) {
- const item = items[i];
- if (item.tempId === tempId) {
- items.splice(i, 1);
- return true;
- }
- if (item.children && item.children.length > 0) {
- if (delchildItem(item.children, tempId)) {
- return true;
- }
- }
- }
- return false;
- };
-
- bomDataValue.value.dataList.forEach(item => {
- if (item.children && item.children.length > 0) {
- delchildItem(item.children, tempId);
- }
- });
};
- const handleUnitQuantityChange = () => {
- recalculateDemandedQuantities();
- };
-
- const addchildItem = (item, tempId) => {
- if (item.tempId === tempId) {
- if (!item.children) {
- item.children = [];
- }
- item.children.push({
- parentId: item.id || "",
- parentTempId: item.tempId || "",
- productName: "",
- productId: "",
- model: undefined,
- productModelId: undefined,
- processId: "",
- processName: "",
- [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
- "",
- operationName: "",
- unitQuantity: 1,
- demandedQuantity: 0,
- children: [],
- unit: "",
- tempId: new Date().getTime(),
- });
- recalculateDemandedQuantities();
- return true;
- }
- if (item.children && item.children.length > 0) {
- for (let child of item.children) {
- if (addchildItem(child, tempId)) {
- return true;
- }
- }
- }
- return false;
- };
-
- const addBomItem = tempId => {
- bomDataValue.value.dataList.forEach(item => {
- if (item.tempId === tempId) {
- if (!item.children) {
- item.children = [];
- }
- item.children.push({
- parentId: item.id || "",
- parentTempId: item.tempId || "",
- productName: "",
- productId: "",
- model: undefined,
- productModelId: undefined,
- processId: "",
- processName: "",
- [pageType.value === "order" ? "technologyOperationId" : "operationId"]:
- "",
- operationName: "",
- unitQuantity: 1,
- demandedQuantity: 0,
- unit: "",
- children: [],
- tempId: new Date().getTime(),
- });
- recalculateDemandedQuantities();
- return;
- }
- addchildItem(item, tempId);
+ const addBomItem = () => {
+ bomDataValue.value.dataList.push({
+ productName: "",
+ model: undefined,
+ productModelId: undefined,
+ processId: "",
+ processName: "",
+ technologyOperationId: "",
+ operationName: "",
+ tempId: `${Date.now()}_${Math.random()}`,
});
};
const validateAllBom = () => {
- let isValid = true;
- const isOrderPage = pageType.value === "order";
-
- const validateItem = (item, isTopLevel = false) => {
- if (!item.model) {
- ElMessage.error("璇烽�夋嫨瑙勬牸");
- isValid = false;
- return;
+ for (const item of bomDataValue.value.dataList) {
+ if (!item.productModelId) {
+ ElMessage.error("璇烽�夋嫨鐗╂枡瑙勬牸");
+ return false;
}
- if (!isTopLevel && !item.processId) {
+ if (!item.processId) {
ElMessage.error("璇烽�夋嫨娑堣�楀伐搴�");
- isValid = false;
- return;
+ return false;
}
- if (!item.unitQuantity) {
- ElMessage.error("璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺");
- isValid = false;
- return;
- }
- if (isOrderPage && !item.demandedQuantity) {
- ElMessage.error("璇疯緭鍏ラ渶姹傛�婚噺");
- isValid = false;
- return;
- }
-
- if (item.children && item.children.length > 0) {
- item.children.forEach(child => {
- validateItem(child, false);
- });
- }
- };
-
- // 鏍¢獙鍚屼竴灞傜骇鐨勫伐搴忔槸鍚︿竴鑷�
- const validateProcessConsistency = items => {
- if (!items || items.length === 0) return;
-
- // 妫�鏌ュ綋鍓嶅眰绾�
- const processes = items
- .filter(item => item.processId)
- .map(item => item.processId);
- if (processes.length > 1) {
- const uniqueProcesses = [...new Set(processes)];
- if (uniqueProcesses.length > 1) {
- ElMessage.error("鍚屼竴灞傜骇鐨勫伐搴忓繀椤讳竴鑷�");
- isValid = false;
- return;
- }
- }
-
- // 閫掑綊妫�鏌ュ瓙绾�
- items.forEach(item => {
- if (item.children && item.children.length > 0) {
- validateProcessConsistency(item.children);
- }
- });
- };
-
- bomDataValue.value.dataList.forEach(item => {
- validateItem(item, true);
- });
-
- validateProcessConsistency(bomDataValue.value.dataList);
-
- return isValid;
- };
-
- const buildSubmitTree = items => {
- return items.map(item => {
- const current = { ...item };
- syncProcessOperationFields(current);
- current.children = Array.isArray(current.children)
- ? buildSubmitTree(current.children)
- : [];
- return current;
- });
+ }
+ return true;
};
const cancelEditBom = () => {
@@ -1553,17 +1239,18 @@
const handleSaveBom = () => {
bomDataValue.value.loading = true;
- console.log(bomDataValue.value.dataList, "bomDataValue.value.dataList");
-
- normalizeTreeData(bomDataValue.value.dataList);
- recalculateDemandedQuantities();
+ normalizeBomData(bomDataValue.value.dataList);
const valid = validateAllBom();
if (valid) {
add2({
- // bomId: Number(routeInfo.value.bomId),
productionOrderBomId: Number(routeInfo.value.bomId) || null,
- children: buildSubmitTree(bomDataValue.value.dataList || []),
+ productionOrderId: Number(orderId.value) || null,
+ detailList: bomDataValue.value.dataList.map(item => ({
+ id: item.id || undefined,
+ productModelId: item.productModelId,
+ technologyOperationId: item.technologyOperationId || item.processId,
+ })),
})
.then(() => {
ElMessage.success("BOM淇濆瓨鎴愬姛");
--
Gitblit v1.9.3