Browse Source

丢失精度

cqp 11 months ago
parent
commit
885e39b28e
3 changed files with 24 additions and 8 deletions
  1. 6 4
      app/Service/DispatchService.php
  2. 4 4
      app/Service/FinishedOrderService.php
  3. 14 0
      app/Service/Service.php

+ 6 - 4
app/Service/DispatchService.php

@@ -377,9 +377,9 @@ class DispatchService extends Service
                 $data['data'][$key]['is_create'] = 0;
             }
         }
-        $data['production_quantity'] = array_sum(array_column($data['data'], 'production_quantity'));
-        $data['dispatch_quantity'] = array_sum(array_column($data['data'], 'dispatch_quantity'));
-        $data['not_dispatch_quantity'] = array_sum(array_column($data['data'], 'not_dispatch_quantity'));
+        $data['production_quantity'] = $this->getTotal($data['data'], 'production_quantity');
+        $data['dispatch_quantity'] = $this->getTotal($data['data'], 'dispatch_quantity');
+        $data['not_dispatch_quantity'] = $this->getTotal($data['data'], 'not_dispatch_quantity');
 
         return $data;
     }
@@ -504,7 +504,9 @@ class DispatchService extends Service
             $data['data'][$key]['equipment_id'] = $value['device_id'];
             $data['data'][$key]['un_finished_quantity'] = bcsub($value['dispatch_quantity'] , $value['finished_num'],3);
         }
-        $data['dispatch_quantity'] = array_sum(array_column($data['data'], 'dispatch_quantity'));
+
+        $total = $this->getTotal($data['data'], 'dispatch_quantity');
+        $data['dispatch_quantity'] = $total;
 
         return $data;
     }

+ 4 - 4
app/Service/FinishedOrderService.php

@@ -614,10 +614,10 @@ class FinishedOrderService extends Service
             $data['data'][$key]['waste_quantity'] = $waste_map_2[$value['id']] ?? 0;
             $data['data'][$key]['not_finished_num'] = $value['dispatch_quantity'] - $value['finished_num'];
         }
-        $data['finished_num'] = array_sum(array_column($data['data'], 'finished_num'));
-        $data['dispatch_quantity'] = array_sum(array_column($data['data'], 'dispatch_quantity'));
-        $data['waste_quantity'] = array_sum(array_column($data['data'], 'waste_quantity'));
-        $data['not_finished_num'] = array_sum(array_column($data['data'], 'not_finished_num'));
+        $data['finished_num'] = $this->getTotal($data['data'], 'finished_num');
+        $data['dispatch_quantity'] = $this->getTotal($data['data'], 'dispatch_quantity');
+        $data['waste_quantity'] = $this->getTotal($data['data'], 'waste_quantity');
+        $data['not_finished_num'] = $this->getTotal($data['data'], 'not_finished_num');
 
         return $data;
     }

+ 14 - 0
app/Service/Service.php

@@ -325,4 +325,18 @@ dd(filter_var($ip, FILTER_VALIDATE_IP) === false);
         $key = $prefix . $key;
         Redis::del($key);
     }
+
+    public function getTotal($data, $column = ""){
+        if(! $column ) return 0;
+        // 使用 array_reduce 和 bcadd 计算总和
+        $total = array_reduce(
+            array_column($data, $column),
+            function ($carry, $item) {
+                return bcadd($carry, $item, 3); // 保留三位小数
+            },
+            '0.000' // 初始值
+        );
+
+        return $total;
+    }
 }