Procházet zdrojové kódy

产品年度产出率

liuhairui před 7 měsíci
rodič
revize
7bec311109

+ 71 - 49
application/api/controller/Achievementatestatistics.php

@@ -762,7 +762,7 @@ class  Achievementatestatistics extends Api
     }
 
     /**
-     * 01.产品年度投入产出率统计->数据
+     * 01.产品年度投入产出率统计->数据汇总
      */
     public function list_Productyear() {
         if ($this->request->isGet() === false) {
@@ -780,7 +780,7 @@ class  Achievementatestatistics extends Api
         }
 
         $qualityData = \db('工单_质量考核汇总')
-            ->field('Gy0_gdbh, 客户代号, sys_rq, 实际投料, 入仓数量, 产品代号, 产品名称, 销售订单号, 订单数量,计量单位')
+            ->field('Gy0_gdbh, 客户代号, 入仓日期 as sys_rq, 实际投料, 入仓数量, 产品代号, 产品名称, 销售订单号, 订单数量,计量单位')
             ->where('YEAR(Sys_rq)', $rq)
             ->where($where)
             ->select();
@@ -789,30 +789,39 @@ class  Achievementatestatistics extends Api
             $this->success('未查询到数据', []);
         }
 
-        //按工单编号和月份分组并计算总和
-        $gongdanMap = [];
+        // 第一步:按工单去重,每个工单只取一条记录
+        $uniqueByGongdan = [];
         foreach ($qualityData as $data) {
             $gdbh = $data['Gy0_gdbh'];
+            if (!isset($uniqueByGongdan[$gdbh])) {
+                $uniqueByGongdan[$gdbh] = $data;
+            }
+        }
+
+        // 第二步:按产品代号和月份分组并计算总和
+        $productMap = [];
+        foreach ($uniqueByGongdan as $gdbh => $data) {
+            $productCode = $data['产品代号'];
             $sysRq = $data['sys_rq'];
 
             // 提取月份1-12 的月份数字
             $month = date('n', strtotime($sysRq));
 
-            if (!isset($gongdanMap[$gdbh])) {
-                $gongdanMap[$gdbh] = [
-                    'Gy0_gdbh' => $gdbh,
+            if (!isset($productMap[$productCode])) {
+                $productMap[$productCode] = [
                     'sys_rq' => substr($data['sys_rq'], 0, 4),
                     '计量单位' => $data['计量单位'],
                     '成品编码' => $data['产品代号'],
                     '成品名称' => $data['产品名称'],
                     'months' => [],
                     '实际投料' => 0,
-                    '入仓数量' => 0
+                    '入仓数量' => 0,
+                    '工单列表' => [] // 记录包含的工单编号
                 ];
             }
 
-            if (!isset($gongdanMap[$gdbh]['months'][$month])) {
-                $gongdanMap[$gdbh]['months'][$month] = [
+            if (!isset($productMap[$productCode]['months'][$month])) {
+                $productMap[$productCode]['months'][$month] = [
                     '实际投料' => 0,
                     '入仓数量' => 0
                 ];
@@ -820,12 +829,17 @@ class  Achievementatestatistics extends Api
 
             //实际投料先乘以10000再累加
             $adjustedActual = round($data['实际投料'] * 10000);
-            $gongdanMap[$gdbh]['months'][$month]['实际投料'] = $adjustedActual;
-            $gongdanMap[$gdbh]['months'][$month]['入仓数量'] = $data['入仓数量'];
+
+            // 累加月度数据
+            $productMap[$productCode]['months'][$month]['实际投料'] += $adjustedActual;
+            $productMap[$productCode]['months'][$month]['入仓数量'] += $data['入仓数量'];
 
             // 累加年度总量(实际投料已经乘以10000)
-            $gongdanMap[$gdbh]['实际投料'] = $adjustedActual;
-            $gongdanMap[$gdbh]['入仓数量'] = $data['入仓数量'];
+            $productMap[$productCode]['实际投料'] += $adjustedActual;
+            $productMap[$productCode]['入仓数量'] += $data['入仓数量'];
+
+            // 记录工单编号
+            $productMap[$productCode]['工单列表'][] = $data['Gy0_gdbh'];
         }
 
         //月份
@@ -837,14 +851,16 @@ class  Achievementatestatistics extends Api
 
         //合并数据并计算合格率
         $result = [];
-        foreach ($gongdanMap as $gdbh => $gongdanData) {
+        foreach ($productMap as $productCode => $productData) {
             $resultItem = [
-                'sys_rq' => $gongdanData['sys_rq'],
-                'Gy0_gdbh' => $gongdanData['Gy0_gdbh'],
-                '成品编码' => $gongdanData['成品编码'],
-                '成品名称' => $gongdanData['成品名称'],
-                '实际投料' => $gongdanData['实际投料'],
-                '入仓数量' => $gongdanData['入仓数量']
+                'sys_rq' => $productData['sys_rq'],
+                '成品编码' => $productData['成品编码'],
+                '成品名称' => $productData['成品名称'],
+                '实际投料' => $productData['实际投料'],
+                '入仓数量' => $productData['入仓数量'],
+                '计量单位' => $productData['计量单位'],
+                '工单数量' => count($productData['工单列表']),
+                '工单列表' => implode(', ', $productData['工单列表'])
             ];
 
             // 初始化各月份数据
@@ -852,9 +868,9 @@ class  Achievementatestatistics extends Api
                 $resultItem[$monthName] = '-';
             }
 
-            // 处理该工单的月度数据
-            if (isset($gongdanData['months'])) {
-                foreach ($gongdanData['months'] as $month => $monthData) {
+            // 处理该产品的月度数据
+            if (isset($productData['months'])) {
+                foreach ($productData['months'] as $month => $monthData) {
                     $adjustedActual = $monthData['实际投料'];
                     $delivery = $monthData['入仓数量'];
 
@@ -887,8 +903,7 @@ class  Achievementatestatistics extends Api
     }
 
     /**
-     * 产品年度明细查询
-     * 根据成品编码查询每个月的累计数据
+     * 01.产品年度投入产出率统计->数据明细表
      */
     public function list_Productmonth() {
         if ($this->request->isGet() === false) {
@@ -905,17 +920,26 @@ class  Achievementatestatistics extends Api
 
         // 1. 查询对应的工单数据
         $qualityData = \db('工单_质量考核汇总')
-            ->field('Gy0_gdbh 工单编号, 订单数量, sys_rq, 实际投料, 入仓数量, 客户代号, 客户名称, 产品代号, 产品名称, 销售订单号')
-            ->where('产品代号', $productCode) // 根据产品代号查询
-            ->where('YEAR(sys_rq)', $year)
-            ->order('sys_rq ASC')
+            ->field('Gy0_gdbh as 工单编号, 订单数量, 入仓日期, 实际投料, 入仓数量, 客户代号, 客户名称, 产品代号, 产品名称, 销售订单号')
+            ->where('产品代号', $productCode)
+            ->where('YEAR(入仓日期)', $year)
+            ->order('入仓日期','desc')
             ->select();
 
         if (empty($qualityData)) {
             $this->success('该产品无质量考核数据', []);
         }
 
-        // 2. 按月份分组累计数据
+        // 2. 先按工单去重,每个工单只取一条记录
+        $uniqueByGongdan = [];
+        foreach ($qualityData as $data) {
+            $gdbh = $data['工单编号'];
+            if (!isset($uniqueByGongdan[$gdbh])) {
+                $uniqueByGongdan[$gdbh] = $data;
+            }
+        }
+
+        // 3. 按月份分组累计数据
         $monthlyData = [];
         $monthNames = [
             1 => '1月', 2 => '2月', 3 => '3月', 4 => '4月',
@@ -923,19 +947,18 @@ class  Achievementatestatistics extends Api
             9 => '9月', 10 => '10月', 11 => '11月', 12 => '12月'
         ];
 
-        foreach ($qualityData as $data) {
-            $sysRq = $data['sys_rq'];
+        foreach ($uniqueByGongdan as $gdbh => $data) {
+            $sysRq = $data['入仓日期'];
             $month = date('n', strtotime($sysRq)); // 1-12 的月份数字
 
             // 初始化月份数据
             if (!isset($monthlyData[$month])) {
                 $monthlyData[$month] = [
-                    'sys_rq' => substr($data['sys_rq'], 0, 10),
-                    '工单编号' => $data['工单编号'],
                     '月份' => $monthNames[$month],
                     '订单数量' => 0,
                     '实际投料' => 0,
                     '入仓数量' => 0,
+                    '入仓日期' => $data['入仓日期'],
                     '客户代号' => $data['客户代号'],
                     '客户名称' => $data['客户名称'],
                     '产品代号' => $data['产品代号'],
@@ -944,15 +967,17 @@ class  Achievementatestatistics extends Api
                 ];
             }
 
-            // 累计相加(实际投料乘以10000)
-            $monthlyData[$month]['订单数量'] = floatval($data['订单数量']);
-            $monthlyData[$month]['实际投料'] = round(floatval($data['实际投料']) * 10000);
-            $monthlyData[$month]['入仓数量'] = floatval($data['入仓数量']);
+            $monthlyData[$month]['订单数量'] += round($data['订单数量'] * 10000);
+            $monthlyData[$month]['实际投料'] += round($data['实际投料'] * 10000);
+            $monthlyData[$month]['入仓数量'] += round($data['入仓数量']);
+
+            // 记录工单编号
+            $monthlyData[$month]['工单编号'][] = $data['工单编号'];
         }
 
-        // 3. 计算每个月的实际合格率
+        // 4. 计算每个月的实际合格率并整理结果
         $detailList = [];
-        foreach ($monthlyData as $monthData) {
+        foreach ($monthlyData as $month => $monthData) {
             // 计算实际合格率
             $actualRate = '-';
             if ($monthData['实际投料'] > 0) {
@@ -963,10 +988,9 @@ class  Achievementatestatistics extends Api
                 $actualRate = '0%';
             }
 
-            $detailList[] = [
-                'sys_rq' => $monthData['sys_rq'],
-                '工单编号' => $monthData['工单编号'],
-                '日期' => $monthData['月份'], // 这里显示月份名称
+            $detailList[$month] = [
+                '日期' => $monthData['月份'],
+                '入仓日期' => substr($monthData['入仓日期'], 0, 10),
                 '订单数量' => $monthData['订单数量'],
                 '实际投料' => $monthData['实际投料'],
                 '入仓数量' => $monthData['入仓数量'],
@@ -975,13 +999,11 @@ class  Achievementatestatistics extends Api
                 '客户名称' => $monthData['客户名称'],
                 '产品代号' => $monthData['产品代号'],
                 '产品名称' => $monthData['产品名称'],
-                '销售订单号' => $monthData['销售订单号']
+                '销售订单号' => $monthData['销售订单号'],
+                '工单编号' => implode(', ', $monthData['工单编号'])
             ];
         }
 
-        // 按月份排序
-        ksort($detailList);
-
         $this->success('成功', array_values($detailList));
     }