From f3f9531d797c3331ca366e0b7a5d9c6e93c10a8c Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期五, 27 三月 2026 11:17:06 +0800
Subject: [PATCH] fix(产品结构): 修复单位产出数量精度并优化显示逻辑

---
 src/views/productionManagement/productStructure/Detail/index.vue  |   32 ++++++++++++---
 src/views/productionManagement/productStructure/StructureEdit.vue |   30 ++++++++++++---
 2 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/src/views/productionManagement/productStructure/Detail/index.vue b/src/views/productionManagement/productStructure/Detail/index.vue
index 1452d1e..a3e6175 100644
--- a/src/views/productionManagement/productStructure/Detail/index.vue
+++ b/src/views/productionManagement/productStructure/Detail/index.vue
@@ -101,13 +101,15 @@
                   <el-form-item :prop="`dataList.${$index}.unitQuantity`"
                                 :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
                                 style="margin: 0">
-                    <el-input-number v-model="row.unitQuantity"
+                    <el-input-number v-if="dataValue.isEdit"
+                                     v-model="row.unitQuantity"
                                      :min="0"
-                                     :precision="2"
+                                     :precision="3"
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
                                      :disabled="!dataValue.isEdit" />
+                    <span v-else>{{ formatDecimalValue(row.unitQuantity) }}</span>
                   </el-form-item>
                 </template>
               </el-table-column>
@@ -232,15 +234,31 @@
   dataValue.showProductDialog = true;
 };
 
+const formatDecimalValue = (
+  value: number | string | null | undefined
+) => {
+  const numericValue = Number(value);
+  if (Number.isNaN(numericValue)) {
+    return value;
+  }
+  return Number(numericValue.toFixed(3));
+};
+
+const normalizeProductStructureList = (list: any[] = []) =>
+  list.map((item: any) => ({
+    ...item,
+    unitQuantity: formatDecimalValue(item.unitQuantity ?? 0),
+  }));
+
 const fetchData = async () => {
   if (isOrderPage.value) {
     // 璁㈠崟鎯呭喌锛氫娇鐢ㄨ鍗曠殑浜у搧缁撴瀯鎺ュ彛
     const { data } = await listProcessBom({ orderId: routeOrderId.value });
-    dataValue.dataList = data || [];
+    dataValue.dataList = normalizeProductStructureList(data) as typeof dataValue.dataList;
   } else {
     // 闈炶鍗曟儏鍐碉細浣跨敤鍘熸潵鐨勬帴鍙�
     const { data } = await queryList(routeId.value);
-    dataValue.dataList = data || [];
+    dataValue.dataList = normalizeProductStructureList(data) as typeof dataValue.dataList;
   }
 };
 
@@ -268,8 +286,8 @@
         if (valid) {
           add({
             bomId: routeId.value,
-            productStructureList: dataValue.dataList || [],
-          }).then(res => {
+            productStructureList: normalizeProductStructureList(dataValue.dataList as any[]),
+          }).then(() => {
             router.push({
               path: '/productionManagement/productionManagement/productStructure/index',
             })
@@ -316,4 +334,4 @@
   fetchData();
   fetchProcessOptions();
 });
-</script>
\ No newline at end of file
+</script>
diff --git a/src/views/productionManagement/productStructure/StructureEdit.vue b/src/views/productionManagement/productStructure/StructureEdit.vue
index 4d07f5d..68d49fc 100644
--- a/src/views/productionManagement/productStructure/StructureEdit.vue
+++ b/src/views/productionManagement/productStructure/StructureEdit.vue
@@ -84,13 +84,15 @@
                   <el-form-item :prop="`dataList.${$index}.unitQuantity`"
                                 :rules="[{ required: true, message: '璇疯緭鍏ュ崟浣嶄骇鍑烘墍闇�鏁伴噺', trigger: ['blur','change'] }]"
                                 style="margin: 0">
-                    <el-input-number v-model="row.unitQuantity"
+                    <el-input-number v-if="dataValue.isEdit"
+                                     v-model="row.unitQuantity"
                                      :min="0"
-                                     :precision="2"
+                                     :precision="3"
                                      :step="1"
                                      controls-position="right"
                                      style="width: 100%"
                                      :disabled="!dataValue.isEdit" />
+                    <span v-else>{{ formatDecimalValue(row.unitQuantity) }}</span>
                   </el-form-item>
                 </template>
               </el-table-column>
@@ -244,9 +246,25 @@
     dataValue.showProductDialog = true;
   };
 
+  const formatDecimalValue = (
+    value: number | string | null | undefined
+  ) => {
+    const numericValue = Number(value);
+    if (Number.isNaN(numericValue)) {
+      return value;
+    }
+    return Number(numericValue.toFixed(3));
+  };
+
+  const normalizeProductStructureList = (list: any[] = []) =>
+    list.map((item: any) => ({
+      ...item,
+      unitQuantity: formatDecimalValue(item.unitQuantity ?? 0),
+    }));
+
   const fetchData = async () => {
     const { data } = await queryList(props.record.id);
-    dataValue.dataList = data;
+    dataValue.dataList = normalizeProductStructureList(data) as typeof dataValue.dataList;
   };
 
   const fetchProcessOptions = async () => {
@@ -272,8 +290,8 @@
         if (valid) {
           add({
             parentId: props.record.id,
-            productStructureList: dataValue.dataList || [],
-          }).then(res => {
+            productStructureList: normalizeProductStructureList(dataValue.dataList as any[]),
+          }).then(() => {
             ElMessage.success("淇濆瓨鎴愬姛");
             visible.value = false;
             dataValue.loading = false;
@@ -308,4 +326,4 @@
     fetchData();
     fetchProcessOptions();
   });
-</script>
\ No newline at end of file
+</script>

--
Gitblit v1.9.3