From 388f10aa600b1c2459111aa97cf0947077620a63 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 01 四月 2026 11:24:46 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材
---
src/views/qualityManagement/processInspection/components/formDia.vue | 27 +
src/views/inventoryManagement/stockManagement/New.vue | 64 +++
src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue | 97 +++++
src/views/productionManagement/workOrder/index.vue | 35 +
src/views/qualityManagement/finalInspection/components/formDia.vue | 38 ++
src/views/qualityManagement/rawMaterialInspection/index.vue | 5
src/views/inventoryManagement/stockManagement/Qualified.vue | 52 ++
src/views/salesManagement/salesLedger/index.vue | 331 ++++++++++++++----
src/views/productionManagement/productionReporting/Input.vue | 8
src/views/salesManagement/returnOrder/index.vue | 2
src/api/inventoryManagement/stockInventory.js | 11
src/views/qualityManagement/processInspection/index.vue | 5
src/views/inventoryManagement/dispatchLog/Record.vue | 34 +
src/views/procurementManagement/procurementLedger/index.vue | 54 ++-
src/views/qualityManagement/nonconformingManagement/components/formDia.vue | 31 +
src/views/productionManagement/productionOrder/New.vue | 5
src/views/qualityManagement/rawMaterialInspection/components/formDia.vue | 29 +
src/views/productionManagement/productionOrder/index.vue | 6
src/views/inventoryManagement/stockManagement/Unqualified.vue | 20 +
src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue | 10
src/api/qualityManagement/nonconformingManagement.js | 10
src/views/inventoryManagement/stockReport/index.vue | 28 +
src/views/qualityManagement/nonconformingManagement/index.vue | 44 ++
src/views/inventoryManagement/receiptManagement/Record.vue | 18
24 files changed, 801 insertions(+), 163 deletions(-)
diff --git a/src/api/inventoryManagement/stockInventory.js b/src/api/inventoryManagement/stockInventory.js
index 92b3892c..750f638 100644
--- a/src/api/inventoryManagement/stockInventory.js
+++ b/src/api/inventoryManagement/stockInventory.js
@@ -65,4 +65,13 @@
url: "/stockInventory/getMaterials",
method: "get",
});
-}
\ No newline at end of file
+}
+
+// 鑾峰彇搴撳瓨鏍戯紙浜у搧->瑙勬牸/鍨嬪彿->鎵瑰彿->渚涘簲鍟嗭級
+export const getStockInventoryAll = (params = {}) => {
+ return request({
+ url: "/stockInventory/getStockInventoryAll",
+ method: "get",
+ params,
+ });
+};
\ No newline at end of file
diff --git a/src/api/qualityManagement/nonconformingManagement.js b/src/api/qualityManagement/nonconformingManagement.js
index 50a1b74..bcab3ec 100644
--- a/src/api/qualityManagement/nonconformingManagement.js
+++ b/src/api/qualityManagement/nonconformingManagement.js
@@ -48,3 +48,13 @@
data: query,
});
}
+
+// 涓嬭浇杩斿伐闄勪欢
+export function downloadReturnRecord(id) {
+ return request({
+ url: "/quality/qualityUnqualified/downloadReturnRecord",
+ method: "get",
+ params: { id },
+ responseType: "blob",
+ });
+}
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 57f1d04..3860bb2 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -29,7 +29,7 @@
<div>
<el-button @click="handleOut">瀵煎嚭</el-button>
<el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
+ <!-- <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button> -->
</div>
</div>
<div class="table_list">
@@ -45,12 +45,30 @@
>
<el-table-column align="center" type="selection" width="55" />
<el-table-column align="center" label="搴忓彿" type="index" width="60" />
- <el-table-column
+ <!-- <el-table-column
label="鍑哄簱鎵规"
prop="outboundBatches"
min-width="100"
show-overflow-tooltip
- />
+ /> -->
+ <el-table-column
+ label="鎵瑰彿"
+ min-width="120"
+ show-overflow-tooltip
+ >
+ <template #default="scope">
+ {{ scope.row.batchNo || "" }}
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="渚涘簲鍟�"
+ min-width="160"
+ show-overflow-tooltip
+ >
+ <template #default="scope">
+ {{ scope.row.supplierName || scope.row.customer || "" }}
+ </template>
+ </el-table-column>
<el-table-column
label="鍑哄簱鏃ユ湡"
prop="createTime"
@@ -424,8 +442,14 @@
</div>
</div>
<div class="info-row">
- <span class="label">鍗曞彿锛�</span>
- <span class="value">${item.code || ''}</span>
+ <div>
+ <span class="label">鎵瑰彿锛�</span>
+ <span class="value">${item.batchNo || item.outboundBatches || ''}</span>
+ </div>
+ <div>
+ <span class="label">鍗曞彿锛�</span>
+ <span class="value">${item.code || ''}</span>
+ </div>
</div>
</div>
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index 6e904ec..3715fb5 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -54,10 +54,24 @@
label="搴忓彿"
type="index"
width="60"/>
- <el-table-column label="鍏ュ簱鎵规"
+ <!-- <el-table-column label="鍏ュ簱鎵规"
prop="inboundBatches"
width="280"
- show-overflow-tooltip/>
+ show-overflow-tooltip/> -->
+ <el-table-column label="鎵瑰彿"
+ min-width="160"
+ show-overflow-tooltip>
+ <template #default="scope">
+ {{ scope.row.batchNo || '' }}
+ </template>
+ </el-table-column>
+ <el-table-column label="渚涘簲鍟�"
+ min-width="200"
+ show-overflow-tooltip>
+ <template #default="scope">
+ {{ scope.row.supplierName || scope.row.customer || '' }}
+ </template>
+ </el-table-column>
<el-table-column label="鍏ュ簱鏃堕棿"
prop="createTime"
show-overflow-tooltip/>
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 1f86fd6..913c3fd 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -37,6 +37,35 @@
<el-input v-model="formState.unit" disabled />
</el-form-item>
+ <el-form-item label="鎵瑰彿" prop="batchNo" :rules="[{ required: true, message: '璇疯緭鍏ユ壒鍙�', trigger: 'blur' }]">
+ <el-input v-model="formState.batchNo" placeholder="璇疯緭鍏ユ壒鍙�" clearable />
+ </el-form-item>
+
+ <el-form-item
+ label="渚涘簲鍟�"
+ prop="customer"
+ :rules="[{ required: true, message: '璇烽�夋嫨渚涘簲鍟�', trigger: 'change' }]"
+ >
+ <el-select
+ v-model="formState.customer"
+ placeholder="璇烽�夋嫨渚涘簲鍟�"
+ filterable
+ clearable
+ allow-create
+ :reserve-keyword="true"
+ :default-first-option="false"
+ >
+ <el-option
+ v-for="item in supplierList"
+ :key="item.id"
+ :label="item.supplierName"
+ :value="item.supplierName"
+ >
+ {{ item.supplierName}}
+ </el-option>
+ </el-select>
+ </el-form-item>
+
<el-form-item
label="搴撳瓨鏁伴噺"
prop="qualitity"
@@ -74,10 +103,11 @@
</template>
<script setup>
-import {ref, computed, getCurrentInstance} from "vue";
+import {ref, computed, getCurrentInstance, watch} from "vue";
import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js";
import {createStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
+import {getOptions as getSupplierOptions} from "@/api/procurementManagement/procurementLedger.js";
const props = defineProps({
visible: {
@@ -101,6 +131,8 @@
productName: "",
productModelName: "",
unit: "",
+ batchNo: "",
+ customer: "",
qualitity: 0,
warnNum: 0,
remark: '',
@@ -126,11 +158,39 @@
productModelId: undefined,
productName: "",
productModelName: "",
- description: '',
+ unit: "",
+ batchNo: "",
+ customer: "",
+ qualitity: 0,
+ warnNum: 0,
+ remark: '',
};
isShow.value = false;
};
+const supplierList = ref([]);
+
+const loadSuppliers = async () => {
+ try {
+ const res = await getSupplierOptions();
+ // 澶嶇敤閲囪喘鍙拌处绛涢�夐�昏緫锛歩sWhite=0 鐨勪緵搴斿晢
+ supplierList.value = (res?.data || []).filter(item => item.isWhite === 0);
+ } catch (e) {
+ console.error("鑾峰彇渚涘簲鍟嗗垪琛ㄥけ璐�:", e);
+ supplierList.value = [];
+ }
+};
+
+watch(
+ () => props.visible,
+ (val) => {
+ if (val) {
+ loadSuppliers();
+ }
+ },
+ { immediate: true }
+);
+
// 浜у搧閫夋嫨澶勭悊
const handleProductSelect = async (products) => {
if (products && products.length > 0) {
diff --git a/src/views/inventoryManagement/stockManagement/Qualified.vue b/src/views/inventoryManagement/stockManagement/Qualified.vue
index e255778..eb91974 100644
--- a/src/views/inventoryManagement/stockManagement/Qualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -2,9 +2,29 @@
<div class="app-container">
<div class="search_form">
<div>
- <span class="search_title ml10">浜у搧澶х被锛�</span>
+ <span class="search_title ml10">浜у搧绫诲瀷锛�</span>
+ <el-radio-group v-model="productScope" class="qualified-product-scope" @change="onProductScopeChange">
+ <el-radio-button label="鎴愬搧">鎴愬搧</el-radio-button>
+ <el-radio-button label="鍏朵粬浜у搧">鍏朵粬浜у搧</el-radio-button>
+ </el-radio-group>
+ <!-- <span class="search_title ml10" style="margin-left: 20px">浜у搧澶х被锛�</span>
<el-input v-model="searchForm.productName"
style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable/> -->
+ <span class="search_title ml10" style="margin-left: 20px">瑙勬牸鍨嬪彿锛�</span>
+ <el-input v-model="searchForm.model"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable/>
+ <span class="search_title ml10" style="margin-left: 20px">UID鐮侊細</span>
+ <el-input v-model="searchForm.uidNo"
+ style="width: 200px"
+ placeholder="璇疯緭鍏�"
+ clearable/>
+ <span class="search_title ml10" style="margin-left: 20px">鎵规鍙凤細</span>
+ <el-input v-model="searchForm.batchNo"
+ style="width: 200px"
placeholder="璇疯緭鍏�"
clearable/>
<el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
@@ -26,6 +46,8 @@
<el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
<el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
<el-table-column label="UID鐮�" prop="uidNo" show-overflow-tooltip />
+ <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+ <el-table-column label="渚涘簲鍟�" prop="customer" show-overflow-tooltip />
<el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
<el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
<el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
@@ -70,7 +92,7 @@
<script setup>
import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
+import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from 'vue'
import {ElMessage, ElMessageBox} from "element-plus";
import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js";
const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue"));
@@ -100,9 +122,27 @@
const data = reactive({
searchForm: {
productName: '',
+ model: '',
+ uidNo: '',
+ batchNo: '',
}
})
const { searchForm } = toRefs(data)
+
+// 鎴愬搧(2) / 鍏朵粬浜у搧(鍘熸潗鏂�1銆佸崐鎴愬搧3)锛屼笌浜у搧绫诲瀷瀛楀吀涓�鑷达紱鍒嗛〉鎺ュ彛闇�鏀寔 productType 鎴� productTypes
+const productScope = ref('鎴愬搧')
+
+const getProductScopeParams = () => {
+ if (productScope.value === '鎴愬搧') {
+ return { productType: 2 }
+ }
+ return { productTypes: '1,3' }
+}
+
+const onProductScopeChange = () => {
+ page.current = 1
+ getList()
+}
// 鏌ヨ鍒楄〃
/** 鎼滅储鎸夐挳鎿嶄綔 */
@@ -117,7 +157,7 @@
}
const getList = () => {
tableLoading.value = true
- getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => {
+ getStockInventoryListPage({ ...searchForm.value, ...page, ...getProductScopeParams() }).then(res => {
tableLoading.value = false
tableData.value = res.data.records
total.value = res.data.total
@@ -187,7 +227,7 @@
type: 'warning',
}
).then(() => {
- proxy.download("/stockInventory/exportStockInventory", {}, '鍚堟牸搴撳瓨淇℃伅.xlsx')
+ proxy.download("/stockInventory/exportStockInventory", { ...searchForm.value, ...getProductScopeParams() }, '鍚堟牸搴撳瓨淇℃伅.xlsx')
}).catch(() => {
proxy.$modal.msg("宸插彇娑�")
})
@@ -199,6 +239,10 @@
</script>
<style scoped lang="scss">
+.qualified-product-scope {
+ vertical-align: middle;
+}
+
:deep(.row-low-stock td) {
background-color: #fde2e2;
color: #c45656;
diff --git a/src/views/inventoryManagement/stockManagement/Unqualified.vue b/src/views/inventoryManagement/stockManagement/Unqualified.vue
index 6214f39..a5c22ba 100644
--- a/src/views/inventoryManagement/stockManagement/Unqualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -7,6 +7,21 @@
style="width: 240px"
placeholder="璇疯緭鍏�"
clearable/>
+ <span class="search_title ml10" style="margin-left: 20px">瑙勬牸鍨嬪彿锛�</span>
+ <el-input v-model="searchForm.model"
+ style="width: 240px"
+ placeholder="璇疯緭鍏�"
+ clearable/>
+ <span class="search_title ml10" style="margin-left: 20px">UID鐮侊細</span>
+ <el-input v-model="searchForm.uidNo"
+ style="width: 200px"
+ placeholder="璇疯緭鍏�"
+ clearable/>
+ <span class="search_title ml10" style="margin-left: 20px">鎵规鍙凤細</span>
+ <el-input v-model="searchForm.batchNo"
+ style="width: 200px"
+ placeholder="璇疯緭鍏�"
+ clearable/>
<el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
</div>
<div>
@@ -23,6 +38,8 @@
<el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
<el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
<el-table-column label="UID鐮�" prop="uidNo" show-overflow-tooltip />
+ <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+ <el-table-column label="渚涘簲鍟�" prop="customer" show-overflow-tooltip />
<el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
<el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
<el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
@@ -89,6 +106,9 @@
const data = reactive({
searchForm: {
productName: '',
+ model: '',
+ uidNo: '',
+ batchNo: '',
}
})
const { searchForm } = toRefs(data)
diff --git a/src/views/inventoryManagement/stockReport/index.vue b/src/views/inventoryManagement/stockReport/index.vue
index 90198ef..86252a6 100644
--- a/src/views/inventoryManagement/stockReport/index.vue
+++ b/src/views/inventoryManagement/stockReport/index.vue
@@ -168,13 +168,27 @@
show-overflow-tooltip
v-if="searchForm.reportType !== 'inout'"
/>
- <el-table-column
- label="鍏ュ簱鎵规"
- prop="inboundBatches"
- width="240"
- show-overflow-tooltip
- v-if="searchForm.reportType !== 'inout'"
- />
+ <el-table-column
+ label="鎵瑰彿"
+ width="240"
+ show-overflow-tooltip
+ v-if="searchForm.reportType !== 'inout'"
+ >
+ <template #default="scope">
+ {{ scope.row.batchNo || scope.row.inboundBatches || "" }}
+ </template>
+ </el-table-column>
+ <el-table-column
+ label="渚涘簲鍟�"
+ prop="supplierName"
+ min-width="200"
+ show-overflow-tooltip
+ v-if="searchForm.reportType !== 'inout'"
+ >
+ <template #default="scope">
+ {{ scope.row.supplierName || scope.row.customer || "" }}
+ </template>
+ </el-table-column>
<el-table-column
label="浜у搧澶х被"
prop="productName"
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index d69c73e..d29677a 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -86,6 +86,7 @@
prop="productCategory" />
<el-table-column label="瑙勬牸鍨嬪彿"
prop="specificationModel" />
+ <el-table-column label="UID鐮�" prop="uidNo" />
<el-table-column label="鍗曚綅"
prop="unit" />
<el-table-column label="鏁伴噺"
@@ -120,10 +121,10 @@
prop="supplierName"
width="160"
show-overflow-tooltip />
- <el-table-column label="椤圭洰鍚嶇О"
+ <!-- <el-table-column label="椤圭洰鍚嶇О"
prop="projectName"
width="320"
- show-overflow-tooltip />
+ show-overflow-tooltip /> -->
<el-table-column label="瀹℃壒鐘舵��"
prop="approvalStatus"
width="100"
@@ -238,23 +239,6 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О"
- prop="projectName">
- <el-input v-model="form.projectName"
- placeholder="璇疯緭鍏�"
- clearable />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod"
- placeholder="璇疯緭鍏�"
- clearable />
- </el-form-item>
- </el-col>
- <el-col :span="12">
<el-form-item label="绛捐鏃ユ湡锛�"
prop="executionDate">
<el-date-picker style="width: 100%"
@@ -266,6 +250,24 @@
clearable />
</el-form-item>
</el-col>
+ <!-- <el-col :span="12">
+ <el-form-item label="椤圭洰鍚嶇О"
+ prop="projectName">
+ <el-input v-model="form.projectName"
+ placeholder="璇疯緭鍏�"
+ clearable />
+ </el-form-item>
+ </el-col> -->
+ </el-row>
+ <el-row :gutter="30">
+ <!-- <el-col :span="12">
+ <el-form-item label="浠樻鏂瑰紡">
+ <el-input v-model="form.paymentMethod"
+ placeholder="璇疯緭鍏�"
+ clearable />
+ </el-form-item>
+ </el-col> -->
+
</el-row>
<el-row :gutter="30">
<el-col :span="12">
@@ -409,6 +411,7 @@
prop="unit"
width="70" />
<el-table-column label="UID鐮�" prop="uidNo" />
+ <el-table-column label="鎵规鍙�" prop="batchNo" />
<el-table-column label="鏁伴噺"
prop="quantity"
width="70" />
@@ -579,6 +582,17 @@
</el-form-item>
</el-col>
</el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="鎵规鍙凤細"
+ prop="batchNo">
+ <el-input v-model="productForm.batchNo"
+ placeholder="璇疯緭鍏�"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="鍗曚綅锛�"
@@ -963,6 +977,7 @@
productCategory: "",
productModelId: "",
uidNo: "",
+ batchNo: "",
specificationModel: "",
unit: "",
quantity: "",
@@ -977,6 +992,7 @@
productRules: {
productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ batchNo: [{ required: true, message: "璇疯緭鍏ユ壒娆″彿", trigger: "blur" }],
unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
taxInclusiveUnitPrice: [
diff --git a/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue b/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
index 4aa002b..497ea82 100644
--- a/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
+++ b/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
@@ -2,7 +2,7 @@
<el-dialog
v-model="visible"
title="棰嗘枡"
- width="1000px"
+ width="1400px"
top="3vh"
:close-on-click-modal="false"
destroy-on-close
@@ -19,11 +19,8 @@
<el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="150" />
<el-table-column prop="model" label="鍨嬪彿" min-width="150" />
<el-table-column prop="unit" label="鍗曚綅" width="80" align="center" />
- <!-- <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="100" align="center">
- <template #default="{ row }">
- {{ row.qualitity || 0 }}
- </template>
- </el-table-column> -->
+ <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
<el-table-column prop="requisitionQty" label="棰嗙敤鏁伴噺" width="120" align="center">
<template #default="{ row }">
<el-input-number
@@ -61,13 +58,43 @@
<el-dialog
v-model="addDialogVisible"
title="閫夋嫨鍘熸潗鏂�"
- width="800px"
+ width="1000px"
top="5vh"
:close-on-click-modal="false"
append-to-body
>
+ <div class="material-filter" style="margin-bottom: 20px;">
+ <el-select
+ v-model="filterSupplier"
+ placeholder="渚涘簲鍟�"
+ clearable
+ filterable
+ style="width: 220px"
+ >
+ <el-option
+ v-for="opt in supplierFilterOptions"
+ :key="opt"
+ :label="opt"
+ :value="opt"
+ />
+ </el-select>
+ <el-select
+ v-model="filterBatchNo"
+ placeholder="鎵瑰彿"
+ clearable
+ filterable
+ style="width: 220px; margin-left: 12px"
+ >
+ <el-option
+ v-for="opt in batchFilterOptions"
+ :key="opt"
+ :label="opt"
+ :value="opt"
+ />
+ </el-select>
+ </div>
<el-table
- :data="availableMaterials"
+ :data="filteredMaterials"
border
style="width: 100%"
height="50vh"
@@ -78,6 +105,8 @@
<el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="150" />
<el-table-column prop="model" label="鍨嬪彿" min-width="150" />
<el-table-column prop="unit" label="鍗曚綅" width="80" align="center" />
+ <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
<!-- <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="100" align="center">
<template #default="{ row }">
{{ row.qualitity || 0 }}
@@ -129,6 +158,45 @@
const availableMaterials = ref([]);
const selectedMaterials = ref([]);
+// 閫夋嫨寮圭獥绛涢�夋潯浠讹紙渚涘簲鍟�/鎵瑰彿锛�
+const filterSupplier = ref('');
+const filterBatchNo = ref('');
+
+// 灏嗗悗绔彲鑳借繑鍥炵殑瀛楁鍋氫竴涓嬪綊涓�鍖栵細渚涘簲鍟�/鎵瑰彿瀛楁鍚嶅彲鑳戒笉涓�鑷�
+const normalizeMaterial = (m) => {
+ return {
+ ...m,
+ customer: m.customer ?? m.supplierName ?? '',
+ batchNo: m.batchNo ?? m.batchNumber ?? m.batch_number ?? m.lotNo ?? '',
+ };
+};
+
+const supplierFilterOptions = computed(() => {
+ return Array.from(new Set(availableMaterials.value.map((m) => m.customer).filter(Boolean)));
+});
+
+const batchFilterOptions = computed(() => {
+ const list = filterSupplier.value
+ ? availableMaterials.value.filter((m) => m.customer === filterSupplier.value)
+ : availableMaterials.value;
+ return Array.from(new Set(list.map((m) => m.batchNo).filter(Boolean)));
+});
+
+const filteredMaterials = computed(() => {
+ return availableMaterials.value.filter((m) => {
+ if (filterSupplier.value && m.customer !== filterSupplier.value) return false;
+ if (filterBatchNo.value && m.batchNo !== filterBatchNo.value) return false;
+ return true;
+ });
+});
+
+watch(filterSupplier, () => {
+ // 濡傛灉褰撳墠鈥滄壒鍙封�濅笉灞炰簬鎵�閫変緵搴斿晢锛屽垯娓呯┖
+ if (filterBatchNo.value && !batchFilterOptions.value.includes(filterBatchNo.value)) {
+ filterBatchNo.value = '';
+ }
+});
+
// 鐩戝惉寮规鎵撳紑锛屽姞杞芥暟鎹�
watch(() => props.modelValue, (val) => {
if (val && props.orderData) {
@@ -146,7 +214,7 @@
if (bomId) {
try {
const res = await getMaterials({ bomId });
- materialsFromApi = res.data || [];
+ materialsFromApi = (res.data || []).map(normalizeMaterial);
} catch (error) {
console.error('鏌ヨ鍘熸潗鏂欏垪琛ㄥけ璐�:', error);
}
@@ -164,7 +232,9 @@
return {
...savedItem,
qualitity: apiItem?.qualitity ?? savedItem.qualitity ?? 0,
- requisitionQty: savedItem.requisitionQty || 0
+ requisitionQty: savedItem.requisitionQty || 0,
+ customer: savedItem.customer ?? savedItem.supplierName ?? apiItem?.customer ?? '',
+ batchNo: savedItem.batchNo ?? savedItem.batchNumber ?? apiItem?.batchNo ?? '',
};
});
} catch (e) {
@@ -190,7 +260,9 @@
const res = await getMaterials({ bomId });
console.log('getMaterials杩斿洖鏁版嵁:', res.data);
// 鐩存帴灞曠ず鎵�鏈夋暟鎹紝涓嶈繃婊�
- availableMaterials.value = res.data || [];
+ availableMaterials.value = (res.data || []).map(normalizeMaterial);
+ filterSupplier.value = '';
+ filterBatchNo.value = '';
selectedMaterials.value = [];
addDialogVisible.value = true;
} catch (error) {
@@ -222,7 +294,7 @@
.map(item => ({
...item,
requisitionQty: 0,
- remark: ''
+ remark: '',
}));
if (newItems.length === 0) {
@@ -270,6 +342,7 @@
visible.value = false;
materialList.value = [];
activeTab.value = 'material';
+ emit('confirm');
} catch (error) {
console.error('淇濆瓨棰嗘枡澶辫触:', error);
ElMessage.error('淇濆瓨棰嗘枡澶辫触');
diff --git a/src/views/productionManagement/productionOrder/New.vue b/src/views/productionManagement/productionOrder/New.vue
index 59c04bd..6ef6155 100644
--- a/src/views/productionManagement/productionOrder/New.vue
+++ b/src/views/productionManagement/productionOrder/New.vue
@@ -166,10 +166,7 @@
const product = products[0];
formState.value.productId = product.productId;
formState.value.productName = product.productName;
- const productNameArr = product.productName.split('-');
- if (productNameArr.length === 3 && productNameArr[0] && productNameArr[1] !== '') {
- formState.value.manufacturingTeam = productNameArr[1].charAt(0) + '绫昏溅闂�';
- }
+ formState.value.manufacturingTeam = product.parentName.charAt(0) + '绫昏溅闂�';
formState.value.productModelName = product.model;
formState.value.productModelId = product.id;
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 3b4adc7..788d5d6 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -107,6 +107,7 @@
<material-requisition-dialog
v-model="materialRequisitionVisible"
:order-data="currentOrderData"
+ @confirm="handleQuery"
/>
</div>
</template>
@@ -158,6 +159,11 @@
width: '120px',
},
{
+ label: "鎵瑰彿",
+ prop: "batchNo",
+ width: '120px',
+ },
+ {
label: "宸ヨ壓璺嚎缂栧彿",
prop: "processRouteCode",
width: '200px',
diff --git a/src/views/productionManagement/productionReporting/Input.vue b/src/views/productionManagement/productionReporting/Input.vue
index 06c2d9d..7b0e10a 100644
--- a/src/views/productionManagement/productionReporting/Input.vue
+++ b/src/views/productionManagement/productionReporting/Input.vue
@@ -71,6 +71,14 @@
prop: 'uidNo',
},
{
+ label: '渚涘簲鍟�',
+ prop: 'customer',
+ },
+ {
+ label: '鎵瑰彿',
+ prop: 'batchNo',
+ },
+ {
label: '鎶曞叆鏁伴噺',
prop: 'quantity',
},
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 1d3c8a5..eaceff1 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -173,6 +173,13 @@
label-width="120px">
<el-row :gutter="30">
<el-col :span="12">
+ <el-form-item label="浜у搧鍚嶇О">
+ <el-input v-model="reportForm.productName"
+ readonly
+ style="width: 300px" />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
<el-form-item label="寰呯敓浜ф暟閲�">
<el-input v-model="reportForm.planQuantity"
readonly
@@ -212,18 +219,6 @@
@input="handleScrapQtyInput" />
</el-form-item></el-col>
<el-col :span="12">
- <el-form-item label="妫�鍝佹暟閲�"
- prop="inspectedQuantity">
- <el-input v-model.number="reportForm.inspectedQuantity"
- type="number"
- min="0"
- step="1"
- style="width: 300px"
- placeholder="璇疯緭鍏ユ鍝佹暟閲�"
- @input="handleInspectedQuantity"/>
- </el-form-item>
- </el-col>
- <el-col :span="12">
<el-form-item label="鐝粍淇℃伅">
<el-select v-model="reportForm.userId"
style="width: 300px"
@@ -262,6 +257,8 @@
<el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="160" />
<el-table-column prop="model" label="鍨嬪彿" min-width="150" />
<el-table-column prop="unit" label="鍗曚綅" width="90" align="center" />
+ <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
<el-table-column prop="reportQty" label="棰嗙敤鏁伴噺" width="160" align="center">
<template #default="{ row }">
<el-input-number
@@ -269,8 +266,8 @@
:min="0"
:precision="2"
:controls="false"
- :max="row.qualitity || 0"
- :disabled="!row.qualitity"
+ :max="row.requisitionQty || 0"
+ :disabled="!row.requisitionQty"
style="width: 100%"
/>
</template>
@@ -300,7 +297,7 @@
<el-dialog
v-model="addMaterialDialogVisible"
title="閫夋嫨鍘熸潗鏂�"
- width="1000px"
+ width="1400px"
top="5vh"
:close-on-click-modal="false"
append-to-body
@@ -320,7 +317,9 @@
<el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="160" />
<el-table-column prop="model" label="鍨嬪彿" min-width="150" />
<el-table-column prop="unit" label="鍗曚綅" width="90" align="center" />
- <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="140" align="center" />
+ <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+ <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
+ <el-table-column prop="requisitionQty" label="鍙鐢ㄦ暟閲�" width="140" align="center" />
</el-table>
<!-- 宸查�夋嫨鏄庣粏灞曠ず鏀惧湪鎶ュ伐寮规涓嬫柟鐨� reportForm.drawMaterialList 琛ㄦ牸閲� -->
@@ -488,6 +487,8 @@
const userOptions = ref([]);
const deviceOptions = ref([]);
const reportForm = reactive({
+ // 鎶ュ伐寮规閲屸�滀骇鍝佸悕绉扳�濆彧璇诲洖鏄�
+ productName: "",
planQuantity: 0,
totalInvestment: 0,
quantity: null,
@@ -901,6 +902,8 @@
const showReportDialog = async row => {
currentReportRowData.value = row;
processParamList.value = await getProcessParamList(row)
+ // 鍏煎鍚庣/琛ㄦ牸瀛楁鍛藉悕锛氫紭鍏� row.productName锛屽叾娆� row.productCategory
+ reportForm.productName = row.productName ?? row.productCategory ?? ''
reportForm.planQuantity = row.planQuantity;
reportForm.totalInvestment = row.totalInvestment;
reportForm.quantity =
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 7e2f9d3..6c91846 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -50,6 +50,23 @@
</el-form-item>
</el-col>
<el-col :span="12">
+ <el-form-item label="鍗曚綅锛�" prop="unit">
+ <el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+ <el-input
+ v-model="form.batchNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :disabled="operationType === 'edit'"
+ />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
<el-form-item label="UID鐮侊細" prop="uidNo">
<el-input v-model="form.uidNo" placeholder="璇疯緭鍏�" disabled/>
</el-form-item>
@@ -57,8 +74,8 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="鍗曚綅锛�" prop="unit">
- <el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
+ <el-form-item label="妫�鍝佹暟閲忥細" prop="inspectedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.inspectedQuantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
</el-form-item>
</el-col>
<el-col :span="12">
@@ -66,6 +83,9 @@
<el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2" :disabled="quantityDisabled"/>
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="30">
+
</el-row>
<el-row :gutter="30">
<el-col :span="12">
@@ -227,6 +247,15 @@
const dialogFormVisible = ref(false);
const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+ if (value === undefined || value === null || String(value).trim() === '') {
+ callback(new Error('璇疯緭鍏ユ壒鍙�'));
+ return;
+ }
+ callback();
+};
+
const data = reactive({
form: {
checkTime: "",
@@ -239,6 +268,8 @@
testStandardId: "",
unit: "",
uidNo: "",
+ batchNo: "",
+ inspectedQuantity: "",
quantity: "",
inspectedQuantity: "",
inspectMaterialCondition: "",
@@ -255,6 +286,7 @@
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ inspectedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
inspectedQuantity: [
{ required: true, message: "璇疯緭鍏ユ鍝佹暟閲�", trigger: "blur" },
@@ -276,6 +308,7 @@
}
],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
},
});
@@ -439,6 +472,7 @@
form.value.productModelId = undefined;
form.value.unit = undefined;
form.value.uidNo = undefined;
+ form.value.batchNo = "";
modelOptions.value = [];
currentProductId.value = value
form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
index 2301cee..06adf63 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -49,6 +49,18 @@
</el-form-item>
</el-col>
<el-col :span="12">
+ <el-form-item label="鎵瑰彿锛�" prop="batchNo" :required="operationType === 'add'">
+ <el-input
+ v-model="form.batchNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :disabled="operationType === 'edit'"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
<el-form-item label="鍗曚綅锛�" prop="unit">
<el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
</el-form-item>
@@ -125,7 +137,7 @@
</template>
<script setup>
-import {ref, reactive, toRefs} from "vue";
+import {ref, reactive, toRefs, getCurrentInstance} from "vue";
import {modelList, productTreeList} from "@/api/basicData/product.js";
import {
getQualityUnqualifiedInfo,
@@ -140,6 +152,19 @@
const dialogFormVisible = ref(false);
const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+ if (operationType.value !== 'add') {
+ callback();
+ return;
+ }
+ if (value === undefined || value === null || String(value).trim() === '') {
+ callback(new Error('璇疯緭鍏ユ壒鍙�'));
+ return;
+ }
+ callback();
+};
+
const { rejection_handling } = proxy.useDict("rejection_handling")
const data = reactive({
form: {
@@ -150,6 +175,7 @@
productId: "",
model: "",
uidNo: "",
+ batchNo: "",
unit: "",
quantity: "",
checkCompany: "",
@@ -171,6 +197,7 @@
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
dealName: [{ required: true, message: "璇烽�夋嫨澶勭悊浜�", trigger: "change" }],
+ batchNo: [{ validator: validateBatchNo, trigger: "blur" }],
},
});
const { form, rules } = toRefs(data);
@@ -201,6 +228,7 @@
productId: '',
model: '',
uidNo: '',
+ batchNo: '',
unit: '',
quantity: '',
productName: '',
@@ -233,6 +261,7 @@
form.value.model = undefined;
form.value.unit = undefined;
form.value.uidNo = undefined;
+ form.value.batchNo = "";
modelOptions.value = [];
form.value.productName = findNodeById(productOptions.value, value);
modelList({ id: value }).then((res) => {
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
index 8f4492a..5e18b06 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -54,6 +54,13 @@
</el-row>
<el-row :gutter="30">
<el-col :span="12">
+ <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+ <el-input v-model="form.batchNo" placeholder="鈥�" disabled />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
<el-form-item label="妫�楠屽憳锛�" prop="checkName">
<el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled/>
</el-form-item>
@@ -121,7 +128,7 @@
</template>
<script setup>
-import {ref, reactive, toRefs, computed} from "vue";
+import {ref, reactive, toRefs, computed, getCurrentInstance} from "vue";
import {productTreeList} from "@/api/basicData/product.js";
import {
getQualityUnqualifiedInfo,
@@ -142,6 +149,7 @@
productName: "",
productId: "",
model: "",
+ batchNo: "",
unit: "",
quantity: "",
checkCompany: "",
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 8538fa4..3f3ac28 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -63,7 +63,7 @@
import {onMounted, ref, reactive, toRefs, nextTick, getCurrentInstance} from "vue";
import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
import {ElMessageBox} from "element-plus";
-import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
+import {qualityUnqualifiedDel, qualityUnqualifiedListPage, downloadReturnRecord} from "@/api/qualityManagement/nonconformingManagement.js";
import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
import dayjs from "dayjs";
@@ -148,6 +148,11 @@
prop: "uidNo",
},
{
+ label: "鎵瑰彿",
+ prop: "batchNo",
+ width: 140,
+ },
+ {
label: "鍗曚綅",
prop: "unit",
},
@@ -181,7 +186,7 @@
label: "鎿嶄綔",
align: "center",
fixed: "right",
- width: 100,
+ width: 180,
operation: [
{
name: "澶勭悊",
@@ -190,6 +195,14 @@
openInspectionForm("edit", row);
},
disabled: (row) => row.inspectState === 1,
+ },
+ {
+ name: "涓嬭浇杩斿伐闄勪欢",
+ type: "text",
+ clickFun: (row) => {
+ handleDownloadReturnRecord(row);
+ },
+ show: (row) => row.dealResult === "杩斿伐",
},
],
},
@@ -264,6 +277,33 @@
})
};
+// 涓嬭浇杩斿伐闄勪欢
+const handleDownloadReturnRecord = async (row) => {
+ try {
+ const blobData = await downloadReturnRecord(row.id);
+
+ // 鏋勫缓 Blob
+ const blob = new Blob([blobData], {
+ type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+ });
+
+ // 涓嬭浇
+ const url = window.URL.createObjectURL(blob);
+ const link = document.createElement("a");
+ link.href = url;
+ link.download = `杩斿伐闄勪欢.docx`;
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ window.URL.revokeObjectURL(url);
+
+ proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
+ } catch (error) {
+ console.error("涓嬭浇杩斿伐闄勪欢澶辫触:", error);
+ proxy.$modal.msgError("涓嬭浇澶辫触");
+ }
+};
+
// 鍒犻櫎
const handleDelete = () => {
let ids = [];
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index ee3fde7..216ff14 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -122,6 +122,18 @@
</el-form-item>
</el-col>
<el-col :span="12">
+ <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+ <el-input
+ v-model="form.batchNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :disabled="operationType === 'edit'"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
<el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
<el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
</el-form-item>
@@ -134,6 +146,8 @@
</el-select>
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="30">
<el-col :span="12">
<el-form-item label="妫�楠屽憳锛�" prop="checkName">
<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable>
@@ -237,6 +251,15 @@
const dialogFormVisible = ref(false);
const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+ if (value === undefined || value === null || String(value).trim() === '') {
+ callback(new Error('璇疯緭鍏ユ壒鍙�'));
+ return;
+ }
+ callback();
+};
+
const data = reactive({
form: {
checkTime: "",
@@ -247,6 +270,7 @@
productModelId: "",
model: "",
uidNo: "",
+ batchNo: "",
testStandardId: "",
unit: "",
quantity: "",
@@ -286,6 +310,7 @@
}
],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
},
});
@@ -381,6 +406,7 @@
testStandardId: "",
unit: "",
uidNo: "",
+ batchNo: "",
quantity: "",
inspectedQuantity: "",
inspectMaterialCondition: "",
@@ -470,6 +496,7 @@
form.value.productModelId = undefined;
form.value.unit = undefined;
form.value.uidNo = undefined;
+ form.value.batchNo = "";
modelOptions.value = [];
currentProductId.value = value
form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 89185bf..0a86ccf 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -122,6 +122,11 @@
prop: "uidNo",
},
{
+ label: "鎵瑰彿",
+ prop: "batchNo",
+ width: 140,
+ },
+ {
label: "鍗曚綅",
prop: "unit",
},
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 596026d..fc527f3 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -134,12 +134,22 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
- <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+ <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+ <el-input
+ v-model="form.batchNo"
+ placeholder="璇疯緭鍏�"
+ clearable
+ :disabled="operationType === 'edit'"
+ />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+ </el-form-item>
+ </el-col>
<el-col :span="12">
<el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
<el-select v-model="form.checkResult">
@@ -148,6 +158,8 @@
</el-select>
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="30">
<el-col :span="12">
<el-form-item label="妫�楠屽憳锛�" prop="checkName">
<el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable style="width: 100%">
@@ -251,6 +263,15 @@
const dialogFormVisible = ref(false);
const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+ if (value === undefined || value === null || String(value).trim() === '') {
+ callback(new Error('璇疯緭鍏ユ壒鍙�'));
+ return;
+ }
+ callback();
+};
+
const data = reactive({
form: {
checkTime: "",
@@ -261,6 +282,7 @@
productModelId: "",
model: "",
uidNo: "",
+ batchNo: "",
testStandardId: "",
unit: "",
quantity: "",
@@ -300,6 +322,7 @@
}
],
checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+ batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
},
});
@@ -393,6 +416,7 @@
productModelId: "",
model: "",
uidNo: "",
+ batchNo: "",
testStandardId: "",
unit: "",
quantity: "",
@@ -482,6 +506,7 @@
form.value.productModelId = undefined;
form.value.unit = undefined;
form.value.uidNo = undefined;
+ form.value.batchNo = "";
modelOptions.value = [];
currentProductId.value = value
form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 16d6057..98b51a5 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -124,6 +124,11 @@
prop: "uidNo",
},
{
+ label: "鎵瑰彿",
+ prop: "batchNo",
+ width: 140,
+ },
+ {
label: "鍗曚綅",
prop: "unit",
},
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index a5aa019..7578288 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -145,7 +145,7 @@
{ label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
{ label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
{ label: "鍏宠仈鍑哄簱鍗曞彿", prop: "shippingNo", minWidth: 170 },
- { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
+ // { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
{ label: "椤圭洰闃舵", prop: "projectStage", minWidth: 120 },
{ label: "鍒跺崟浜�", prop: "maker", minWidth: 120 },
{ label: "缁撶畻浜�", prop: "settler", minWidth: 120 },
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index ca1530f..4f6d40a 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -47,6 +47,7 @@
<el-table-column label="浜у搧澶х被" prop="productCategory" />
<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
<el-table-column label="鎵瑰彿" prop="batchNo" />
+ <el-table-column label="UID鐮�" prop="uidNo" />
<el-table-column label="鍗曚綅" prop="unit" />
<el-table-column label="浜у搧鐘舵��"
width="100px"
@@ -111,8 +112,8 @@
<el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
<el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
<el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
- <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
+ <!-- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
+ <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip /> -->
<el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
:formatter="formattedNumber" />
<el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
@@ -172,24 +173,12 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
- <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="12">
<el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
<el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" />
</el-form-item>
</el-col>
- <el-col :span="12">
- <el-form-item label="浠樻鏂瑰紡">
- <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
- </el-form-item>
- </el-col>
- </el-row>
+ </el-row>
<el-row :gutter="30">
<el-col :span="12">
<el-form-item label="褰曞叆浜猴細" prop="entryPerson">
@@ -375,8 +364,25 @@
<el-row :gutter="30">
<el-col :span="24">
<el-form-item label="鎵瑰彿锛�" prop="batchNo">
- <el-select v-model="productForm.batchNo" placeholder="璇烽�夋嫨" clearable filterable>
+ <el-select v-model="productForm.batchNo"
+ placeholder="璇烽�夋嫨"
+ clearable
+ filterable
+ @change="handleBatchNoChange">
<el-option v-for="item in batchNoOptions" :key="item.value" :label="item.label" :value="item.value" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="24">
+ <el-form-item label="渚涘簲鍟嗭細" prop="customer">
+ <el-select v-model="productForm.customer"
+ placeholder="璇烽�夋嫨"
+ clearable
+ filterable
+ :disabled="!supplierOptions.length">
+ <el-option v-for="item in supplierOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
@@ -533,6 +539,7 @@
<th>浜у搧鍚嶇О</th>
<th>瑙勬牸鍨嬪彿</th>
<th>鍗曚綅</th>
+ <th>UID鐮�</th>
<th>鍗曚环</th>
<th>闆跺敭鏁伴噺</th>
<th>闆跺敭閲戦</th>
@@ -543,6 +550,7 @@
<td>{{ product.productCategory || '' }}</td>
<td>{{ product.specificationModel || '' }}</td>
<td>{{ product.unit || '' }}</td>
+ <td>{{ product.uidNo || '' }}</td>
<td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
<td>{{ product.quantity || '0' }}</td>
<td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
@@ -696,11 +704,11 @@
delProduct,
delLedgerFile, getProductInventory, saleOutboundExport,
} from "@/api/salesManagement/salesLedger.js";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
+import { getStockInventoryAll } from "@/api/inventoryManagement/stockInventory.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import { getCurrentDate } from "@/utils/index.js";
-import {getProductOrderBatchNoOptions} from "@/api/productionManagement/productionOrder.js";
+// 鐢� /stockInventory/getStockInventoryAll 椹卞姩鈥滄壒鍙�/渚涘簲鍟嗏�濊仈鍔�
import {safeTrainingExport} from "@/api/safeProduction/safetyTrainingAssessment.js";
const userStore = useUserStore();
@@ -713,6 +721,7 @@
const customerOption = ref([]);
const productOptions = ref([]);
const modelOptions = ref([]);
+const supplierOptions = ref([]);
const tableLoading = ref(false);
const page = reactive({
current: 1,
@@ -761,6 +770,7 @@
const productFormData = reactive({
productForm: {
productCategory: "",
+ customer: "",
specificationModel: "",
uidNo: "",
unit: "",
@@ -776,6 +786,7 @@
productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
batchNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+ customer: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
specificationModel: [
{ required: true, message: "璇烽�夋嫨", trigger: "change" },
],
@@ -944,64 +955,203 @@
tableLoading.value = false;
});
};
-// 鑾峰彇浜у搧澶х被tree鏁版嵁
-const getProductOptions = () => {
+let stockInventoryAllTree = [];
+let batchNodeByBatchNo = new Map();
+
+const normalizeStockInventoryTree = (nodes = []) => {
+ const normalizeNodeValue = (node) => {
+ // 鍚庣鏈夋椂浼氬嚭鐜� id=null 鐨勫眰绾э紝杩欓噷缁欎竴涓彲鐢ㄧ殑 key
+ if (node?.id !== null && node?.id !== undefined) return String(node.id);
+ if (node?.nodeType === "batch") return String(node.batchNo ?? node.label ?? "");
+ if (node?.nodeType === "customer") return String(node.customer ?? node.label ?? "");
+ if (node?.nodeType === "model") return String(node.productModelId ?? node.model ?? node.label ?? "");
+ return String(node.productName ?? node.label ?? "");
+ };
+
+ const normalized = (list) =>
+ (list || []).map((n) => {
+ const value = normalizeNodeValue(n);
+ const label = n.label ?? n.productName ?? n.model ?? n.batchNo ?? n.customer ?? "";
+ return {
+ ...n,
+ value,
+ label,
+ children: normalized(n.children),
+ };
+ });
+
+ return normalized(nodes);
+};
+
+// 浠呭睍绀烘渶澶� 3 涓眰绾э細绗� 1 灞�(product) -> 绗� 2 灞�(model) -> 绗� 3 灞�(batch)锛屾洿娣辩殑鑺傜偣涓嶅睍绀�
+const filterStockInventoryFirst3Levels = (nodes = []) => {
+ const MAX_LEVEL = 3;
+
+ const cloneAndFilterByLevel = (list = [], level = 1) => {
+ return (list || [])
+ .map((n) => {
+ // 鍚庣画灞傜骇閲屽鏋滆繕鏈� customer锛岀洿鎺ュ墧闄�
+ if (n.nodeType === "customer") return null;
+
+ // 鍒拌揪灞曠ず娣卞害鍚庯紝涓嶅啀鍚戜笅鎸傚瓙鑺傜偣
+ if (level >= MAX_LEVEL) {
+ return { ...n, children: [] };
+ }
+
+ // 鐗逛緥锛歜atch 鑺傜偣鏈韩涔熶笉鍐嶅睍绀� children锛堜繚鎸佷笌鎺ュ彛鑺傜偣璇箟涓�鑷达級
+ if (n.nodeType === "batch") {
+ return { ...n, children: [] };
+ }
+
+ return { ...n, children: cloneAndFilterByLevel(n.children, level + 1) };
+ })
+ .filter(Boolean);
+ };
+
+ return cloneAndFilterByLevel(nodes, 1);
+};
+
+const findNodeObjByValue = (nodes = [], value) => {
+ for (let i = 0; i < (nodes || []).length; i++) {
+ const node = nodes[i];
+ if (String(node?.value) === String(value)) return node;
+ const children = node?.children || [];
+ if (children.length) {
+ const found = findNodeObjByValue(children, value);
+ if (found) return found;
+ }
+ }
+ return null;
+};
+
+// 鑾峰彇搴撳瓨鏍戯紙鐢ㄤ簬浜у搧澶х被/瑙勬牸鍨嬪彿鑱斿姩锛�
+const getProductOptions = async () => {
// 杩斿洖 Promise锛屼究浜庡湪缂栬緫浜у搧鏃剁瓑寰呭姞杞藉畬鎴�
- return productTreeList().then((res) => {
- productOptions.value = convertIdToValue(res);
- return productOptions.value;
- });
+ const res = await getStockInventoryAll();
+ const data = res?.data || [];
+ stockInventoryAllTree = normalizeStockInventoryTree(data);
+ productOptions.value = filterStockInventoryFirst3Levels(stockInventoryAllTree);
+ return productOptions.value;
};
const formattedNumber = (row, column, cellValue) => {
return parseFloat(cellValue).toFixed(2);
};
-// 鑾峰彇tree瀛愭暟鎹�
+// 鑾峰彇tree瀛愭暟鎹紙鍏堥�変骇鍝侊紝鍐嶉�夎鏍煎瀷鍙凤級
const getModels = (value) => {
- productForm.value.productCategory = findNodeById(productOptions.value, value);
- modelList({ id: value }).then((res) => {
- modelOptions.value = res;
- });
+ const node = findNodeObjByValue(stockInventoryAllTree, value);
+ if (!node) return;
+ if (node.nodeType !== "product") return;
+
+ // 閫夋嫨浜у搧鍚庯紝閲嶇疆涓嬫父瀛楁
+ productForm.value.productCategory = node.label;
+ modelOptions.value = (node.children || [])
+ .filter((c) => c.nodeType === "model")
+ .map((m) => ({
+ id: m.value,
+ model: m.model ?? m.label ?? "",
+ unit: m.unit ?? "",
+ uidNo: m.uidNo ?? m.identifierCode ?? "",
+ }));
+
+ productForm.value.productModelId = null;
+ productForm.value.specificationModel = "";
+ productForm.value.uidNo = "";
+ productForm.value.unit = "";
+ productForm.value.batchNo = "";
+ productForm.value.customer = "";
+ productForm.value.taxInclusiveUnitPrice = "";
+ productForm.value.taxInclusiveTotalPrice = "";
+ productForm.value.taxExclusiveTotalPrice = "";
+
+ modelOptions.value = modelOptions.value || [];
+ batchNoOptions.value = [];
+ supplierOptions.value = [];
+ batchNodeByBatchNo = new Map();
};
+
+// 瑙勬牸鍨嬪彿閫夋嫨鍚庯細鍥炴樉 UID锛屽苟鐢熸垚鈥滄壒鍙蜂笅鎷夆��
const getProductModel = (value) => {
- const index = modelOptions.value.findIndex((item) => item.id === value);
- if (index !== -1) {
- productForm.value.specificationModel = modelOptions.value[index].model;
- productForm.value.unit = modelOptions.value[index].unit;
- productForm.value.uidNo = modelOptions.value[index].uidNo || "";
+ const modelNode = findNodeObjByValue(stockInventoryAllTree, value);
+ if (!modelNode || modelNode.nodeType !== "model") return;
+
+ const prevBatchNo = productForm.value.batchNo;
+ const prevCustomer = productForm.value.customer;
+
+ productForm.value.productModelId = modelNode.value;
+ productForm.value.specificationModel = modelNode.model ?? modelNode.label ?? "";
+ // 鏈変簺鎺ュ彛/鏍戞暟鎹噷鍙兘涓嶅寘鍚� unit锛岃繖绉嶆儏鍐典笅涓嶈瑕嗙洊缂栬緫鏃跺凡鍥炴樉鐨勫��
+ const nextUnit = modelNode.unit ?? "";
+ if (nextUnit !== null && nextUnit !== undefined && String(nextUnit).trim() !== "") {
+ productForm.value.unit = nextUnit;
+ }
+ // 鏈変簺鎺ュ彛/鏍戞暟鎹噷鍙兘涓嶅寘鍚� uidNo锛岃繖绉嶆儏鍐典笅涓嶈瑕嗙洊缂栬緫鏃跺凡鍥炴樉鐨勫��
+ const nextUidNo = modelNode.uidNo ?? modelNode.identifierCode ?? "";
+ if (nextUidNo !== null && nextUidNo !== undefined && String(nextUidNo).trim() !== "") {
+ productForm.value.uidNo = nextUidNo;
+ }
+
+ const batchNodes = (modelNode.children || []).filter((b) => b.nodeType === "batch");
+ batchNodeByBatchNo = new Map(
+ batchNodes.map((b) => {
+ const key = String(b.batchNo ?? b.value ?? b.label ?? "").trim();
+ return [key, b];
+ })
+ );
+ batchNoOptions.value = batchNodes.map((b) => ({
+ label: String(b.batchNo ?? b.label ?? "").trim(),
+ value: String(b.batchNo ?? b.value ?? b.label ?? "").trim(),
+ }));
+
+ // 鎵瑰彿涓嶅啀灞炰簬鏂拌鏍兼椂锛屾竻绌�
+ const batchValues = new Set(batchNoOptions.value.map((x) => x.value));
+ if (!prevBatchNo || !batchValues.has(prevBatchNo)) {
+ productForm.value.batchNo = "";
+ }
+
+ // 闇�瑕佷緵搴斿晢锛氭壒鍙峰洖鏄惧悗鍐嶇敓鎴�
+ productForm.value.customer = "";
+ supplierOptions.value = [];
+ if (productForm.value.batchNo) {
+ handleBatchNoChange(productForm.value.batchNo, prevCustomer);
+ }
+};
+
+const handleBatchNoChange = (batchNo, prevCustomer) => {
+ const safeBatchNo = String(batchNo ?? "").trim();
+ if (!safeBatchNo || !batchNodeByBatchNo.size) {
+ productForm.value.customer = "";
+ supplierOptions.value = [];
+ return;
+ }
+
+ const batchNode = batchNodeByBatchNo.get(String(safeBatchNo));
+ if (!batchNode) {
+ productForm.value.customer = "";
+ supplierOptions.value = [];
+ return;
+ }
+
+ // UID鐮佸彲鑳芥潵婧愪簬 batch 鑺傜偣锛堜笉鍚屾帴鍙e瓧娈靛悕涓嶄竴鑷存椂灏介噺鍏滃簳锛�
+ const nextUidNo = batchNode.uidNo ?? batchNode.identifierCode ?? batchNode.uid ?? "";
+ if (nextUidNo !== null && nextUidNo !== undefined && String(nextUidNo).trim() !== "") {
+ productForm.value.uidNo = nextUidNo;
+ }
+
+ const customers = (batchNode.children || [])
+ .filter((c) => c.nodeType === "customer")
+ .map((c) => c.customer ?? c.label ?? "")
+ .filter(Boolean);
+
+ const uniq = Array.from(new Set(customers));
+ supplierOptions.value = uniq.map((s) => ({ label: s, value: s }));
+
+ // 缂栬緫鍦烘櫙灏介噺鍥炴樉锛涙柊澧炲満鏅笉鍥炴樉
+ if (prevCustomer && uniq.includes(prevCustomer)) {
+ productForm.value.customer = prevCustomer;
} else {
- productForm.value.specificationModel = null;
- productForm.value.unit = null;
- productForm.value.uidNo = null;
+ productForm.value.customer = "";
}
};
-const findNodeById = (nodes, productId) => {
- for (let i = 0; i < nodes.length; i++) {
- if (nodes[i].value === productId) {
- return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
- }
- if (nodes[i].children && nodes[i].children.length > 0) {
- const foundNode = findNodeById(nodes[i].children, productId);
- if (foundNode) {
- return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
- }
- }
- }
- return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
- return data.map((item) => {
- const { id, children, ...rest } = item;
- const newItem = {
- ...rest,
- value: id, // 灏� id 鏀逛负 value
- };
- if (children && children.length > 0) {
- newItem.children = convertIdToValue(children);
- }
-
- return newItem;
- });
-}
// 鏍规嵁鍚嶇О鍙嶆煡浜у搧澶х被 id锛屼究浜庝粎瀛樺悕绉版椂鐨勫弽鏄�
function findNodeIdByLabel(nodes, label) {
if (!label) return null;
@@ -1195,8 +1345,9 @@
return {
// 鍙拌处瀛楁
productCategory: p.product || p.productName || "",
+ productModelId: p.productModelId || "",
specificationModel: p.specification || "",
- uidNo: p.uidNo || "",
+ uidNo: p.uidNo || "",
unit: p.unit || "",
quantity: quantity,
taxRate: taxRate,
@@ -1275,10 +1426,6 @@
};
const batchNoOptions = ref([]);
-const fetchBatchNoOptions = async () => {
- const res = await getProductOrderBatchNoOptions();
- batchNoOptions.value = res.data;
-};
// 鍏抽棴寮规
const closeDia = () => {
proxy.resetForm("formRef");
@@ -1302,25 +1449,44 @@
productIndex.value = index;
// 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
try {
- const options = productOptions.value && productOptions.value.length > 0
- ? productOptions.value
- : await getProductOptions();
- const categoryId = findNodeIdByLabel(options, productForm.value.productCategory);
- if (categoryId) {
- const models = await modelList({ id: categoryId });
- modelOptions.value = models || [];
- // 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
- const currentModel = (modelOptions.value || []).find(
- (m) => m.model === productForm.value.specificationModel
- );
+ if (!productOptions.value || productOptions.value.length === 0) {
+ await getProductOptions();
+ }
+
+ // 鍥炴樉锛氭牴鎹�滀骇鍝佸ぇ绫烩�濆弽鏌ヤ骇鍝佽妭鐐�
+ const categoryKey = findNodeIdByLabel(productOptions.value, productForm.value.productCategory);
+ if (categoryKey) {
+ const categoryNode = findNodeObjByValue(stockInventoryAllTree, categoryKey);
+ const models = (categoryNode?.children || [])
+ .filter((n) => n.nodeType === "model")
+ .map((m) => ({
+ id: m.value,
+ model: m.model ?? m.label ?? "",
+ unit: m.unit ?? "",
+ uidNo: m.uidNo ?? m.identifierCode ?? "",
+ }));
+ modelOptions.value = models;
+
+ // 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍥炴樉
+ const targetSpec = String(productForm.value.specificationModel ?? "").trim();
+ const currentModel =
+ (models || []).find((m) => String(m.model ?? "").trim() === targetSpec) ||
+ (models || []).find((m) => String(m.model ?? "").trim().includes(targetSpec)) ||
+ (models || []).find((m) => targetSpec.includes(String(m.model ?? "").trim()));
if (currentModel) {
+ productForm.value.customer = productForm.value.customer || row.customer || row.supplierName || "";
productForm.value.productModelId = currentModel.id;
+ getProductModel(currentModel.id);
}
}
} catch (e) {
// 鍔犺浇澶辫触鏃朵繚鎸佸彲缂栬緫锛屼笉涓柇寮圭獥
console.error("鍔犺浇浜у搧瑙勬牸鍨嬪彿澶辫触", e);
}
+ // 鏈�缁堝厹搴曪細濡傛灉涓�旇閲嶇疆娓呯┖锛岃嚦灏戝洖鏄捐鏁版嵁閲岀殑 UID
+ productForm.value.uidNo = row.uidNo ?? productForm.value.uidNo ?? "";
+ // 鏈�缁堝厹搴曪細鍚屾牱淇濊瘉鍗曚綅涓嶄細鍥犳爲鏁版嵁缂哄け鑰岃瑕嗙洊涓虹┖
+ productForm.value.unit = row.unit ?? productForm.value.unit ?? "";
} else {
getProductOptions()
}
@@ -1732,6 +1898,7 @@
<th>浜у搧鍚嶇О</th>
<th>瑙勬牸鍨嬪彿</th>
<th>鍗曚綅</th>
+ <th>UID鐮�</th>
<th>鍗曚环</th>
<th>闆跺敭鏁伴噺</th>
<th>闆跺敭閲戦</th>
@@ -1744,6 +1911,7 @@
<td>${product.productCategory || ''}</td>
<td>${product.specificationModel || ''}</td>
<td>${product.unit || ''}</td>
+ <td>${product.uidNo || ''}</td>
<td>${product.taxInclusiveUnitPrice || '0'}</td>
<td>${product.quantity || '0'}</td>
<td>${product.taxInclusiveTotalPrice || '0'}</td>
@@ -2250,7 +2418,6 @@
onMounted(() => {
getList();
- fetchBatchNoOptions();
userListNoPage().then(res => {
userList.value = res.data;
})
--
Gitblit v1.9.3