| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- <?php
- namespace app\api\controller;
- use app\common\controller\Api;
- use think\Cache;
- use think\Exception;
- use think\Log;
- use \think\Request;
- use \think\Db;
- /**
- * 报表接口
- */
- class OrderSuperLoss extends Api
- {
- protected $noNeedLogin = ['*'];
- protected $noNeedRight = ['*'];
- /**
- * 首页-已核查成品编号
- *
- */
- public function index()
- {
- $this->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);
- }
- }
|