success('请求成功'); } /** * 获取工单接单日期的年月列表(左侧菜单栏) * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getWorkOrderDates() { if ($this->request->isGet() === false) { $this->error('请求错误'); } $list = \think\Db::table('工单_基本资料') ->whereNull('Mod_rq') // 排除 Mod_rq 不为 null 的数据 ->where('落货日期', '<>', '') // 排除空值 ->field(\think\Db::raw('DATE_FORMAT(落货日期, "%Y-%m") as 年月')) ->group('年月') ->order('年月', 'desc') // 按年月倒序排列,最新的在前面 ->select(); if (empty($list)) { $this->success('', []); } // 提取年月值组成数组 $data = []; foreach ($list as $item) { $data[] = $item['年月']; } $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('请求错误'); // } // $rq = $this->request->get('rq'); // if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) { // $this->error('参数格式错误,请使用 YYYY-MM 格式'); // } // // 计算月份起止日期 // list($year, $month) = explode('-', $rq); // $start = "{$year}-{$month}-01"; // $end = date('Y-m-d', strtotime("{$year}-{$month}-01 +1 month")); // $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 辅料计划入库时间', // // 面料入库时间 - 使用子查询避免重复 // \think\Db::raw('(SELECT MIN(rq) FROM 库存_出入库明细 WHERE order_id = g.订单编号 AND name = "入库") as 面料入库时间'), // // 裁剪相关 - 使用子查询 // \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 实裁数量'), // // 车缝相关 - 使用子查询 // \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 车位完成日期'), // // 后道相关 - 使用子查询 // \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); // } /** * 根据月份获取工单数据 */ 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') ->Join([$productSub => 'p'], 'g.订单编号 = p.订单编号') ->Join([$stockSub => 's'], 'g.订单编号 = s.order_id') ->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.辅料计划入库时间', '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; } $item['实裁数量'] = (int)($item['实裁数量'] ?? 0); $item['已完成数量'] = (int)($item['已完成数量'] ?? 0); $item['订单数量'] = (int)($item['订单数量'] ?? 0); $item['入库数量'] = (int)($item['入库数量'] ?? 0); $item['生产组别'] = $item['生产组别'] ?? ''; } return $this->success('成功', $list); } }