From ca8dfc8a7dd8ba9b84d9a58c3c2a6d52a0c98a74 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 28 五月 2026 09:48:59 +0800
Subject: [PATCH] 中兴实强new 1.生产订单补料时如果库存不足可以提交采购申请单
---
src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue | 77 +++++++++++++++++++++++++++++++++++++-
src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue | 7 ++-
2 files changed, 79 insertions(+), 5 deletions(-)
diff --git a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
index 4f052ed..31145ac 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
@@ -1,7 +1,7 @@
<template>
<el-dialog v-model="dialogVisible"
title="琛ユ枡"
- width="1200px"
+ width="1400px"
@close="handleClose">
<el-table v-loading="loading"
:data="tableData"
@@ -19,6 +19,14 @@
<el-table-column label="璁¢噺鍗曚綅"
prop="unit"
width="100" />
+ <el-table-column label="搴撳瓨鏁伴噺"
+ min-width="120">
+ <template #default="{ row }">
+ <span :class="{ 'text-danger': isStockInsufficient(row) }">
+ {{ row.stockQuantity ?? '-' }}
+ </span>
+ </template>
+ </el-table-column>
<el-table-column label="闇�姹傛暟閲�"
prop="demandedQuantity"
width="100" />
@@ -37,7 +45,8 @@
:step="1"
controls-position="right"
placeholder="杈撳叆琛ユ枡鏁伴噺"
- style="width: 100%;" />
+ style="width: 100%;"
+ :class="{ 'is-stock-insufficient': isStockInsufficient(row) }" />
</template>
</el-table-column>
<el-table-column label="琛ユ枡鍘熷洜"
@@ -52,6 +61,9 @@
</el-table>
<template #footer>
<span class="dialog-footer">
+ <el-button v-if="hasInsufficientStock"
+ type="warning"
+ @click="openPurchaseRequestDialog">閲囪喘鐢宠</el-button>
<el-button type="primary"
:loading="submitting"
@click="handleSubmit">纭� 瀹�</el-button>
@@ -59,14 +71,20 @@
</span>
</template>
</el-dialog>
+ <PurchaseRequestDialog v-model="purchaseRequestDialogVisible"
+ :insufficient-items="insufficientStockItems"
+ :order-row="props.orderRow"
+ @saved="handlePurchaseRequestSaved" />
</template>
<script setup>
import { computed, ref, watch } from "vue";
import { ElMessage } from "element-plus";
+ import PurchaseRequestDialog from "./PurchaseRequestDialog.vue";
import {
listMaterialPickingDetail,
updateMaterialPickingLedger,
+ listMaterialPickingBom,
} from "@/api/productionManagement/productionOrder.js";
const props = defineProps({
@@ -83,16 +101,50 @@
const loading = ref(false);
const submitting = ref(false);
const tableData = ref([]);
+ const purchaseRequestDialogVisible = ref(false);
+
+ // 鍒ゆ柇搴撳瓨鏄惁涓嶈冻
+ const isStockInsufficient = (row) => {
+ const stockQuantity = Number(row.stockQuantity ?? 0);
+ const supplementQty = Number(row.newSupplementQty ?? 0);
+ return supplementQty > 0 && stockQuantity > 0 && supplementQty > stockQuantity;
+ };
+
+ // 搴撳瓨涓嶈冻鐨勮
+ const insufficientStockItems = computed(() => {
+ return tableData.value.filter(row => isStockInsufficient(row));
+ });
+
+ // 鏄惁鏈夊簱瀛樹笉瓒�
+ const hasInsufficientStock = computed(() => {
+ return insufficientStockItems.value.length > 0;
+ });
const loadData = async () => {
if (!props.orderRow?.id) return;
loading.value = true;
try {
+ // 鑾峰彇鐗╂枡鏄庣粏
const res = await listMaterialPickingDetail(props.orderRow.id);
+ // 鑾峰彇搴撳瓨鏁伴噺
+ const bomRes = await listMaterialPickingBom(props.orderRow.id);
+ const bomList = Array.isArray(bomRes?.data)
+ ? bomRes.data
+ : bomRes?.data?.records || [];
+ // 鍒涘缓搴撳瓨鏁伴噺鏄犲皠
+ const stockMap = new Map();
+ bomList.forEach(item => {
+ const key = item.materialModelId || item.productModelId;
+ if (key) {
+ stockMap.set(key, item.stockQuantity ?? item.stockQty ?? 0);
+ }
+ });
+ // 鍚堝苟搴撳瓨鏁版嵁
tableData.value = (res.data || []).map(item => ({
...item,
newSupplementQty: 0,
newSupplementReason: "",
+ stockQuantity: stockMap.get(item.productModelId) ?? null,
}));
} catch (e) {
console.error("鑾峰彇鐗╂枡鏄庣粏澶辫触锛�", e);
@@ -159,7 +211,28 @@
submitting.value = false;
}
};
+
+ // 鎵撳紑閲囪喘鐢宠瀵硅瘽妗�
+ const openPurchaseRequestDialog = () => {
+ purchaseRequestDialogVisible.value = true;
+ };
+
+ // 閲囪喘鐢宠淇濆瓨鍥炶皟
+ const handlePurchaseRequestSaved = () => {
+ // 閲囪喘鐢宠淇濆瓨鎴愬姛鍚庡埛鏂版暟鎹�
+ loadData();
+ };
</script>
<style scoped lang="scss">
+ .text-danger {
+ color: #f56c6c;
+ font-weight: bold;
+ }
+
+ :deep(.is-stock-insufficient) {
+ .el-input__wrapper {
+ box-shadow: 0 0 0 1px #f56c6c inset;
+ }
+ }
</style>
diff --git a/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue b/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
index 0000c26..88d2a28 100644
--- a/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
@@ -144,11 +144,12 @@
form.value.ccUserName = "";
// 灏嗗簱瀛樹笉瓒崇殑浜у搧濉厖鍒拌〃鏍�
+ // 鍏煎棰嗘枡鍜岃ˉ鏂欑殑鏁版嵁缁撴瀯
tableData.value = props.insufficientItems.map((item) => ({
tempId: generateTempId(),
- productModelId: item.materialModelId,
- productName: item.materialName,
- model: item.materialModel,
+ productModelId: item.materialModelId || item.productModelId,
+ productName: item.materialName || item.productName,
+ model: item.materialModel || item.model,
unit: item.unit,
quantity: Math.max(1, Math.ceil((item.demandedQuantity || 0) - (item.stockQuantity || 0))),
}));
--
Gitblit v1.9.3