From 94c0a729da1b88ab4a0067f1e14a00264e0447cf Mon Sep 17 00:00:00 2001
From: chenlu <1320612696@qq.com>
Date: 星期一, 15 十二月 2025 17:04:05 +0800
Subject: [PATCH] bom管理中空胶计算调整

---
 north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue                 |   87 ++++++++++++++++++++++++++++++++++++-------
 north-glass-erp/src/main/resources/mapper/sd/BomDataMapper.xml               |   14 +++++-
 north-glass-erp/src/main/java/com/example/erp/service/sd/BomDataService.java |    4 +
 3 files changed, 87 insertions(+), 18 deletions(-)

diff --git a/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue b/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue
index 2fdef27..7ecad75 100644
--- a/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue
+++ b/north-glass-erp/northglass-erp/src/views/sd/bom/OrderBOM.vue
@@ -478,6 +478,9 @@
   selectOrderList()
 }
 
+//鎬讳环
+const totalPriceSum = ref()
+
 //椤甸潰璺宠浆鏇存柊鎴栬�呭垹闄よ鍗�
 const getTableRow =  (row,type) => {
   switch (type) {
@@ -493,23 +496,82 @@
                 orderBomDetails.value=res.data.data
                 orderBomData.value.productName.forEach((product, i) => {
                   const details = orderBomDetails.value[i]?.data || []
+                  const perimeter = Number(product.perimeter || 0)
+
+                  // hollow锛氶噸绠� consume銆乵aterialPric
+                  details.forEach(d => {
+                    if (d.detail_type === 'hollow') {
+                      const glueDepth = Number(d.glueDepth || 0)
+                      const thickness = Number(d.thickness || 0)
+                      const price = Number(d.price || 0)
+
+                      // consume 淇濇寔涓烘暟瀛�
+                      const consume = (glueDepth / 100) * (thickness / 100) * perimeter
+                      d.consume = Number(consume.toFixed(2))   // 闇�瑕佷繚鐣�2浣嶅氨杞洖 number
+
+                      // materialPric 涔熶繚鎸佷负鏁板瓧
+                      d.materialPric = Number((d.consume * price).toFixed(2))
+                    }
+                  })
 
                   // 鐢熸垚 parts
                   const parts = product.product_name.split(/[*+]/)
                   parts.push("鍏跺畠")
 
                   product.product_parts = parts.map((p, idx) => {
-                    // 鎵惧嚭鎵�鏈� product_layer == idx+1 鐨� detail
-                    const assignedDetails = details.filter(d => d.product_layer === idx + 1)
-
-                    return {
-                      name: p,
-                      details: assignedDetails
-                    }
+                    const assignedDetails = details.filter(d => Number(d.product_layer) === idx + 1)
+                    return { name: p, details: assignedDetails }
                   })
-                  // 璁$畻鎬讳环
-                  product.totalPrice = details.reduce((sum, d) => sum + (d.materialPric || 0) , 0)
+
+                  // 姣忎釜 product 鐨勬�讳环锛堜繚璇佹暟瀛楃浉鍔狅級
+                  product.totalPrice = details.reduce(
+                      (sum, d) => sum + Number(d.materialPric || 0),
+                      0
+                  )
                 })
+
+                //  鎴愬搧鍚堣锛氫粠 details 姹囨��
+                const totalMap = new Map()
+
+                orderBomDetails.value.forEach(block => {
+                  const details = block?.data || []
+                  details.forEach(d => {
+                    const consume = Number(d.consume || 0)
+                    const price = Number(d.price || 0)
+                    const key = `${Number(d.material_id)}|${String(d.detail_type || '')}|${price}`
+
+                    if (!totalMap.has(key)) {
+                      totalMap.set(key, {
+                        material_id: d.material_id,
+                        material: d.material,
+                        detail_type: d.detail_type,
+                        price,
+                        unit: d.unit,
+                        type: d.type,
+                        consume: 0,
+                        materialPrice: 0
+                      })
+                    }
+
+                    const row = totalMap.get(key)
+                    row.consume += consume
+                  })
+                })
+
+                const totalSumDatilsData = Array.from(totalMap.values()).map(r => ({
+                  ...r,
+                  consume: Number(r.consume.toFixed(2)),
+                  materialPrice: Number(r.materialPrice.toFixed(2))
+                }))
+
+                bomSum.value.sumDatilsData = totalSumDatilsData
+
+                // 姹囨�绘�婚噾棰�
+                totalPriceSum.value = orderBomData.value.productName.reduce(
+                    (sum, p) => sum + Number(p.totalPrice || 0),
+                    0
+                )
+
                 dialogTableVisible.value = true
               }
             })
