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() { if (!$this->request->isGet()) { return $this->error('请求错误'); } $params = Request::instance()->param(); $rq = $this->request->get('rq', '', 'trim'); // 分页参数 $page = isset($params['page']) ? (int)$params['page'] : 1; $limit = isset($params['limit']) ? (int)$params['limit'] : 30; // 构建基础查询条件 $where = []; // 搜索条件 if (!empty($params['search'])) { $where['g.订单编号|g.生产款号'] = array('like', '%' . $params['search'] . '%'); } // 通用删除标记条件 $where['g.Mod_rq'] = null; //月份条件非必传 if (!empty($rq)) { // 只有传了 rq 月份,才拼接日期范围 [$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")); $where['g.落货日期'] = ['between', [$start, $end]]; } // 生产计酬子查询 $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 已完成数量", // 1. sczl_bh 作为 生产组别 \think\Db::raw('GROUP_CONCAT(DISTINCT CASE WHEN 工序名称 = "车缝" THEN sczl_bh END ORDER BY sczl_bh SEPARATOR "、") AS 生产组别'), // 2. 原来的 sczl_jtbh 截取结果 作为 机台号 \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(); // ===================== 先查询 总条数 ===================== $total = \think\Db::table('工单_基本资料') ->alias('g') ->join([$productSub => 'p'], 'g.订单编号 = p.订单编号', 'LEFT') ->join([$stockSub => 's'], 'g.订单编号 = s.order_id', 'LEFT') ->where($where) ->count(); // ===================== 再查询 分页列表 ===================== $list = \think\Db::table('工单_基本资料') ->alias('g') ->join([$productSub => 'p'], 'g.订单编号 = p.订单编号', 'LEFT') ->join([$stockSub => 's'], 'g.订单编号 = s.order_id', 'LEFT') ->where($where) ->limit(($page - 1) * $limit, $limit) ->field([ 'g.Uniqid', 'g.订单编号', 'g.审核 AS 核批', 'g.审核日期 AS 核批日期', 'g.接单日期 AS 下单日期', 'g.落货日期 AS 货期', 'g.生产款号 AS 款号', 'g.订单数量', 'g.工单入仓数量 AS 入库数量', 'g.款式', 'g.客户编号 AS 客人编号', 'g.辅料计划入库时间', 'g.计划生产小组', 's.面料入库时间', 'p.开裁日期', '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['机台号'] ?? ''; $item['实际生产小组'] = $item['生产组别'] ?? ''; } // 返回格式:data + total return $this->success('成功', [ 'list' => $list, 'total' => $total, 'page' => $page, 'limit' => $limit ]); } }