chenlu
12 小时以前 94c0a729da1b88ab4a0067f1e14a00264e0447cf
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、materialPric
                  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)
                    const assignedDetails = details.filter(d => Number(d.product_layer) === idx + 1)
                    return { name: p, details: assignedDetails }
                  })
                    return {
                      name: p,
                      details: assignedDetails
                  // 每个 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
                  })
                  // 计算总价
                  product.totalPrice = details.reduce((sum, d) => sum + (d.materialPric || 0) , 0)
                })
                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>