From b9c0cee25748ea2d5621a8ca56ceb855a9ce3700 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 17 四月 2026 16:08:01 +0800
Subject: [PATCH] fix: 修改生产模块
---
src/views/productionManagement/workOrderManagement/components/MaterialDialog.vue | 152 ++++++++++++++++++++++----------------------------
1 files changed, 67 insertions(+), 85 deletions(-)
diff --git a/src/views/productionManagement/workOrderManagement/components/MaterialDialog.vue b/src/views/productionManagement/workOrderManagement/components/MaterialDialog.vue
index e5eee56..575d888 100644
--- a/src/views/productionManagement/workOrderManagement/components/MaterialDialog.vue
+++ b/src/views/productionManagement/workOrderManagement/components/MaterialDialog.vue
@@ -11,18 +11,33 @@
<el-table-column label="鍘熸枡鍚嶇О" prop="materialName" min-width="140" />
<el-table-column label="鍘熸枡鍨嬪彿" prop="materialModel" min-width="140" />
<el-table-column label="璁¢噺鍗曚綅" prop="unit" min-width="100" />
- <el-table-column label="棰嗙敤鏁伴噺" prop="pickQty" min-width="100" />
+ <el-table-column label="绾胯竟浠撴暟閲�" prop="pickQty" min-width="100" />
<el-table-column label="琛ユ枡鏁伴噺" prop="supplementQty" min-width="100" />
- <el-table-column label="閫�鏂欐暟閲�" prop="returnQty" min-width="100" />
- <el-table-column label="瀹為檯鏁伴噺" prop="actualQty" min-width="100" />
- <el-table-column label="鎿嶄綔" align="center" fixed="right" width="220">
+ <el-table-column label="瀹為檯鏁伴噺" min-width="140">
+ <template #default="{ row }">
+ <el-input-number
+ v-model="row.actualQty"
+ :min="0"
+ :precision="3"
+ :step="1"
+ controls-position="right"
+ style="width: 100%;"
+ />
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" align="center" fixed="right" width="180">
<template #default="{ row }">
<el-button type="primary" link @click="openSupplementDialog(row)">琛ユ枡</el-button>
- <el-button type="warning" link @click="openReturnDialog(row)">閫�鏂�</el-button>
<el-button type="info" link @click="openSupplementRecordDialog(row)">琛ユ枡璁板綍</el-button>
</template>
</el-table-column>
</el-table>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button type="primary" :loading="pickSubmitting" @click="handleSubmitPick">棰嗙敤</el-button>
+ <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+ </span>
+ </template>
</el-dialog>
<FormDialog
@@ -60,31 +75,6 @@
</template>
</FormDialog>
- <FormDialog
- v-model="returnDialogVisible"
- title="閫�鏂�"
- width="500px"
- @confirm="handleSubmitReturn"
- >
- <el-form ref="returnFormRef" :model="returnForm" :rules="returnRules" label-width="120px">
- <el-form-item label="閫�鏂欐暟閲�" prop="returnQty">
- <el-input-number
- v-model="returnForm.returnQty"
- :min="0.001"
- :precision="3"
- :step="1"
- style="width: 100%;"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button type="primary" :loading="returnSubmitting" @click="handleSubmitReturn">纭畾</el-button>
- <el-button @click="returnDialogVisible = false">鍙栨秷</el-button>
- </span>
- </template>
- </FormDialog>
-
<el-dialog v-model="supplementRecordDialogVisible" title="琛ユ枡璁板綍" width="900px">
<el-table v-loading="supplementRecordLoading" :data="supplementRecordTableData" border row-key="id">
<el-table-column label="琛ユ枡鏁伴噺" prop="supplementQty" min-width="100" />
@@ -108,8 +98,8 @@
import {
listWorkOrderMaterialLedger,
addWorkOrderMaterialSupplement,
- addWorkOrderMaterialReturn,
listWorkOrderMaterialSupplementRecord,
+ pickWorkOrderMaterial,
} from "@/api/productionManagement/workOrder.js";
const props = defineProps({
@@ -134,6 +124,7 @@
const materialTableData = ref([]);
const currentMaterialRow = ref(null);
const currentMaterialOrderRow = ref(null);
+const pickSubmitting = ref(false);
const supplementDialogVisible = ref(false);
const supplementSubmitting = ref(false);
@@ -141,13 +132,6 @@
const supplementForm = reactive({
supplementQty: null,
supplementReason: "",
-});
-
-const returnDialogVisible = ref(false);
-const returnSubmitting = ref(false);
-const returnFormRef = ref(null);
-const returnForm = reactive({
- returnQty: null,
});
const supplementRecordDialogVisible = ref(false);
@@ -158,10 +142,6 @@
supplementQty: [{ required: true, message: "璇疯緭鍏ヨˉ鏂欐暟閲�", trigger: "blur" }],
supplementReason: [{ required: true, message: "璇疯緭鍏ヨˉ鏂欏師鍥�", trigger: "blur" }],
};
-const returnRules = {
- returnQty: [{ required: true, message: "璇疯緭鍏ラ��鏂欐暟閲�", trigger: "blur" }],
-};
-
const loadMaterialTable = async row => {
if (!row?.id) return;
currentMaterialOrderRow.value = row;
@@ -234,49 +214,6 @@
});
};
-const openReturnDialog = row => {
- currentMaterialRow.value = row;
- returnForm.returnQty = null;
- returnDialogVisible.value = true;
- nextTick(() => {
- returnFormRef.value?.clearValidate();
- });
-};
-
-const handleSubmitReturn = () => {
- returnFormRef.value?.validate(async valid => {
- if (!valid || !currentMaterialRow.value?.id) {
- ElMessage.warning("缂哄皯鐗╂枡鏄庣粏ID");
- return;
- }
- const returnQty = Number(returnForm.returnQty);
- const minQty =
- Number(currentMaterialRow.value.pickQty || 0) +
- Number(currentMaterialRow.value.supplementQty || 0);
- if (returnQty < minQty) {
- ElMessage.warning(`閫�鏂欐暟閲忎笉鑳戒綆浜庨鐢ㄦ暟閲�+琛ユ枡鏁伴噺锛�${minQty}锛塦);
- return;
- }
- returnSubmitting.value = true;
- try {
- await addWorkOrderMaterialReturn({
- materialLedgerId: currentMaterialRow.value.id,
- returnQty,
- workOrderId: currentMaterialOrderRow.value?.id,
- });
- returnDialogVisible.value = false;
- await loadMaterialTable(currentMaterialOrderRow.value);
- ElMessage.success("閫�鏂欐垚鍔�");
- emit("refresh");
- } catch (e) {
- console.error("閫�鏂欏け璐�", e);
- ElMessage.error("閫�鏂欏け璐�");
- } finally {
- returnSubmitting.value = false;
- }
- });
-};
-
const openSupplementRecordDialog = async row => {
supplementRecordDialogVisible.value = true;
supplementRecordLoading.value = true;
@@ -293,4 +230,49 @@
supplementRecordLoading.value = false;
}
};
+
+const validatePickRows = () => {
+ if (materialTableData.value.length === 0) {
+ return { valid: false, message: "鏆傛棤鍙鐢ㄧ墿鏂�" };
+ }
+ const invalidRow = materialTableData.value.find(item => item.actualQty === null || item.actualQty === undefined || item.actualQty === "");
+ if (invalidRow) {
+ return { valid: false, message: "璇峰~鍐欏疄闄呮暟閲忓悗鍐嶉鐢�" };
+ }
+ const exceedRow = materialTableData.value.find(item => {
+ const maxQty = Number(item.pickQty || 0) + Number(item.supplementQty || 0);
+ return Number(item.actualQty || 0) > maxQty;
+ });
+ if (exceedRow) {
+ return { valid: false, message: "瀹為檯鏁伴噺涓嶈兘澶т簬棰嗙敤鏁伴噺+琛ユ枡鏁伴噺" };
+ }
+ return { valid: true, message: "" };
+};
+
+const handleSubmitPick = async () => {
+ if (!currentMaterialOrderRow.value?.id) return;
+ const validateResult = validatePickRows();
+ if (!validateResult.valid) {
+ ElMessage.warning(validateResult.message);
+ return;
+ }
+ pickSubmitting.value = true;
+ try {
+ await pickWorkOrderMaterial({
+ workOrderId: currentMaterialOrderRow.value.id,
+ items: materialTableData.value.map(item => ({
+ materialLedgerId: item.id,
+ actualQty: Number(item.actualQty || 0),
+ })),
+ });
+ ElMessage.success("棰嗙敤鎴愬姛");
+ await loadMaterialTable(currentMaterialOrderRow.value);
+ emit("refresh");
+ } catch (e) {
+ console.error("棰嗙敤澶辫触", e);
+ ElMessage.error("棰嗙敤澶辫触");
+ } finally {
+ pickSubmitting.value = false;
+ }
+};
</script>
--
Gitblit v1.9.3