unknown 8 месяцев назад
Родитель
Сommit
8e170efe95
1 измененных файлов с 185 добавлено и 89 удалено
  1. 185 89
      application/api/controller/Decision.php

+ 185 - 89
application/api/controller/Decision.php

@@ -426,6 +426,129 @@ class Decision extends Api
      * @throws \think\db\exception\ModelNotFoundException
      * @throws \think\exception\DbException
      */
+//    public function ProcessOutputRate()
+//    {
+//        if (!$this->request->isGet()) {
+//            $this->error('请求错误');
+//        }
+//
+//        $param = $this->request->param();
+//        if (empty($param)) {
+//            $this->error('参数错误');
+//        }
+//
+//        // 工序分类
+////        $processOrder = [
+////            1 => ['name' => '胶印', 'keys' => ['胶印', '上光']],
+////            2 => ['name' => '卷凹', 'keys' => ['卷凹']],
+////            3 => ['name' => '圆烫', 'keys' => ['圆烫']],
+////            4 => ['name' => '圆切', 'keys' => ['圆切']],
+////            5 => ['name' => '烫模', 'keys' => ['烫金', '模切', '凹凸']],
+////            6 => ['name' => '丝印', 'keys' => ['丝印']],
+////            7 => ['name' => '喷码', 'keys' => ['喷码']],
+////            8 => ['name' => '单凹', 'keys' => ['单凹']],
+////            9 => ['name' => '覆膜', 'keys' => ['覆膜']]
+////        ];
+//        $sist = ['胶印车间','凹丝印车间','印后车间','检验车间'];
+//        $processOrder= \db('设备_基本资料')
+//            ->whereNotNull('设备编组')
+//            ->whereIn('使用部门',$sist)
+//            ->group('设备编组')
+//            ->column('rtrim(设备编组) as 设备编组');
+//
+//
+//        // 获取存在数据的月份
+//        $monthsWithData = \db('工单_质量考核汇总')
+//            ->where('sys_ny', 'like', $param['year'] . '%')
+//            ->column('distinct(sys_ny) as month');
+//
+//        // 初始化结果数组,按工序名称归类
+//        $result = [];
+//        foreach ($processOrder as $processId => $process) {
+//            $result[substr($process, 5, 6)] = [
+//                '01月' => '',
+//                '02月' => '',
+//                '03月' => '',
+//                '04月' => '',
+//                '05月' => '',
+//                '06月' => '',
+//                '07月' => '',
+//                '08月' => '',
+//                '09月' => '',
+//                '10月' => '',
+//                '11月' => '',
+//                '12月' => '',
+//                '平均值' => '0.00%'
+//            ];
+//        }
+//
+//        // 遍历每个月份
+//        foreach ($monthsWithData as $month) {
+//            foreach ($processOrder as $processId => $process) {
+//                // 查询该月份该工序的合格率数据
+//                $query = \db('工单_质量考核汇总')
+//                    ->alias('a')
+//                    ->join('工单_工艺资料 b', 'a.Gy0_gdbh = b.Gy0_gdbh AND a.印件及工序 = b.Gy0_yjno AND a.工序 = b.Gy0_gxh')
+//                    ->join('工单_印件资料 c', 'a.Gy0_gdbh = c.Yj_Gdbh AND a.印件及工序 = c.yj_Yjno')
+//                    ->join('成品入仓 d', 'a.Gy0_gdbh = d.jjcp_gdbh AND a.印件及工序 = d.jjcp_yjno')
+//                    ->join('设备_基本资料 e','a.sczl_jtbh = e.设备编号')
+////                    ->field('a.sys_ny,(1 - ((SUM(a.班组制程废品) + SUM(a.班组质检废品)) / SUM(a.班组产量))) * 100 as 合格率')
+//                    ->field('a.sys_ny,SUM(a.班组制程废品)/a.联数 as 制程废品,SUM(a.班组质检废品)/a.联数 as 质检废品,SUM(a.班组产量)/a.联数 as 产量')
+//                    ->where('e.设备编组',$process)
+//                    ->where('d.jjcp_smb', 'like', '末%')
+//                    ->where('a.sys_ny', $month)
+//                    ->group('a.sys_ny,a.Gy0_gdbh,a.印件及工序,a.工序');
+////                    ->group('a.sys_ny');
+//
+//                $res = $query->select();
+//                $data = ['sys_ny'=>'','制程废品'=>0, '质检废品'=>0, '产量'=>0];
+//                foreach ($res as $value) {
+//                    $data['sys_ny'] = $value['sys_ny'];
+//                    $data['制程废品'] += $value['制程废品'];
+//                    $data['质检废品'] += $value['质检废品'];
+//                    $data['产量'] += $value['产量'];
+//                }
+//                $records = [
+//                    'sys_ny' => $data['sys_ny'],
+//                    '合格率' => (1-(($data['制程废品']+$data['质检废品'])/$data['产量']))* 100
+//                ];
+////                halt($records);
+//                if (!empty($records)) {
+//                    $monthName = substr($month, 4, 2) . '月';
+//                    $result[substr($process, 5, 6)][$monthName] = sprintf("%.2f%%", $records['合格率']);
+//                }
+//            }
+//        }
+//
+//        // 计算年度平均值
+//        foreach ($result as $processName => &$processData) {
+//            $totalAnnual = 0;
+//            $monthCount = 0;
+//
+//            foreach ($processData as $month => $rate) {
+//                if ($month !== '平均值' && $rate !== '') {
+//                    $totalAnnual += floatval(str_replace('%', '', $rate));
+//                    $monthCount++;
+//                }
+//            }
+//
+//            if ($monthCount > 0) {
+//                $processData['平均值'] = sprintf("%.2f%%", $totalAnnual / $monthCount);
+//            }
+//        }
+//        unset($processData); // 关键修复:解除引用
+//
+//        // 转换为目标格式
+//        $formattedData = [];
+//        foreach ($result as $processName => $processData) {
+//            // 现在processData是独立值
+//            $formattedRow = array_merge(['工序类型' => $processName], $processData);
+//            $formattedData[] = $formattedRow;
+//        }
+//        // 返回JSON响应
+//       $this->success('成功',$formattedData);
+//    }
+
     public function ProcessOutputRate()
     {
         if (!$this->request->isGet()) {
@@ -433,113 +556,87 @@ class Decision extends Api
         }
 
         $param = $this->request->param();
-        if (empty($param)) {
+        if (empty($param) || empty($param['year'])) {
             $this->error('参数错误');
         }
 
-        // 工序分类
-//        $processOrder = [
-//            1 => ['name' => '胶印', 'keys' => ['胶印', '上光']],
-//            2 => ['name' => '卷凹', 'keys' => ['卷凹']],
-//            3 => ['name' => '圆烫', 'keys' => ['圆烫']],
-//            4 => ['name' => '圆切', 'keys' => ['圆切']],
-//            5 => ['name' => '烫模', 'keys' => ['烫金', '模切', '凹凸']],
-//            6 => ['name' => '丝印', 'keys' => ['丝印']],
-//            7 => ['name' => '喷码', 'keys' => ['喷码']],
-//            8 => ['name' => '单凹', 'keys' => ['单凹']],
-//            9 => ['name' => '覆膜', 'keys' => ['覆膜']]
-//        ];
+        // 1. 获取设备分组,作为工序依据
         $sist = ['胶印车间','凹丝印车间','印后车间','检验车间'];
-        $processOrder= \db('设备_基本资料')
+        $processOrder = \db('设备_基本资料')
             ->whereNotNull('设备编组')
-            ->whereIn('使用部门',$sist)
+            ->whereIn('使用部门', $sist)
             ->group('设备编组')
-            ->column('rtrim(设备编组) as 设备编组');
-
-
-        // 获取存在数据的月份
-        $monthsWithData = \db('工单_质量考核汇总')
-            ->where('sys_ny', 'like', $param['year'] . '%')
-            ->column('distinct(sys_ny) as month');
-
-        // 初始化结果数组,按工序名称归类
-        $result = [];
-        foreach ($processOrder as $processId => $process) {
-            $result[substr($process, 5, 6)] = [
-                '01月' => '',
-                '02月' => '',
-                '03月' => '',
-                '04月' => '',
-                '05月' => '',
-                '06月' => '',
-                '07月' => '',
-                '08月' => '',
-                '09月' => '',
-                '10月' => '',
-                '11月' => '',
-                '12月' => '',
-                '平均值' => '0.00%'
-            ];
+            ->column('RTRIM(设备编组) as 设备编组');
+        if (empty($processOrder)) {
+            $this->success('成功', []); // 没有设备直接返回
         }
 
-        // 遍历每个月份
-        foreach ($monthsWithData as $month) {
-            foreach ($processOrder as $processId => $process) {
-                // 查询该月份该工序的合格率数据
-                $query = \db('工单_质量考核汇总')
-                    ->alias('a')
-                    ->join('工单_工艺资料 b', 'a.Gy0_gdbh = b.Gy0_gdbh AND a.印件及工序 = b.Gy0_yjno AND a.工序 = b.Gy0_gxh')
-                    ->join('工单_印件资料 c', 'a.Gy0_gdbh = c.Yj_Gdbh AND a.印件及工序 = c.yj_Yjno')
-                    ->join('成品入仓 d', 'a.Gy0_gdbh = d.jjcp_gdbh AND a.印件及工序 = d.jjcp_yjno')
-                    ->join('设备_基本资料 e','a.sczl_jtbh = e.设备编号')
-                    ->field('a.sys_ny,   
-                        (1 - ((SUM(a.班组制程废品) + SUM(a.班组质检废品)) / SUM(a.班组产量))) * 100 as 合格率')
-//                    ->where(function ($query) use ($process) {
-//                        foreach ($process as $key) {
-//                            $query->whereOr('b.Gy0_gxmc', 'like', "%{$key}%");
-//                        }
-//                    })
-                    ->where('e.设备编组',$process)
-                    ->where('d.jjcp_smb', 'like', '末%')
-                    ->where('a.sys_ny', $month)
-                    ->group('a.sys_ny');
-
-                $records = $query->select();
-
-                if (!empty($records)) {
-                    $monthName = substr($month, 4, 2) . '月';
-                    $result[substr($process, 5, 6)][$monthName] = sprintf("%.2f%%", $records[0]['合格率']);
-                }
+        // 2. 初始化结果数组(按工序)
+        $result = [];
+        foreach ($processOrder as $process) {
+            $key = substr($process, 5, 6);
+            $result[$key] = [];
+            for ($i = 1; $i <= 12; $i++) {
+                $result[$key][str_pad($i, 2, '0', STR_PAD_LEFT) . '月'] = '';
             }
+            $result[$key]['平均值'] = '0.00%';
         }
 
-        // 计算年度平均值
-        foreach ($result as $processName => &$processData) {
-            $totalAnnual = 0;
-            $monthCount = 0;
+        // 3. 汇总所有年份内数据,一次查出所有“工序-月份”数据,避免嵌套多次SQL
+        $dataList = \db('工单_质量考核汇总')
+            ->alias('a')
+            ->join('工单_工艺资料 b', 'a.Gy0_gdbh = b.Gy0_gdbh AND a.印件及工序 = b.Gy0_yjno AND a.工序 = b.Gy0_gxh')
+            ->join('工单_印件资料 c', 'a.Gy0_gdbh = c.Yj_Gdbh AND a.印件及工序 = c.yj_Yjno')
+            ->join('成品入仓 d', 'a.Gy0_gdbh = d.jjcp_gdbh AND a.印件及工序 = d.jjcp_yjno')
+            ->join('设备_基本资料 e', 'a.sczl_jtbh = e.设备编号')
+            ->whereIn('e.设备编组', $processOrder)
+            ->where('d.jjcp_smb', 'like', '末%')
+            ->where('a.sys_ny', 'like', $param['year'] . '%')
+            ->field([
+                'e.设备编组',
+                'a.sys_ny',
+                'SUM(a.班组制程废品) / a.联数 AS 制程废品',
+                'SUM(a.班组质检废品) / a.联数 AS 质检废品',
+                'SUM(a.班组产量) / a.联数 AS 产量'
+            ])
+            ->group('e.设备编组, a.sys_ny')
+            ->select();
+
+        // 4. 处理统计数据,填充到$result
+        $annual = []; // 年均合格率累加用
+        foreach ($dataList as $item) {
+            $processKey = substr($item['设备编组'], 5, 6);
+            $monthKey = substr($item['sys_ny'], 4, 2) . '月';
 
-            foreach ($processData as $month => $rate) {
-                if ($month !== '平均值' && $rate !== '') {
-                    $totalAnnual += floatval(str_replace('%', '', $rate));
-                    $monthCount++;
-                }
+            $output = floatval($item['产量']);
+            $waste = floatval($item['制程废品']) + floatval($item['质检废品']);
+            $rate = $output > 0 ? (1 - $waste / $output) * 100 : 0;
+
+            $result[$processKey][$monthKey] = sprintf('%.2f%%', $rate);
+
+            if (!isset($annual[$processKey])) {
+                $annual[$processKey] = ['sum' => 0, 'count' => 0];
             }
+            $annual[$processKey]['sum'] += $rate;
+            $annual[$processKey]['count']++;
+        }
 
-            if ($monthCount > 0) {
-                $processData['平均值'] = sprintf("%.2f%%", $totalAnnual / $monthCount);
+        // 5. 补充“平均值”
+        foreach ($annual as $processKey => $v) {
+            if ($v['count'] > 0) {
+                $result[$processKey]['平均值'] = sprintf('%.2f%%', $v['sum']/$v['count']);
             }
         }
-        unset($processData); // 关键修复:解除引用
 
-        // 转换为目标格式
+        // 6. 转换为前端需要的格式
         $formattedData = [];
-        foreach ($result as $processName => $processData) {
-            // 现在processData是独立值
-            $formattedRow = array_merge(['工序类型' => $processName], $processData);
-            $formattedData[] = $formattedRow;
+        foreach ($result as $process => $data) {
+            $row = array_merge(['工序类型' => $process], $data);
+            $formattedData[] = $row;
         }
-        // 返回JSON响应
-       $this->success('成功',$formattedData);
+
+        // 7. 返回
+        $this->success('成功', $formattedData);
     }
     /**
      * 获取年分数据
@@ -644,7 +741,6 @@ class Decision extends Api
                     continue 2;
                 }
             }
-            // 未匹配的条目将被丢弃
         }
 
         // 按分类ID排序