Browse Source

优化接口

liuhairui 1 year ago
parent
commit
8ec0947d8a

+ 1 - 1
application/api/controller/Manufacture.php

@@ -1320,7 +1320,7 @@ class Manufacture extends Api
             ->where('c.sczl_rq', '<=', $endDate)
             ->field('
             c.订单编号, c.款号 as 生产款号, j.款式, j.客户编号, j.订单数量,
-            LEFT(j.落货日期, 10) as 落货日期,j.工单入仓数量 as 工单完工数量,j.订单数量
+            LEFT(j.落货日期, 10) as 落货日期,j.工单入仓数量 as 工单完工数量,j.订单数量,
             c.sczl_rq as 创建时间, j.gd_statu as 工单状态
         ')
             ->group('c.订单编号')

+ 212 - 0
application/api/controller/SubWorkorderStatus.php

@@ -0,0 +1,212 @@
+<?php
+
+namespace app\api\controller;
+
+
+use app\common\controller\Api;
+use think\Config;
+use think\Db;
+use think\Request;
+
+
+
+/**
+ * 工单资料管理
+ */
+class SubWorkorderStatus extends Api
+{
+    protected $noNeedLogin = ['*'];
+    protected $noNeedRight = ['*'];
+
+
+    public function _initialize()
+    {
+
+        if (isset($_SERVER['HTTP_ORIGIN'])) {
+            header('Access-Control-Expose-Headers: __token__');//跨域让客户端获取到
+        }
+        //跨域检测
+        check_cors_request();
+
+        if (!isset($_COOKIE['PHPSESSID'])) {
+            Config::set('session.id', $this->request->server("HTTP_SID"));
+        }
+        parent::_initialize();
+    }
+
+    /**
+     * 子订单状态查询
+     * @return void
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function SubWorkOrderStatusList()
+    {
+        // 验证请求类型是否为 GET
+        if ($this->request->isGet() === false) {
+            $this->error('请求错误');
+        }
+
+        // 获取请求参数并验证
+        $param = $this->request->param();
+        if (empty($param)) {
+            $this->error('参数错误');
+        }
+
+        // 提取子订单编号的前12位作为色系ID
+        $colour_id = substr($param['order'], 0, 12);
+
+        // 获取订单尺码信息
+        $where['Mod_rq'] = null;
+        $xhdata = \db('工单_印件资料')
+            ->where('子订单编号', $param['order'])
+            ->where($where)
+            ->field('cm1,cm2,cm3,cm4,cm5,cm6,cm7,cm8,cm9,cm10')
+            ->select();
+
+        // 收集cm1到cm10的非空值并排序
+        $arr = [];
+        foreach ($xhdata as $value) {
+            for ($i = 1; $i <= 10; $i++) {
+                $cmValue = $value['cm' . $i] ?? null;
+                if (!empty($cmValue)) {
+                    $arr[] = $cmValue;
+                }
+            }
+        }
+        $arr = array_unique($arr); // 去重
+        sort($arr); // 排序
+
+        // 获取工单详细资料
+        $workOrderData = \db('工单_印件资料')
+            ->alias('a')
+            ->join('工单_基本资料 b', 'a.订单编号 = b.订单编号')
+            ->where('a.子订单编号', $param['order'])
+            ->where('a.Mod_rq', null)
+            ->field('a.订单编号,a.子订单编号,a.款号,b.款式,b.客户编号,a.zdtotal,
+            cm1,cm2,cm3,cm4,cm5,cm6,cm7,cm8,cm9,cm10,
+            cmsl1,cmsl2,cmsl3,cmsl4,cmsl5,cmsl6,cmsl7,cmsl8,cmsl9,cmsl10')
+            ->find();
+
+        // 初始化制单数据
+        $result = [
+            '工序名称' => '制单',
+            'total' => ' ',
+            '制单数' => $workOrderData['zdtotal'] ?? 0
+        ];
+
+        // 处理cm1到cm10和对应的cmsl1到cmsl10数据
+        for ($i = 1; $i <= 10; $i++) {
+            $cmKey = 'cm' . $i;
+            $cmslKey = 'cmsl' . $i;
+            if (!empty($workOrderData[$cmKey])) {
+                $result[$workOrderData[$cmKey]] = (int)($workOrderData[$cmslKey] ?? 0);
+            }
+        }
+
+        // 定义工序名称
+        $processes = ['裁剪', '车缝', '手工', '大烫', '总检', '包装'];
+
+        // 获取设备产量数据
+        $list = \db('设备_产量计酬')
+            ->where('子订单编号', 'like', $colour_id . '%')
+            ->where('mod_rq', null)
+            ->select();
+
+        $data['data'] = [];
+        array_unshift($data['data'], $result); // 将制单数据放在第一个位置
+        // 获取色系的制单总数
+//        $total = \db('工单_印件资料')
+//            ->where('子订单编号', 'like', $colour_id . '%')
+//            ->column('sum(zdtotal)');
+        // 处理各工序数据
+        foreach ($processes as $process) {
+            $res = array_fill_keys($arr, 0); // 初始化每个尺码为0
+            foreach ($list as $value) {
+                if ($value['工序名称'] === $process) {
+                    $quantity = ($process === '裁剪' || $process === '车缝')
+                        ? $value['数量']
+                        : $value['s_num'];
+
+                    // 更新对应尺码的数据
+                    if (array_key_exists($value['尺码'], $res)) {
+                        $res[$value['尺码']] += $quantity;
+                    }
+                }
+            }
+            // 计算总量并设置工序信息
+            $res['total'] = array_sum($res);
+            $res['工序名称'] = $process;
+//            $res['制单数'] = $total[0];
+            $data['data'][] = $res;
+        }
+
+
+
+// 计算完成百分比
+        foreach ($data['data'] as $key => $value) {
+
+            // 如果工序名称是“制单”,则直接将 scale 设置为空
+            if ($value['工序名称'] === '制单') {
+                $data['data'][$key]['scale'] = '';
+                continue; // 跳过当前循环
+            }
+
+            // 其他工序正常计算百分比
+            $data['data'][$key]['scale'] = $workOrderData['zdtotal'] > 0
+                ? number_format(($value['total'] / $workOrderData['zdtotal']) * 100, 2) . '%'
+                : '0%';
+        }
+
+
+        // 输出整理后的数据
+        $data['arr'] = $arr;
+        $data['workOrderData'] = $workOrderData;
+
+        $this->success('成功', $data);
+    }
+
+    /**
+     * 码包号接口
+     * @return void
+     */
+    public function Mabaolist()
+    {
+        if ($this->request->isGet() === false){
+            $this->error('参数错误');
+        }
+        $param = $this->request->param();
+        if (empty($param)){
+            $this->error('参数错误');
+        }
+        if($param['process'] === ''){
+            $param['process'] = '车缝';
+        }
+        //车缝码包号
+        $chefeng  = \db('设备_产量计酬')
+//            ->where('子订单编号','like',substr($param['order'],0,12).'%')
+            ->where('子订单编号',$param['order'])
+            ->where('工序名称','车缝')
+            ->column('serial');
+        //查询工序码包号
+        $complete = \db('设备_产量计酬')
+//            ->where('子订单编号','like',substr($param['order'],0,12).'%')
+            ->where('子订单编号',$param['order'])
+            ->where('工序名称',$param['process'])
+            ->where('mod_rq',null)
+            ->column('serial');
+        //查询删除码包号
+        $delete = \db('设备_产量计酬')
+//            ->where('子订单编号','like',substr($param['order'],0,12).'%')
+            ->where('子订单编号',$param['order'])
+            ->where('工序名称','车缝')
+            ->whereNotNull('mod_rq')
+            ->column('serial');
+        $delete = array_unique($delete);
+        $data['chefeng'] = $chefeng;
+        $data['complete'] = $complete;
+        $data['delete'] = $delete;
+        $this->success('成功',$data);
+    }
+}

+ 357 - 239
application/api/controller/WorkOrder.php

@@ -1411,47 +1411,61 @@ class WorkOrder extends Api
      * 2.接口接受数据文件进行保存xlsx文件以及pdf转换
      * 3.前端进行预览pdf图片显示文件中的内容再页面上
      */
-
-
-
     public function gdAnnexAdd() {
+        ini_set('display_errors', 'On');
+        ini_set('error_reporting', E_ALL);
+
         if (!$this->request->isPost()) {
             $this->error('请求方式错误');
         }
+
         // 获取请求参数
         $req = $this->request->param();
         $relateId = $req['关联编号'];
         $attachmentContent = $req['附件内容'];
-        $uploadDir = 'uploads/' . date('Ymd') . '/' . $relateId;
+        $attachmentType = $req['附件类型'];
+        $prefixDir = ROOT_PATH . '/public/';
+        $uploadDir = ''.'uploads/' . date('Ymd') . '/' . $relateId;
+
         // 检查并创建目录
-        if (!is_dir($uploadDir)) {
-            mkdir($uploadDir, 0777, true);
+        if (!is_dir($prefixDir . $uploadDir)) {
+            mkdir($prefixDir . $uploadDir, 0777, true);
         }
+
         // 处理 Base64 附件内容
         if (strpos($attachmentContent, 'base64,') !== false) {
             $attachmentContent = explode('base64,', $attachmentContent)[1];
         }
         $fileContent = base64_decode($attachmentContent);
-        // 创建并写入 Excel 文件
-        $xlsxFilePath = $uploadDir . '/' . time() . '.xlsx';
-        file_put_contents($xlsxFilePath, $fileContent);
-        // 加载 Excel 文件
-        $spreadsheet = IOFactory::load($xlsxFilePath);
-        $pdfPaths = '';
-
-        // 转换每个工作表到 PDF
-        foreach ($spreadsheet->getAllSheets() as $index => $sheet) {
-            // 为每个工作表创建单独的 PDF 文件
-            $pdfSpreadsheet = new Spreadsheet();
-            $pdfSpreadsheet->addExternalSheet($sheet);
-
-            // 设置 PDF 写入器
-            $pdfWriter = new Tcpdf($pdfSpreadsheet);
-            $pdfOutputPath = $uploadDir . '/' . time() . ($index + 1) . '.pdf';
+        $filename = time();
+
+        // 初始化文件路径变量
+        $xlsxFilePath = '';
+        $pdfFilePath = '';
 
+        if ($attachmentType === 'pdf') {
             // 保存 PDF 文件
-            $pdfWriter->save($pdfOutputPath);
-            $pdfPaths .= $pdfOutputPath . ',';  // 将 PDF 文件路径添加到 pdfPaths
+            $pdfFilePath = $uploadDir . '/' . $filename . '.pdf';
+            file_put_contents($prefixDir . $pdfFilePath, $fileContent);
+        } elseif ($attachmentType === 'xlsx') {
+            // 保存 Excel 文件
+            $xlsxFilePath = $uploadDir . '/' . $filename . '.xlsx';
+            file_put_contents($prefixDir . $xlsxFilePath, $fileContent);
+
+            // 转换为 PDF 文件
+            $pdfFilePath = $uploadDir . '/' . $filename . '.pdf';
+            $cmd = sprintf(
+                'libreoffice --headless --convert-to pdf --outdir %s %s',
+                escapeshellarg($prefixDir . $uploadDir),
+                escapeshellarg($prefixDir . $xlsxFilePath)
+            );
+            exec($cmd, $out, $retval);
+
+            if ($retval !== 0) {
+                $this->error('Excel 转 PDF 失败');
+            }
+        } else {
+            $this->error('不支持的附件类型');
         }
 
         // 组织数据
@@ -1459,10 +1473,10 @@ class WorkOrder extends Api
             '关联编号' => $relateId,
             'sys_id' => $req['sys_id'],
             '附件备注' => $req['附件备注'],
-            '附件类型' => $req['附件类型'],
+            '附件类型' => $attachmentType,
             'sys_rq' => date('Y-m-d H:i:s'),
-            'url' => $xlsxFilePath,  // 保存xlsx文件路径
-            'pdf' => rtrim($pdfPaths, ',')  // 保存pdf文件路径
+            'url' => $xlsxFilePath,  // 保存 xlsx 文件路径(如果存在)
+            'pdf' => $pdfFilePath  // 保存 pdf 文件路径
         ];
 
         // 数据库事务处理
@@ -1485,6 +1499,70 @@ class WorkOrder extends Api
         $this->success('成功');
     }
 
+//    public function gdAnnexAdd() {
+//        ini_set('display_errors','On');
+//        ini_set('error_reporting',E_ALL);
+//        if (!$this->request->isPost()) {
+//            $this->error('请求方式错误');
+//        }
+//        // 获取请求参数
+//        $req = $this->request->param();
+//        $relateId = $req['关联编号'];
+//        $attachmentContent = $req['附件内容'];
+//        $prefixDir = ROOT_PATH .'/public/';
+//        $uploadDir = 'uploads/' . date('Ymd') . '/' . $relateId;
+//
+//            // 检查并创建目录
+//            if (!is_dir($uploadDir)) {
+//                mkdir($uploadDir, 0777, true);
+//            }
+//            // 处理 Base64 附件内容
+//            if (strpos($attachmentContent, 'base64,') !== false) {
+//                $attachmentContent = explode('base64,', $attachmentContent)[1];
+//            }
+//            $fileContent = base64_decode($attachmentContent);
+//            $filename = time() ;
+//            // 创建并写入 Excel 文件
+//            $xlsxFilePath = $uploadDir . '/' . $filename . '.xlsx';
+//            file_put_contents($prefixDir.$xlsxFilePath, $fileContent);
+//            $str = $xlsxFilePath;
+//            $out = $retval = null;
+//            $outfile = $uploadDir . '/' .  $filename . '.pdf';
+//            $res = exec(sprintf('libreoffice --headless --convert-to pdf --outdir %s %s',($prefixDir.$uploadDir), $str), $out,$retval);
+//
+//
+//        // var_dump($retval);exit;
+//        // 组织数据
+//        $data = [
+//            '关联编号' => $relateId,
+//            'sys_id' => $req['sys_id'],
+//            '附件备注' => $req['附件备注'],
+//            '附件类型' => $req['附件类型'],
+//            'sys_rq' => date('Y-m-d H:i:s'),
+//            'url' => $xlsxFilePath,  // 保存xlsx文件路径
+//            'pdf' => $outfile  // 保存pdf文件路径
+//        ];
+//
+//        // 数据库事务处理
+//        db()->startTrans();
+//        try {
+//            // 插入数据
+//            $sql = db('工单_相关附件')->fetchSql(true)->insert($data);
+//            $result = db()->query($sql);
+//            db()->commit();
+//        } catch (\Exception $e) {
+//            // 回滚事务
+//            db()->rollback();
+//            $this->error($e->getMessage());
+//        }
+//
+//        if ($result === false) {
+//            $this->error('失败');
+//        }
+//
+//        $this->success('成功');
+//    }
+
 
 
 
@@ -2051,20 +2129,45 @@ class WorkOrder extends Api
         $list = \db('工单_基本资料')
             ->where('订单编号',$param['order'])
             ->where($where)
-            ->field('订单编号,img,生产款号,客户编号,款式,落货日期,箱唛要求,面料,船样描述,船样合计,粘衬,订单数量,审核,审核日期,要求')
+            ->field('订单编号,img,生产款号,客户编号,款式,落货日期,箱唛要求,面料,船样描述,船样合计,粘衬,订单数量,审核,审核日期,要求,water')
             ->find();
 
         //尺码表格表头
-        $xhdata = \db('工单_印件资料')->where('订单编号',$param['order'])->where($where)->select();
+        $xhdata = \db('工单_印件资料')->where('订单编号', $param['order'])->where($where)->select();
         $arr = [];
-        foreach ($xhdata as $key => $value){
-            for($i=1;$i<=10;$i++){
-                if ($value['cm'.$i] !== '' && $value['cm'.$i] !== null){
-                    array_push($arr,$value['cm'.$i]);
+        foreach ($xhdata as $key => $value) {
+            for ($i = 1; $i <= 10; $i++) {
+                if ($value['cm' . $i] !== '' && $value['cm' . $i] !== null) {
+                    array_push($arr, $value['cm' . $i]);
                 }
             }
         }
+
+// 去重并重新索引
         $arr = array_unique($arr);
+        $arr = array_values($arr);
+
+// 自定义排序函数
+        usort($arr, function($a, $b) {
+            // 判断是否为数字
+            $isNumericA = is_numeric($a);
+            $isNumericB = is_numeric($b);
+
+            if ($isNumericA && $isNumericB) {
+                // 如果都是数字,按从小到大排序
+                return $a - $b;
+            } elseif (!$isNumericA && !$isNumericB) {
+                // 如果都是字母,按字母顺序排序(可以自定义顺序)
+                $sizeOrder = ['XXS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', 'XXXL'];
+                $posA = array_search($a, $sizeOrder);
+                $posB = array_search($b, $sizeOrder);
+                return $posA - $posB;
+            } else {
+                // 如果一个是数字一个是字母,数字排在前
+                return $isNumericA ? -1 : 1;
+            }
+        });
+
 
         //打印table数据表格
         $porlis = \db('工单_印件资料')
@@ -2073,79 +2176,6 @@ class WorkOrder extends Api
             ->where($where)
             ->field('子订单编号')
             ->select();
-        $count = count($porlis);
-
-        if($count == 1 || $count == 2 || $count == 3){
-            // 查询船样为0的数据
-            $processlist = \db('工单_印件资料')
-                ->where('订单编号', $param['order'])
-                ->where($where)
-                ->where('船样', 0)
-                ->select();
-            foreach ($processlist as $key => $value) {
-                // 将尺码和对应的数量从 cm1-cm10 和 cmsl1-cmsl10 转换为动态键值对
-                for ($i = 1; $i <= 10; $i++) {
-                    if ($value['cm' . $i] !== '' && $value['cm' . $i] !== null) {
-                        $processlist[$key][$value['cm' . $i]] = $value['cmsl' . $i];
-                    }
-                    // 移除原始的 cm 和 cmsl 字段
-                    unset($processlist[$key]['cm' . $i], $processlist[$key]['cmsl' . $i]);
-                }
-                // 添加条码字段,值为子订单编号
-                $processlist[$key]['条码'] = $value['子订单编号'];
-            }
-            // 查询船样为1的数据
-            $chuanyang = \db('工单_印件资料')
-                ->where('订单编号', $param['order'])
-                ->where($where)
-                ->where('船样', 1)
-                ->select();
-            foreach ($chuanyang as $key => $value) {
-                // 将尺码和对应的数量从 cm1-cm10 和 cmsl1-cmsl10 转换为动态键值对
-                for ($i = 1; $i <= 10; $i++) {
-                    if ($value['cm' . $i] !== '' && $value['cm' . $i] !== null) {
-                        $chuanyang[$key][$value['cm' . $i]] = $value['cmsl' . $i];
-                    }
-                    unset($chuanyang[$key]['cm' . $i], $chuanyang[$key]['cmsl' . $i]);
-                }
-                $chuanyang[$key]['条码'] = $value['子订单编号'];
-            }
-            $counthz = \db('工单_印件资料')
-                ->where('订单编号', $param['order'])
-                ->where($where)
-                ->select();
-            // 初始化累计数组
-            $scslTotals = [
-                'cmsl1' => 0,
-                'cmsl2' => 0,
-                'cmsl3' => 0,
-                'cmsl4' => 0,
-                'cmsl5' => 0,
-                'cmsl6' => 0,
-                'cmsl7' => 0,
-                'cmsl8' => 0,
-                'cmsl9' => 0,
-                'cmsl10' => 0,
-                'zdtotal' => 0,
-            ];
-            // 遍历 $counthz 数组,将每行的 scsl1 到 scsl10 累加
-            foreach ($counthz as $item) {
-                for ($i = 1; $i <= 10; $i++) {
-                    $key = "cmsl{$i}";
-                    if (!empty($item[$key])) { // 检查是否有值
-                        $scslTotals[$key] += (int)$item[$key];
-                        $scslTotals['zdtotal'] += (int)$item[$key];
-                    }
-                }
-            }
-            $data['scslTotals'] = $scslTotals;
-            $data['process'] = array_merge($processlist, $chuanyang);
-            $data['order'] = $list;
-            $data['xhdata'] = $arr;
-            $this->success('成功', $data);
-        }
-
-
         //合并后的子订单条码数据
         $subOrder = $porlis[0]['子订单编号'];
         // 找到子订单编号中的 '-' 位置
@@ -2166,6 +2196,39 @@ class WorkOrder extends Api
                             cm1,cm2,cm3,cm4,cm5,cm6,cm7,cm8,cm9,cm10,
                             cmsl1,cmsl2,cmsl3,cmsl4,cmsl5,cmsl6,cmsl7,cmsl8,cmsl9,cmsl10,Uniqid')
                     ->select();
+
+                // 初始化汇总数组
+                $scslTotals = [
+                    "cmsl1" => 0,
+                    "cmsl2" => 0,
+                    "cmsl3" => 0,
+                    "cmsl4" => 0,
+                    "cmsl5" => 0,
+                    "cmsl6" => 0,
+                    "cmsl7" => 0,
+                    "cmsl8" => 0,
+                    "cmsl9" => 0,
+                    "cmsl10" => 0,
+                    "zdtotal" => 0, // 总计数量
+                ];
+                // 遍历数据集进行汇总
+                foreach ($processlist as $item) {
+                    // 遍历每个尺码字段(cmsl1 到 cmsl10)
+                    for ($i = 1; $i <= 10; $i++) {
+                        // 获取当前字段的数量
+                        $sizeQty = $item['cmsl' . $i];
+                        // 判断数量是否有效(非空且大于0)
+                        if (!empty($sizeQty)) {
+                            // 累加当前字段的数量
+                            $scslTotals['cmsl' . $i] += $sizeQty;
+                            // 累加到总计字段
+                            $scslTotals['zdtotal'] += $sizeQty;
+                        }
+                    }
+                }
+
+                $data['scslTotals'] = $scslTotals;
+
                 foreach ($processlist as $key => $value) {
                     // 将尺码和对应的数量从 cm1-cm10 和 cmsl1-cmsl10 转换为动态键值对
                     for ($i = 1; $i <= 10; $i++) {
@@ -2242,6 +2305,9 @@ class WorkOrder extends Api
                         $finalList[] = $mergedData[$key]; // 在组的尾部添加合并数据
                     }
                 }
+
+
+
                 // 将船样为1的数据添加到最终列表中
                 $finalList = array_merge($finalList, $chuanyang);
                 $data['process'] = $finalList;
@@ -2249,156 +2315,208 @@ class WorkOrder extends Api
                 $data['xhdata'] = $arr;
                 $this->success('成功',$data);
             } elseif (strlen($afterDash) == 4) {
-                // 获取印件资料
+
+//                if($list['water'] == 1){
+                // 查询非船样数据
+                // 获取数据
+//                $processlist = \db('工单_印件资料')
+//                    ->where('订单编号', $param['order'])
+//                    ->where($where)
+//                    ->where('船样', 0)
+//                    ->field('子订单编号,款号, color_id, 颜色, 颜色备注, zdtotal,船样, Uniqid,
+//             cm1, cm2, cm3, cm4, cm5, cm6, cm7, cm8, cm9, cm10,
+//             cmsl1, cmsl2, cmsl3, cmsl4, cmsl5, cmsl6, cmsl7, cmsl8, cmsl9, cmsl10')
+//                    ->select();
+//
+//// 格式化原始数据
+//                $formattedData = [];
+//                foreach ($processlist as $item) {
+//                    for ($i = 1; $i <= 10; $i++) {
+//                        if (!empty($item['cm' . $i])) {
+//                            $size = $item['cm' . $i];
+//                            $item[$size] = $item['cmsl' . $i]; // 动态映射尺码字段
+//                        }
+//                        unset($item['cm' . $i], $item['cmsl' . $i]); // 删除原始字段
+//                    }
+//                    $formattedData[] = $item;
+//                }
+//
+//// 合并数据逻辑
+//                $result = [];
+//                foreach ($formattedData as $item) {
+//                    $key = $item['color_id'] . '_' . $item['颜色备注'];
+//                    if (!isset($result[$key])) {
+//                        $result[$key] = $item;
+//                        $result[$key]['条码'] = $item['子订单编号']; // 初始化条码字段
+//                    } else {
+//                        foreach ($item as $size => $value) {
+//                            if (is_numeric($size)) {
+//                                $result[$key][$size] = ($result[$key][$size] ?? 0) + $value; // 累加尺码
+//                            }
+//                        }
+//                        $result[$key]['zdtotal'] += $item['zdtotal']; // 累加总数
+//                    }
+//                }
+//
+//// 按照合并逻辑插入合并数据
+//                $finalData = $formattedData; // 复制原始数据
+//                foreach ($result as $key => $mergeItem) {
+//                    foreach (array_reverse($finalData, true) as $index => $originalItem) {
+//                        if ($originalItem['color_id'] . '_' . $originalItem['颜色备注'] === $key) {
+//                            // 插入合并数据到最后一条记录之后
+//                            $finalData = array_merge(
+//                                array_slice($finalData, 0, $index + 1),
+//                                [$mergeItem],
+//                                array_slice($finalData, $index + 1)
+//                            );
+//                            break;
+//                        }
+//                    }
+//                }
+//
+//// 按 color_id 和 颜色备注 排序
+//                usort($finalData, function ($a, $b) {
+//                    // 按 color_id 排序
+//                    if ($a['color_id'] === $b['color_id']) {
+//                        // 如果 color_id 相同,按颜色备注排序
+//                        return strcmp($a['颜色备注'], $b['颜色备注']);
+//                    }
+//                    return strcmp($a['color_id'], $b['color_id']);
+//                });
+//
+//                // 查询船样为 1 的数据
+//                $chuanyang = \db('工单_印件资料')
+//                    ->where('订单编号', $param['order'])
+//                    ->where($where)
+//                    ->where('船样', 1)
+//                    ->field('子订单编号,款号, color_id, 颜色, 颜色备注, zdtotal,船样, Uniqid,
+//             cm1, cm2, cm3, cm4, cm5, cm6, cm7, cm8, cm9, cm10,
+//             cmsl1, cmsl2, cmsl3, cmsl4, cmsl5, cmsl6, cmsl7, cmsl8, cmsl9, cmsl10')
+//                    ->select();
+//
+//// 格式化船样数据// 格式化原始数据
+//                $chuanyangvval = [];
+//                foreach ($chuanyang as $item) {
+//                    for ($i = 1; $i <= 10; $i++) {
+//                        if (!empty($item['cm' . $i])) {
+//                            $size = $item['cm' . $i];
+//                            $item[$size] = $item['cmsl' . $i]; // 动态映射尺码字段
+//                        }
+//                        unset($item['cm' . $i], $item['cmsl' . $i]); // 删除原始字段
+//                    }
+//                    $item['条码'] = $item['子订单编号']; // 添加条码字段
+//
+//                    $chuanyangvval[] = $item;
+//                }
+//
+//                // 合并船样和非船样数据并去重
+//                $final = array_map('unserialize', array_unique(array_map('serialize', array_merge($finalData, $chuanyangvval))));
+//
+//                // 清理数据:对于船样为 0 的记录,删除子订单编号和颜色字段
+//                foreach ($final as &$item) {
+//                    if (isset($item['条码']) && $item['船样'] == 0) {
+//                        unset($item['子订单编号'], $item['颜色']);
+//                    }
+//                }
+//
+//                // 统计累积数据
+//                $counthz = \db('工单_印件资料')
+//                    ->where('订单编号', $param['order'])
+//                    ->where($where)
+//                    ->select();
+//
+//                // 初始化统计数组
+//                $scslTotals = [
+//                    'cmsl1' => 0, 'cmsl2' => 0, 'cmsl3' => 0, 'cmsl4' => 0, 'cmsl5' => 0,
+//                    'cmsl6' => 0, 'cmsl7' => 0, 'cmsl8' => 0, 'cmsl9' => 0, 'cmsl10' => 0,
+//                    'zdtotal' => 0,
+//                ];
+//
+//                // 累加统计尺码数量
+//                foreach ($counthz as $item) {
+//                    for ($i = 1; $i <= 10; $i++) {
+//                        $key = "cmsl{$i}";
+//                        $scslTotals[$key] += (int)($item[$key] ?? 0); // 累加每个尺码的数量
+//                    }
+//                }
+//                $scslTotals['zdtotal'] = array_sum(array_slice($scslTotals, 0, 10)); // 计算总数
+//                echo "<pre>";
+//                print_r($processlist);
+//                echo "<pre>";
+//                // 返回数据给前端
+//                $data['process'] = $processlist;
+//                $data['scslTotals'] = $scslTotals;//汇总数据集
+//                $data['order'] = $list;//表格数据
+//                $data['xhdata'] = $arr;//尺码表头
+//
+//                $this->success('成功', $data);
+//                }else{
+                    //一条子订单编号一个条码,统计颜色
                 $processlist = \db('工单_印件资料')
                     ->where('订单编号', $param['order'])
-                    ->where($where)
-                    ->where('船样', 0)
-                    ->field('子订单编号, 颜色, 款号, zdtotal, 颜色备注, color_id, 船样,
-             cm1, cm2, cm3, cm4, cm5, cm6, cm7, cm8, cm9, cm10,
-             cmsl1, cmsl2, cmsl3, cmsl4, cmsl5, cmsl6, cmsl7, cmsl8, cmsl9, cmsl10, Uniqid')
+                    ->whereNull('Mod_rq') // 查询未删除数据
                     ->select();
-
-                // 保存格式化后的数据
-                $formattedData = [];
-
-                // 遍历数据进行尺码转换并添加到输出数组
+                $table = [];
                 foreach ($processlist as $item) {
+                    // 当前子订单编号的数据
+                    $subOrder = [
+                        '颜色备注' => $item['颜色备注'],
+                        '色系名称' => $item['颜色'],
+                        '订单编号' => $item['订单编号'],
+                        '子订单编号' => $item['子订单编号'],
+                        '条码' => $item['子订单编号'],
+                        '款号' => $item['款号'],
+                    ];
+                    // 当前子订单编号的合计
+                    $subOrderTotal = 0;
                     for ($i = 1; $i <= 10; $i++) {
                         if (!empty($item['cm' . $i])) {
-                            $item[$item['cm' . $i]] = $item['cmsl' . $i];
-                        }
-                        unset($item['cm' . $i], $item['cmsl' . $i]);
-                    }
-                    $formattedData[] = $item;
-                }
-
-                // 用于存储每个 color_id 和颜色备注的合并数据
-                $mergedData = [];
-
-                // 进行合并
-                foreach ($formattedData as $item) {
-                    $key = $item['color_id'] . '|' . $item['颜色备注'];
-
-                    if (!isset($mergedData[$key])) {
-                        $mergedData[$key] = $item;
-                        $mergedData[$key]['条码'] = $item['子订单编号']; // 初始化条码
-                    } else {
-                        // 合并 zdtotal 和尺码数量
-                        $mergedData[$key]['zdtotal'] += $item['zdtotal'];
-                        // 动态获取尺码字段,合并尺码数量
-                        foreach ($item as $field => $value) {
-                            // 只处理字段名为数字的尺码字段
-                            if (is_numeric($field)) {
-                                $mergedData[$key][$field] = ($mergedData[$key][$field] ?? 0) + $value;
-                            }
-                        }
-                        // 优先选择以 "00" 结尾的条码
-                        if (substr($item['子订单编号'], -2) == '00') {
-                            $mergedData[$key]['条码'] = $item['子订单编号'];
-                        }
-                    }
-                }
-
-                // 将合并后的数据添加到原始数据的末尾,并排序
-                $finalOutput = $formattedData;
-
-                // 按 color_id 和 颜色备注 分组,并在每组末尾添加合并后的条码数据
-                foreach ($mergedData as $key => $mergeItem) {
-                    $mergeItem['合并标记'] = true; // 用于标记这是合并后的数据
-                    $finalOutput[] = $mergeItem;
-                }
-
-                // 对最终数组进行排序
-                usort($finalOutput, function($a, $b) {
-                    // 先按 color_id 排序
-                    $compare = strcmp($a['color_id'], $b['color_id']);
-                    if ($compare === 0) {
-                        // 在 color_id 相同的情况下,再按 颜色备注 排序
-                        $compare = strcmp($a['颜色备注'], $b['颜色备注']);
-                        if ($compare === 0) {
-                            // 在 颜色备注相同的情况下,按 子订单编号 排序
-                            // 如果一项是合并标记的条码数据,另一项不是,则合并标记的条码数据排在后面
-                            if (isset($a['合并标记']) && !isset($b['合并标记'])) {
-                                return 1;
-                            } elseif (!isset($a['合并标记']) && isset($b['合并标记'])) {
-                                return -1;
-                            }
-                            return strcmp($a['子订单编号'], $b['子订单编号']);
-                        }
-                        return $compare;
-                    }
-                    return $compare;
-                });
-
-                // 查询仅获取船样为 1 的数据
-                $chuanyang = \db('工单_印件资料')
-                    ->where('订单编号', $param['order'])
-                    ->where($where)
-                    ->where('船样', 1)
-                    ->field('子订单编号, 颜色, 款号, zdtotal, 颜色备注, color_id, 船样,
-                             cm1, cm2, cm3, cm4, cm5, cm6, cm7, cm8, cm9, cm10,
-                             cmsl1, cmsl2, cmsl3, cmsl4, cmsl5, cmsl6, cmsl7, cmsl8, cmsl9, cmsl10, Uniqid')
-                    ->select();
-
-                $chuanyangvval = [];
-                // 遍历船样为 1 的数据,进行尺码转换
-                foreach ($chuanyang as $item) {
-                    for ($i = 1; $i <= 10; $i++) {
-                        if (!empty($item['cm' . $i])) {
-                            $item[$item['cm' . $i]] = $item['cmsl' . $i];
+                            $subOrder[$item['cm' . $i]] = $item['cmsl' . $i];
+                            // 累加每个尺码的数量
+                            $subOrderTotal += $item['cmsl' . $i];
                         }
                         unset($item['cm' . $i], $item['cmsl' . $i]);
                     }
-                    $item['条码'] = $item['子订单编号'];
-                    $chuanyangvval[] = $item;
+                    $subOrder['合计'] = $subOrderTotal; // 添加合计
+                    $table[] = $subOrder; // 将当前子订单的数据添加到 $table 中
                 }
 
-                // 合并船样和非船样的数据并去重
-                $final = array_map("unserialize", array_unique(array_map("serialize", array_merge($finalOutput, $chuanyangvval))));
-                $data['process'] = $final;
-                // 最后清除带有条码的数据中的子订单编号和颜色信息
-                foreach ($final as &$item) {
-                    if (isset($item['条码']) && $item['船样'] == 0) {
-                        $item['子订单编号'] = '';
-                        $item['颜色'] = '';
-                        $item['款号'] = '';
-                        unset($item['子订单编号'], $item['颜色']);
-                    }
-                }
-                $counthz = \db('工单_印件资料')
-                    ->where('订单编号', $param['order'])
-                    ->where($where)
-                    ->select();
-                // 初始化累计数组
+                // 初始化汇总数组
                 $scslTotals = [
-                    'cmsl1' => 0,
-                    'cmsl2' => 0,
-                    'cmsl3' => 0,
-                    'cmsl4' => 0,
-                    'cmsl5' => 0,
-                    'cmsl6' => 0,
-                    'cmsl7' => 0,
-                    'cmsl8' => 0,
-                    'cmsl9' => 0,
-                    'cmsl10' => 0,
-                    'zdtotal' => 0,
+                    "cmsl1" => 0,
+                    "cmsl2" => 0,
+                    "cmsl3" => 0,
+                    "cmsl4" => 0,
+                    "cmsl5" => 0,
+                    "cmsl6" => 0,
+                    "cmsl7" => 0,
+                    "cmsl8" => 0,
+                    "cmsl9" => 0,
+                    "cmsl10" => 0,
+                    "zdtotal" => 0, // 总计数量
                 ];
-                // 遍历 $counthz 数组,将每行的 scsl1 到 scsl10 累加
-                foreach ($counthz as $item) {
+
+                // 遍历数据集进行汇总
+                foreach ($processlist as $item) {
+                    // 遍历每个尺码字段(cmsl1 到 cmsl10)
                     for ($i = 1; $i <= 10; $i++) {
-                        $key = "cmsl{$i}";
-                        if (!empty($item[$key])) { // 检查是否有值
-                            $scslTotals[$key] += (int)$item[$key];
-                            $scslTotals['zdtotal'] += (int)$item[$key];
+                        // 获取当前字段的数量
+                        $sizeQty = $item['cmsl' . $i];
+                        // 判断数量是否有效(非空且大于0)
+                        if (!empty($sizeQty)) {
+                            // 累加当前字段的数量
+                            $scslTotals['cmsl' . $i] += $sizeQty;
+                            // 累加到总计字段
+                            $scslTotals['zdtotal'] += $sizeQty;
                         }
                     }
                 }
-                $data['scslTotals'] = $scslTotals;
-
-                $data['order'] = $list;
-                $data['xhdata'] = $arr;
-                $this->success('成功', $data);
+                    $data['scslTotals'] = $scslTotals;
+                    $data['process'] = $table;//汇总数据集
+                    $data['order'] = $list;//表格数据
+                    $data['xhdata'] = $arr;//尺码表头
+                    $this->success('成功', $data);
+//                }
             } else {
                 echo "子订单编号 - 后不是2位也不是4位:$afterDash";
             }

+ 16 - 120
application/api/controller/WorkOrderSpotCheck.php

@@ -756,9 +756,9 @@ class WorkOrderSpotCheck extends Api{
                     $serial = \db('设备_产量计酬')
                         ->field('子订单编号, MAX(CAST(serial AS UNSIGNED)) as serial, MAX(CAST(serial_num AS UNSIGNED)) as serial_num')
                         ->where('子订单编号', $order)
-                        ->where(function($query) {
-                            $query->whereNull('mod_rq')->whereOr('mod_rq', '');
-                        }) // 查询未删除数据
+//                        ->where(function($query) {
+//                            $query->whereNull('mod_rq')->whereOr('mod_rq', '');
+//                        }) // 查询未删除数据
 //                        ->where('sczl_jtbh', $params['sys_sbID'])
                         ->group('子订单编号')
                         ->find();
@@ -911,26 +911,12 @@ class WorkOrderSpotCheck extends Api{
                         ])
                         ->order('UniqId desc')
                         ->find();
+
                     if (empty($res)) {
                         $ci_num = $paramArray[4];
                     } else {
                         $ci_num = $res["ci_num"];
-//                        // 累加 s_num
-//                        $total_s_num = 0;
-//                        foreach ($res as $item) {
-//                            $total_s_num += $item['s_num'];
-//                        }
-//                        if ($total_s_num >= $paramArray[4]) {
-//                            $ci_num = 0;
-//                        } else {
-//                            $ci_num = $res[0]['ci_num'];
-//                        }
                     }
-
-                    // 判断是否已报工并给出提示
-//                    if (!empty($res) && $res["ci_num"] == 0) {
-//                        $this->error('已上报,无需再次报工');
-//                    }
                     $result = [
                         'sys_sbID' => $params['sys_sbID'],//设备编号
                         'ci_num' => $ci_num,//剩余数量
@@ -1858,54 +1844,6 @@ class WorkOrderSpotCheck extends Api{
                 $this->error('请扫描子订单编号进行出库');
             }
         }
-//        // 处理出库逻辑
-//        if ($params['code'] == '出库') {
-//            if (strpos($params['order_id'], '-') !== false) {
-//                $cklist = \db('工单_印件资料')
-//                    ->field('子订单编号, ck_rq,颜色备注')
-//                    ->where('子订单编号', $params['order_id'])
-//                    ->find();
-//
-//                if ($cklist) {
-//                    if (!empty($cklist['ck_rq'])) {
-//                        $this->error('该子订单已完成出库操作,请勿重复操作。');
-//                    } else {
-//                        // 更新 '工单_印件资料' 表
-//                        $result1 = \db('工单_印件资料')
-//                            ->where('子订单编号', $params['order_id'])
-//                            ->fetchSql(true)
-//                            ->update(['ck_rq' => date("Y-m-d 00:00:00")]);
-//                        $updateCount1 = \db()->query($result1);
-//
-//                        // 更新 '工单_基本资料' 表
-//                        $order = explode('-', $params['order_id'])[0];
-//                        $result2 = \db('工单_基本资料')
-//                            ->where('订单编号', $order)
-//                            ->fetchSql(true)
-//                            ->update(['出库日期' => date("Y-m-d 00:00:00"),'gd_statu'=>'2-生产中']);
-//                        $updateCount2 = \db()->query($result2);
-//
-//                        if ($updateCount1 > 0 && $updateCount2 > 0) {
-//                            // 插入日志
-//                            $addlist = [
-//                                'order_id' => $params['order_id'],
-//                                'rq' => date("Y-m-d H:i:s"),
-//                                'name' => $params['code'],
-//                                'sys_id' => $params['sys_id']
-//                            ];
-//                            \db('设备_报工日志')->insertGetId($addlist);
-//                            $this->success($params['order_id'] . "已出库");
-//                        } else {
-//                            $this->error('出库失败');
-//                        }
-//                    }
-//                } else {
-//                    $this->error('未找到对应的子订单');
-//                }
-//            } else {
-//                $this->error('请扫描子订单编号进行出库');
-//            }
-//        }
 
         // 处理恢复逻辑
         else if ($params['code'] == '恢复') {
@@ -1969,12 +1907,16 @@ class WorkOrderSpotCheck extends Api{
         // 先查询当前记录的原始数据
         $existingData = \db('工单_印件资料')
             ->where('子订单编号', $params['order_id'])
+//            ->where(function($query) {
+//                $query->whereNull('Mod_rq')->whereOr('Mod_rq', '');
+//            }) // 查询未删除数据
+//            ->order('子订单编号 desc')
             ->find();
 
         if ($existingData) {
             // 计算新的累加值
             $updateData = [
-                'sc_rq' => date('Y-m-d H:i:s'),
+                'sc_rq' => date('Y-m-d H:i:s'),//生产报工日期
                 'scsl1' => isset($params['scsl1']) && is_numeric($params['scsl1']) ? $existingData['scsl1'] + $params['scsl1'] : $existingData['scsl1'] + 0,
                 'scsl2' => isset($params['scsl2']) && is_numeric($params['scsl2']) ? $existingData['scsl2'] + $params['scsl2'] : $existingData['scsl2'] + 0,
                 'scsl3' => isset($params['scsl3']) && is_numeric($params['scsl3']) ? $existingData['scsl3'] + $params['scsl3'] : $existingData['scsl3'] + 0,
@@ -1991,19 +1933,23 @@ class WorkOrderSpotCheck extends Api{
 
             $updateCount = \db('工单_印件资料')
                 ->where('子订单编号', $params['order_id'])
-                ->where('UniqId', $params['UniqId'])
+                ->fetchSql(true)
+//                ->where(function($query) {
+//                    $query->whereNull('Mod_rq')->whereOr('Mod_rq', '');
+//                }) // 查询未删除数据
                 ->update($updateData);
+            $list_gd = \db()->query($updateCount);
         } else {
             echo "没有找到相关记录";
         }
         // 检查更新结果
-        if ($updateCount > 0) {
+        if ($list_gd > 0) {
             $this->success("更新成功");
         } else {
             // 查询数据库,是否能找到对应的子订单编号
             $existingRecord = \db('工单_印件资料')
                 ->where('子订单编号', $params['order_id'])
-                ->where('UniqId', $params['UniqId'])
+//                ->where('UniqId', $params['UniqId'])
                 ->find();
             if ($existingRecord) {
                 $this->error('更新失败,可能是提供的更新数据与现有数据相同,未进行任何更改');
@@ -2016,56 +1962,6 @@ class WorkOrderSpotCheck extends Api{
     /**
      * 手工、大烫、总检、包装完工报工【通用的报工操作函数】
      */
-//    function reportWork($params) {
-//        $bglist = \db('设备_产量计酬')->field('订单编号,子订单编号,数量,ci_num,款号,sys_rq,serial,serial_num')->where('UniqId', $params['UniqId'])->fetchSql(true)->find();
-//        $list_gd = \db()->query($bglist);
-//
-//        $orderlist = \db('工单_基本资料')->where('订单编号', $list_gd[0]['订单编号'])->find();
-//        echo "<pre>";
-//        print_r($orderlist);
-//        echo "<pre>";die;
-//        $addorder['工单入仓数量'] = $params['sl'];
-//
-//        $orderlist = \db('工单_基本资料')->where('订单编号', $list_gd[0]['订单编号'])->update($addorder);
-//
-//        // 构建单条记录的函数,传递 $list_gd 作为参数
-//        function buildRecords($item, $list_gd) {
-//            return [
-//                '订单编号' => $item['order'],
-//                '子订单编号' => $item['order_id'],
-//                '款号' => $list_gd[0]['款号'],
-//                'serial' => $list_gd[0]['serial'],
-//                'serial_num' => $list_gd[0]['serial_num'],
-//                '工序编号' => $item['gx'],
-//                '工序名称' => $item['gxmc'],
-//                '尺码' => $item['cm'],
-//                '数量' => $item['sl'],
-//                'sczl_jtbh' => $item['sczl_jtbh'],
-//                'sczl_bh' => $item['sczl_bh'],
-//                '尾包' => $item['wb'],
-//                'sys_id' => $item['sys_id'],
-//                'sys_rq' => date('Y-m-d H:i:s'),
-//                'sczl_rq' => date('Y-m-d'),
-//                'ci_num' => $item['ci_num'] - $item['s_num'],
-//                's_num' => $item['s_num'],
-//            ];
-//        }
-//        // 检查是否是索引数组(多条记录)
-//        if (isset($params[0]) && is_array($params[0])) {
-//            foreach ($params as $item) {
-//                $list[] = buildRecords($item, $list_gd);
-//            }
-//        } else {
-//            //处理单条记录
-//            $list[] = buildRecords($params, $list_gd);
-//        }
-//        $result = \db('设备_产量计酬')->insertAll($list);
-//        if ($result) {
-//            $this->success('数据插入成功 : ' . date('H:i:s'));
-//        } else {
-//            $this->error('数据插入失败');
-//        }
-//    }
     function reportWork($params) {
         // 查询设备_产量计酬表的数据
         $bglist = \db('设备_产量计酬')->field('订单编号,子订单编号,数量,ci_num,款号,sys_rq,serial,serial_num')