@@ -581,10 +643,7 @@
   }
 }
 
-//鎬讳环
-const totalPrice = computed(() => {
-  return bomSum.value.sumDatilsData.reduce((sum, d) => sum + d.materialPrice, 0)
-})
+
 </script>
 
 <template>
@@ -729,7 +788,7 @@
 
         <!-- footer -->
         <template #footer>
-          鍚堣 楼{{ totalPrice }}
+          鍚堣 楼{{ totalPriceSum }}
         </template>
       </el-card>
 
diff --git a/north-glass-erp/src/main/java/com/example/erp/service/sd/BomDataService.java b/north-glass-erp/src/main/java/com/example/erp/service/sd/BomDataService.java
index 7d10a9d..77427d6 100644
--- a/north-glass-erp/src/main/java/com/example/erp/service/sd/BomDataService.java
+++ b/north-glass-erp/src/main/java/com/example/erp/service/sd/BomDataService.java
@@ -71,8 +71,10 @@
                     Object produceId = row.get("produceId");
                     Object tabId = row.get("tabId");
                     Object layer = row.get("layer");
+                    if (tabId!=null){
+                        bomDataMapper.saveProductBOMMp(produceId,tabId,layer);
+                    }
 
-                    bomDataMapper.saveProductBOMMp(produceId,tabId,layer);
                 }
             }
         }
diff --git a/north-glass-erp/src/main/resources/mapper/sd/BomDataMapper.xml b/north-glass-erp/src/main/resources/mapper/sd/BomDataMapper.xml
index 86f0d35..abfe0af 100644
--- a/north-glass-erp/src/main/resources/mapper/sd/BomDataMapper.xml
+++ b/north-glass-erp/src/main/resources/mapper/sd/BomDataMapper.xml
@@ -34,10 +34,14 @@
     </select>
 
     <select id="getBOMDetails">
-        select bp.*,bb.*,(consume*price) as materialPric,od.quantity from sd.bom_product as bp
+        select  bp.*,bb.*,(consume*price) as materialPric,od.quantity,pdd.detail_type,
+            IFNULL(JSON_UNQUOTE(JSON_EXTRACT(pdd.separation, '$.GlueDepth')),0) as glueDepth,
+            CAST(SUBSTRING_INDEX(IFNULL(JSON_UNQUOTE(JSON_EXTRACT(pdd.separation, '$.thickness')), '0mm'), 'mm', 1) AS DECIMAL(10, 2)) AS thickness
+               from sd.bom_product as bp
             left join sd.bom_base as bb on bb.id=bp.base_id
             left join ( select order_id,product_id,SUM(quantity) as quantity from sd.order_detail GROUP BY  order_id,product_id
         ) as od on od.product_id = bp.product_id
+            left join sd.product_detail as pdd on pdd.prod_id = bp.product_id and pdd.sort_num = bp.product_layer
         where bp.product_id = #{productId} and od.order_id = #{orderId} ORDER BY product_layer
     </select>
 
@@ -57,14 +61,18 @@
             sum(bb.consume) as consume,
             sum(bb.price) as price,
             sum(bb.consume * bb.price) AS materialPrice,
-            od.quantity
+            od.quantity,
+            pdd.detail_type,
+            IFNULL( JSON_UNQUOTE( JSON_EXTRACT( pdd.separation, '$.GlueDepth' )), 0 ) AS glueDepth,
+            CAST(
+                    SUBSTRING_INDEX( IFNULL( JSON_UNQUOTE( JSON_EXTRACT( pdd.separation, '$.thickness' )), '0mm' ), 'mm', 1 ) AS DECIMAL ( 10, 2 )) AS thickness
         FROM
             sd.bom_product AS bp
                 LEFT JOIN sd.bom_base AS bb ON bb.id = bp.base_id
                 LEFT JOIN (
                 select order_id,product_id,SUM(quantity) as quantity from sd.order_detail GROUP BY  order_id,product_id
             ) as od on od.product_id = bp.product_id
-
+                LEFT JOIN sd.product_detail AS pdd ON pdd.prod_id = bp.product_id  AND pdd.sort_num = bp.product_layer
         WHERE od.order_id=#{orderId}
         GROUP BY bb.material_id
         ORDER BY bp.product_layer

--
Gitblit v1.8.0