zck 2 dní pred
rodič
commit
9a87df3c3d

+ 77 - 107
application/api/controller/Manufacture.php

@@ -1129,64 +1129,48 @@ class Manufacture extends Api
         ]);
     }
 
- /**
- * 样衣核批
- */
-public function Approval(){
-    if ($this->request->isPost() === false) {
-        $this->error('请求错误');
-    }
-    $param = Request::instance()->post();
-    if (empty($param)) {
-        $this->error('参数错误');
-    }
-    
-    // 判断Uniqid是否为多个,多个以逗号分隔
-    $uniqids = strpos($param['Uniqid'], ',') !== false ? explode(',', $param['Uniqid']) : [$param['Uniqid']];
-    
-    // 获取这些工单对应的月份(用于清除缓存)
-    $months = [];
-    
-    // 准备更新数据(使用数组键名,不需要加反引号)
-    $data = [
-        '审核日期' => !empty($param['rq']) ? $param['rq'] : date('Y-m-d H:i:s'),
-        '审核' => $param['sys_id'],
-    ];
-    
-    // 遍历所有Uniqid进行更新
-    foreach ($uniqids as $uniqid) {
-        // 先查询该工单的落货日期(货期),获取月份
-        $orderInfo = Db::table('工单_基本资料')
-            ->where('Uniqid', $uniqid)
-            ->field('落货日期')
-            ->find();
-        
-        if ($orderInfo && !empty($orderInfo['落货日期'])) {
-            $month = date('Y-m', strtotime($orderInfo['落货日期']));
-            $months[$month] = $month;
+    /**
+     * 样衣核批
+     */
+    public function Approval(){
+        if ($this->request->isPost() === false) {
+            $this->error('请求错误');
         }
-        
-        // 执行更新(使用数组方式,不要用fetchSql)
-        $res = Db::table('工单_基本资料')
-            ->where('Uniqid', $uniqid)
-            ->update($data);
-        
-        // 如果更新失败,直接返回错误
-        if ($res === false) {
-            $this->error('审核失败');
+        $param = Request::instance()->post();
+        if (empty($param)) {
+            $this->error('参数错误');
         }
-    }
-    
-    // 清除相关月份的缓存
-    foreach ($months as $month) {
-        $this->clearWorkOrderCache($month);
-    }
-    
-    // 所有更新操作都成功时,返回成功
-    $this->success('审核成功');
-}
+        // 判断Uniqid是否为多个,多个以逗号分隔
+        $uniqids = strpos($param['Uniqid'], ',') !== false ? explode(',', $param['Uniqid']) : [$param['Uniqid']];
 
-   
+        if (!empty($param['rq'])) {
+            // 准备更新数据
+            $data = [
+                '审核日期' => $param['rq'],
+                '审核' => $param['sys_id'],
+            ];
+        }else{
+            // 准备更新数据
+            $data = [
+                '审核日期' => date('Y-m-d H:i:s'),
+                '审核' => $param['sys_id'],
+            ];
+        }
+        // 遍历所有Uniqid进行更新
+        foreach ($uniqids as $uniqid) {
+            $list = \db('工单_基本资料')
+                ->where('Uniqid', $uniqid)
+                ->fetchSql(true)
+                ->update($data);
+            $res = \db()->query($list);
+            // 如果更新失败,直接返回错误
+            if ($res === false) {
+                $this->error('审核失败');
+            }
+        }
+        // 所有更新操作都成功时,返回成功
+        $this->success('审核成功');
+    }
 
     /**
      * 订单状态及样衣批核
@@ -1302,61 +1286,47 @@ public function Approval(){
     }
 
     /**
- * 辅料计划入库时间更新
- */
-public function AccessoriesInboundTime(){
-    if ($this->request->isPost() === false) {
-        $this->error('请求错误');
-    }
-    $param = Request::instance()->post();
-    if (empty($param)) {
-        $this->error('参数错误');
-    }
-    
-    // 判断Uniqid是否为多个,多个以逗号分隔
-    $uniqids = strpos($param['Uniqid'], ',') !== false ? explode(',', $param['Uniqid']) : [$param['Uniqid']];
-    
-    // 获取这些工单对应的月份(用于清除缓存)
-    $months = [];
-    
-    // 准备更新数据(使用数组键名,不需要加反引号)
-    $data = [
-        '辅料计划入库时间' => !empty($param['rq']) ? $param['rq'] : date('Y-m-d H:i:s'),
-        '辅料计划入库操作人' => $param['sys_id'],
-    ];
-    
-    // 遍历所有Uniqid进行更新
-    foreach ($uniqids as $uniqid) {
-        // 先查询该工单的落货日期(货期),获取月份
-        $orderInfo = Db::table('工单_基本资料')
-            ->where('Uniqid', $uniqid)
-            ->field('落货日期')
-            ->find();
-        
-        if ($orderInfo && !empty($orderInfo['落货日期'])) {
-            $month = date('Y-m', strtotime($orderInfo['落货日期']));
-            $months[$month] = $month;
+     * 辅料计划入库时间更新
+     */
+    public function AccessoriesInboundTime(){
+        if ($this->request->isPost() === false) {
+            $this->error('请求错误');
         }
-        
-        // 执行更新(使用数组方式,不要用fetchSql)
-        $res = Db::table('工单_基本资料')
-            ->where('Uniqid', $uniqid)
-            ->update($data);
-        
-        // 如果更新失败,直接返回错误
-        if ($res === false) {
-            $this->error('更新辅料计划入库时间失败');
+        $param = Request::instance()->post();
+        if (empty($param)) {
+            $this->error('参数错误');
         }
+        // 判断Uniqid是否为多个,多个以逗号分隔
+        $uniqids = strpos($param['Uniqid'], ',') !== false ? explode(',', $param['Uniqid']) : [$param['Uniqid']];
+
+        if (!empty($param['rq'])) {
+            // 准备更新数据
+            $data = [
+                '辅料计划入库时间' => $param['rq'],
+                '辅料计划入库操作人' => $param['sys_id'],
+            ];
+        }else{
+            // 准备更新数据
+            $data = [
+                '辅料计划入库时间' => date('Y-m-d H:i:s'),
+                '辅料计划入库操作人' => $param['sys_id'],
+            ];
+        }
+        // 遍历所有Uniqid进行更新
+        foreach ($uniqids as $uniqid) {
+            $list = \db('工单_基本资料')
+                ->where('Uniqid', $uniqid)
+                ->fetchSql(true)
+                ->update($data);
+            $res = \db()->query($list);
+            // 如果更新失败,直接返回错误
+            if ($res === false) {
+                $this->error('更新辅料计划入库时间失败');
+            }
+        }
+        // 所有更新操作都成功时,返回成功
+        $this->success('更新成功');
     }
-    
-    // 清除相关月份的缓存
-    foreach ($months as $month) {
-        $this->clearWorkOrderCache($month);
-    }
-    
-    // 所有更新操作都成功时,返回成功
-    $this->success('更新成功');
-}
 
     /**
      * 月度客户订单汇总

+ 195 - 116
application/api/controller/OrderSuperLoss.php

@@ -60,133 +60,212 @@ class OrderSuperLoss extends Api
         $this->success('成功', $data);
     }
 
-    /**
-     * 根据月份获取工单数据(排除已修改记录)
-     * @return void
-     * @throws \think\db\exception\DataNotFoundException
-     * @throws \think\db\exception\ModelNotFoundException
-     * @throws \think\exception\DbException
-     */
-    public function getWorkOrdersByMonth()
-    {
-        if ($this->request->isGet() === false) {
-            $this->error('请求错误');
-        }
+    // /**
+    //  * 根据月份获取工单数据(排除已修改记录)
+    //  * @return void
+    //  * @throws \think\db\exception\DataNotFoundException
+    //  * @throws \think\db\exception\ModelNotFoundException
+    //  * @throws \think\exception\DbException
+    //  */
+    // public function getWorkOrdersByMonth()
+    // {
+    //     if ($this->request->isGet() === false) {
+    //         $this->error('请求错误');
+    //     }
 
-        $rq = $this->request->get('rq');
-        if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) {
-            $this->error('参数格式错误,请使用 YYYY-MM 格式');
-        }
+    //     $rq = $this->request->get('rq');
+    //     if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) {
+    //         $this->error('参数格式错误,请使用 YYYY-MM 格式');
+    //     }
 
-        // 生成缓存key
-        $cacheKey = 'work_orders_' . $rq;
-        
-        // 尝试从缓存获取
-        $cachedData = cache($cacheKey);
-        if ($cachedData !== false) {
-            $this->success('成功', $cachedData);
-            return;
-        }
+    //     // 计算月份起止日期
+    //     list($year, $month) = explode('-', $rq);
+    //     $start = "{$year}-{$month}-01";
+    //     $end = date('Y-m-d', strtotime("{$year}-{$month}-01 +1 month"));
 
-        // 计算月份起止日期
-        list($year, $month) = explode('-', $rq);
-        $start = "{$year}-{$month}-01";
-        $end = date('Y-m-d', strtotime("{$year}-{$month}-01 +1 month"));
-
-        // 使用原生SQL查询,避免框架对中文字段名的校验
-        $sql = "SELECT 
-                    g.Uniqid,
-                    g.订单编号,
-                    g.审核 as 核批,
-                    g.审核日期 as 核批日期,
-                    g.接单日期 as 下单日期,
-                    g.落货日期 as 货期,
-                    g.生产款号 as 款号,
-                    g.订单数量,
-                    g.工单入仓数量 as 入库数量,
-                    g.款式,
-                    g.客户编号 as 客人编号,
-                    g.辅料计划入库时间 as 辅料计划入库时间,
-                    
-                    (SELECT MIN(rq) FROM 库存_出入库明细 WHERE order_id = g.订单编号 AND name = '入库') as 面料入库时间,
-                    
-                    (SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '裁剪' AND Mod_rq IS NULL) as 开裁日期,
-                    (SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '裁剪' AND Mod_rq IS NULL) as 实裁数量,
-                    
-                    (SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '车缝' AND Mod_rq IS NULL) as 上车位日期,
-                    (SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '车缝' AND 尾包 = 1 AND Mod_rq IS NULL) as 车位完成日期,
-                    
-                    (SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '手工' AND 尾包 = 1 AND Mod_rq IS NULL) as 后道完成日期,
-                    
-                    (SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = '包装' AND Mod_rq IS NULL) as 已完成数量,
-                    
-                    (SELECT GROUP_CONCAT(DISTINCT SUBSTRING(sczl_jtbh, 3, 2) ORDER BY SUBSTRING(sczl_jtbh, 3, 2) SEPARATOR '、') 
-                     FROM 设备_产量计酬 
-                     WHERE 订单编号 = g.订单编号 AND 工序名称 = '车缝' AND Mod_rq IS NULL) as 生产组别,
-                    
-                    NULL as 辅料入库时间,
-                    NULL as 台产,
-                    NULL as 产前样批核,
-                    NULL as 备注
-                    
-                FROM 工单_基本资料 g
-                WHERE g.落货日期 >= '{$start}'
-                    AND g.落货日期 < '{$end}'
-                    AND g.Mod_rq IS NULL
-                GROUP BY g.订单编号
-                ORDER BY g.落货日期 ASC";
-
-        $list = Db::query($sql);
+    //     $list = \think\Db::table('工单_基本资料')
+    //         ->alias('g')
+    //         ->join('库存_出入库明细 d', 'g.订单编号 = d.order_id', 'LEFT')
+    //         ->where('g.落货日期', '>=', $start)
+    //         ->where('g.落货日期', '<', $end)
+    //         ->whereNull('g.Mod_rq')
+    //         ->field([
+    //             'g.Uniqid',
+    //             'g.订单编号',
+    //             'g.审核 as 核批',
+    //             'g.审核日期 as 核批日期',
+    //             'g.接单日期 as 下单日期',
+    //             'g.落货日期 as 货期',
+    //             'g.生产款号 as 款号',
+    //             'g.订单数量',
+    //             'g.工单入仓数量 as 入库数量',
+    //             'g.款式',
+    //             'g.客户编号 as 客人编号',
+    //             'g.辅料计划入库时间 as 辅料计划入库时间',
 
-        if (empty($list)) {
-            $this->success('', []);
-        }
+    //             // 面料入库时间 - 使用子查询避免重复
+    //             \think\Db::raw('(SELECT MIN(rq) FROM 库存_出入库明细 WHERE order_id = g.订单编号 AND name = "入库") as 面料入库时间'),
 
-        // 处理日期字段,去掉时分秒
-        $dateFields = ['下单日期', '货期', '面料入库时间', '辅料入库时间', '开裁日期', '上车位日期', '车位完成日期', '后道完成日期'];
-
-        foreach ($list as &$item) {
-            foreach ($dateFields as $field) {
-                if (isset($item[$field]) && !empty($item[$field])) {
-                    $item[$field] = date('Y-m-d', strtotime($item[$field]));
-                }
-            }
-            if (empty($item['生产组别'])) {
-                $item['生产组别'] = '';
-            }
-            // 确保数值字段为整数
-            $item['实裁数量'] = intval($item['实裁数量'] ?? 0);
-            $item['已完成数量'] = intval($item['已完成数量'] ?? 0);
-            $item['订单数量'] = intval($item['订单数量'] ?? 0);
-            $item['入库数量'] = intval($item['入库数量'] ?? 0);
-        }
+    //             // 裁剪相关 - 使用子查询
+    //             \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "裁剪" AND Mod_rq IS NULL) as 开裁日期'),
+    //             \think\Db::raw('(SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "裁剪" AND Mod_rq IS NULL) as 实裁数量'),
 
-        // 存入缓存,有效期1小时
-        cache($cacheKey, $list, 3600);
+    //             // 车缝相关 - 使用子查询
+    //             \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "车缝" AND Mod_rq IS NULL) as 上车位日期'),
+    //             \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "车缝" AND 尾包 = 1 AND Mod_rq IS NULL) as 车位完成日期'),
 
-        $this->success('成功', $list);
-    }
+    //             // 后道相关 - 使用子查询
+    //             \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "手工" AND 尾包 = 1 AND Mod_rq IS NULL) as 后道完成日期'),
+
+    //             // 包装完成数量 - 使用子查询
+    //             \think\Db::raw('(SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "包装" AND Mod_rq IS NULL) as 已完成数量'),
+
+    //             // 生产组别 - 使用子查询
+    //             \think\Db::raw('(SELECT GROUP_CONCAT(DISTINCT SUBSTRING(sczl_jtbh, 3, 2) ORDER BY SUBSTRING(sczl_jtbh, 3, 2) SEPARATOR "、") 
+    //                         FROM 设备_产量计酬 
+    //                         WHERE 订单编号 = g.订单编号 
+    //                         AND 工序名称 = "车缝" 
+    //                         AND Mod_rq IS NULL) as 生产组别'),
+
+    //             // 占位字段
+    //             \think\Db::raw('NULL as 辅料入库时间'),
+    //             \think\Db::raw('NULL as 台产'),
+    //             \think\Db::raw('NULL as 产前样批核'),
+    //             \think\Db::raw('NULL as 备注'),
+    //         ])
+    //         ->group('g.订单编号')
+    //         ->select();
+
+    //     if (empty($list)) {
+    //         $this->success('', []);
+    //     }
+
+    //     // 处理日期字段,去掉时分秒
+    //     $dateFields = ['下单日期', '货期', '面料入库时间', '辅料入库时间', '开裁日期', '上车位日期', '车位完成日期', '后道完成日期'];
 
+    //     foreach ($list as &$item) {
+    //         foreach ($dateFields as $field) {
+    //             if (isset($item[$field]) && !empty($item[$field])) {
+    //                 $item[$field] = date('Y-m-d', strtotime($item[$field]));
+    //             }
+    //         }
+    //         if (empty($item['生产组别'])) {
+    //             $item['生产组别'] = '';
+    //         }
+    //         // 确保数值字段为整数
+    //         $item['实裁数量'] = intval($item['实裁数量'] ?? 0);
+    //         $item['已完成数量'] = intval($item['已完成数量'] ?? 0);
+    //         $item['订单数量'] = intval($item['订单数量'] ?? 0);
+    //         $item['入库数量'] = intval($item['入库数量'] ?? 0);
+    //     }
+
+    //     $this->success('成功', $list);
+    // }
     /**
-     * 清除工单数据缓存
-     * @param string $rq 月份(Y-m格式),为空则清除所有当前月份的缓存
-     */
-    public function clearWorkOrderCache()
-    {
-        $rq = $this->request->get('rq');
-        if (empty($rq)) {
-            $this->error('请指定要清除缓存的月份');
-        }
-        
-        if (!preg_match('/^\d{4}-\d{2}$/', $rq)) {
-            $this->error('参数格式错误,请使用 YYYY-MM 格式');
+ * 根据月份获取工单数据
+ */
+public function getWorkOrdersByMonth()
+{
+    // 1. 请求方法校验
+    if (!$this->request->isGet()) {
+        return $this->error('请求错误');
+    }
+
+    // 2. 参数接收与严格校验
+    $rq = $this->request->get('rq', '', 'trim');
+    if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) {
+        return $this->error('参数格式错误,请使用 YYYY-MM 格式');
+    }
+
+    // 3. 日期范围计算(安全、无歧义)
+    [$year, $month] = explode('-', $rq);
+    $start = "{$year}-{$month}-01 00:00:00";
+    $end = date('Y-m-01 00:00:00', strtotime("{$year}-{$month}-01 +1 month"));
+
+
+    $productSub = \think\Db::table('设备_产量计酬')
+        ->whereNull('Mod_rq')
+        ->group('订单编号')
+        ->field([
+            '订单编号',
+            "MIN(CASE WHEN 工序名称 = '裁剪' THEN sczl_rq END) AS 开裁日期",
+            "SUM(CASE WHEN 工序名称 = '裁剪' THEN 数量 END) AS 实裁数量",
+            "MIN(CASE WHEN 工序名称 = '车缝' THEN sczl_rq END) AS 上车位日期",
+            "MIN(CASE WHEN 工序名称 = '车缝' AND 尾包 = 1 THEN sczl_rq END) AS 车位完成日期",
+            "MIN(CASE WHEN 工序名称 = '手工' AND 尾包 = 1 THEN sczl_rq END) AS 后道完成日期",
+            "SUM(CASE WHEN 工序名称 = '包装' THEN 数量 END) AS 已完成数量",
+            // 修复长度限制
+            \think\Db::raw('GROUP_CONCAT(DISTINCT CASE WHEN 工序名称 = "车缝" THEN SUBSTRING(sczl_jtbh, 3, 2) END ORDER BY SUBSTRING(sczl_jtbh, 3, 2) SEPARATOR "、") AS 生产组别'),
+        ])
+        ->buildSql();
+
+
+    $stockSub = \think\Db::table('库存_出入库明细')
+        ->whereNull('Mod_rq') // 这里补上!
+        ->group('order_id')
+        ->field([
+            'order_id',
+            'MIN(CASE WHEN name = "入库" THEN rq END) AS 面料入库时间',
+        ])
+        ->buildSql();
+
+
+    $list = \think\Db::table('工单_基本资料')
+        ->alias('g')
+        ->leftJoin([$productSub => 'p'], 'g.订单编号 = p.订单编号')
+        ->leftJoin([$stockSub => 's'], 'g.订单编号 = s.order_id')
+        ->where([
+            ['g.落货日期', '>=', $start],
+            ['g.落货日期', '<', $end],
+            ['g.Mod_rq', 'null'],
+        ])
+        ->field([
+            'g.Uniqid',
+            'g.订单编号',
+            'g.审核 AS 核批',
+            'g.审核日期 AS 核批日期',
+            'g.接单日期 AS 下单日期',
+            'g.落货日期 AS 货期',
+            'g.生产款号 AS 款号',
+            'g.订单数量',
+            'g.工单入仓数量 AS 入库数量',
+            'g.款式',
+            'g.客户编号 AS 客人编号',
+            'g.辅料计划入库时间',
+            's.面料入库时间',
+            'p.开裁日期',
+            'p.实裁数量',
+            'p.上车位日期',
+            'p.车位完成日期',
+            'p.后道完成日期',
+            'p.已完成数量',
+            'p.生产组别',
+            \think\Db::raw('NULL AS 辅料入库时间'),
+            \think\Db::raw('NULL AS 台产'),
+            \think\Db::raw('NULL AS 产前样批核'),
+            \think\Db::raw('NULL AS 备注'),
+        ])
+        ->select();
+
+
+    $dateFields = [
+        '下单日期', '货期', '面料入库时间', '开裁日期',
+        '上车位日期', '车位完成日期', '后道完成日期'
+    ];
+
+    foreach ($list as &$item) {
+        foreach ($dateFields as $field) {
+            $item[$field] = !empty($item[$field]) ? date('Y-m-d', strtotime($item[$field])) : null;
         }
-        
-        $cacheKey = 'work_orders_' . $rq;
-        cache($cacheKey, null);
-        
-        $this->success('缓存已清除');
+        $item['实裁数量'] = (int)($item['实裁数量'] ?? 0);
+        $item['已完成数量'] = (int)($item['已完成数量'] ?? 0);
+        $item['订单数量'] = (int)($item['订单数量'] ?? 0);
+        $item['入库数量'] = (int)($item['入库数量'] ?? 0);
+        $item['生产组别'] = $item['生产组别'] ?? '';
     }
 
+    return $this->success('成功', $list);
+}
+
 }