OrderSuperLoss.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Cache;
  5. use think\Exception;
  6. use think\Log;
  7. use \think\Request;
  8. use \think\Db;
  9. /**
  10. * 报表接口
  11. */
  12. class OrderSuperLoss extends Api
  13. {
  14. protected $noNeedLogin = ['*'];
  15. protected $noNeedRight = ['*'];
  16. /**
  17. * 首页-已核查成品编号
  18. *
  19. */
  20. public function index()
  21. {
  22. $this->success('请求成功');
  23. }
  24. /**
  25. * 获取工单接单日期的年月列表(左侧菜单栏)
  26. * @return void
  27. * @throws \think\db\exception\DataNotFoundException
  28. * @throws \think\db\exception\ModelNotFoundException
  29. * @throws \think\exception\DbException
  30. */
  31. public function getWorkOrderDates()
  32. {
  33. if ($this->request->isGet() === false) {
  34. $this->error('请求错误');
  35. }
  36. $list = \think\Db::table('工单_基本资料')
  37. ->whereNull('Mod_rq') // 排除 Mod_rq 不为 null 的数据
  38. ->where('落货日期', '<>', '') // 排除空值
  39. ->field(\think\Db::raw('DATE_FORMAT(落货日期, "%Y-%m") as 年月'))
  40. ->group('年月')
  41. ->order('年月', 'desc') // 按年月倒序排列,最新的在前面
  42. ->select();
  43. if (empty($list)) {
  44. $this->success('', []);
  45. }
  46. // 提取年月值组成数组
  47. $data = [];
  48. foreach ($list as $item) {
  49. $data[] = $item['年月'];
  50. }
  51. $this->success('成功', $data);
  52. }
  53. // /**
  54. // * 根据月份获取工单数据(排除已修改记录)
  55. // * @return void
  56. // * @throws \think\db\exception\DataNotFoundException
  57. // * @throws \think\db\exception\ModelNotFoundException
  58. // * @throws \think\exception\DbException
  59. // */
  60. // public function getWorkOrdersByMonth()
  61. // {
  62. // if ($this->request->isGet() === false) {
  63. // $this->error('请求错误');
  64. // }
  65. // $rq = $this->request->get('rq');
  66. // if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) {
  67. // $this->error('参数格式错误,请使用 YYYY-MM 格式');
  68. // }
  69. // // 计算月份起止日期
  70. // list($year, $month) = explode('-', $rq);
  71. // $start = "{$year}-{$month}-01";
  72. // $end = date('Y-m-d', strtotime("{$year}-{$month}-01 +1 month"));
  73. // $list = \think\Db::table('工单_基本资料')
  74. // ->alias('g')
  75. // ->join('库存_出入库明细 d', 'g.订单编号 = d.order_id', 'LEFT')
  76. // ->where('g.落货日期', '>=', $start)
  77. // ->where('g.落货日期', '<', $end)
  78. // ->whereNull('g.Mod_rq')
  79. // ->field([
  80. // 'g.Uniqid',
  81. // 'g.订单编号',
  82. // 'g.审核 as 核批',
  83. // 'g.审核日期 as 核批日期',
  84. // 'g.接单日期 as 下单日期',
  85. // 'g.落货日期 as 货期',
  86. // 'g.生产款号 as 款号',
  87. // 'g.订单数量',
  88. // 'g.工单入仓数量 as 入库数量',
  89. // 'g.款式',
  90. // 'g.客户编号 as 客人编号',
  91. // 'g.辅料计划入库时间 as 辅料计划入库时间',
  92. // // 面料入库时间 - 使用子查询避免重复
  93. // \think\Db::raw('(SELECT MIN(rq) FROM 库存_出入库明细 WHERE order_id = g.订单编号 AND name = "入库") as 面料入库时间'),
  94. // // 裁剪相关 - 使用子查询
  95. // \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "裁剪" AND Mod_rq IS NULL) as 开裁日期'),
  96. // \think\Db::raw('(SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "裁剪" AND Mod_rq IS NULL) as 实裁数量'),
  97. // // 车缝相关 - 使用子查询
  98. // \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "车缝" AND Mod_rq IS NULL) as 上车位日期'),
  99. // \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "车缝" AND 尾包 = 1 AND Mod_rq IS NULL) as 车位完成日期'),
  100. // // 后道相关 - 使用子查询
  101. // \think\Db::raw('(SELECT MIN(sczl_rq) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "手工" AND 尾包 = 1 AND Mod_rq IS NULL) as 后道完成日期'),
  102. // // 包装完成数量 - 使用子查询
  103. // \think\Db::raw('(SELECT SUM(数量) FROM 设备_产量计酬 WHERE 订单编号 = g.订单编号 AND 工序名称 = "包装" AND Mod_rq IS NULL) as 已完成数量'),
  104. // // 生产组别 - 使用子查询
  105. // \think\Db::raw('(SELECT GROUP_CONCAT(DISTINCT SUBSTRING(sczl_jtbh, 3, 2) ORDER BY SUBSTRING(sczl_jtbh, 3, 2) SEPARATOR "、")
  106. // FROM 设备_产量计酬
  107. // WHERE 订单编号 = g.订单编号
  108. // AND 工序名称 = "车缝"
  109. // AND Mod_rq IS NULL) as 生产组别'),
  110. // // 占位字段
  111. // \think\Db::raw('NULL as 辅料入库时间'),
  112. // \think\Db::raw('NULL as 台产'),
  113. // \think\Db::raw('NULL as 产前样批核'),
  114. // \think\Db::raw('NULL as 备注'),
  115. // ])
  116. // ->group('g.订单编号')
  117. // ->select();
  118. // if (empty($list)) {
  119. // $this->success('', []);
  120. // }
  121. // // 处理日期字段,去掉时分秒
  122. // $dateFields = ['下单日期', '货期', '面料入库时间', '辅料入库时间', '开裁日期', '上车位日期', '车位完成日期', '后道完成日期'];
  123. // foreach ($list as &$item) {
  124. // foreach ($dateFields as $field) {
  125. // if (isset($item[$field]) && !empty($item[$field])) {
  126. // $item[$field] = date('Y-m-d', strtotime($item[$field]));
  127. // }
  128. // }
  129. // if (empty($item['生产组别'])) {
  130. // $item['生产组别'] = '';
  131. // }
  132. // // 确保数值字段为整数
  133. // $item['实裁数量'] = intval($item['实裁数量'] ?? 0);
  134. // $item['已完成数量'] = intval($item['已完成数量'] ?? 0);
  135. // $item['订单数量'] = intval($item['订单数量'] ?? 0);
  136. // $item['入库数量'] = intval($item['入库数量'] ?? 0);
  137. // }
  138. // $this->success('成功', $list);
  139. // }
  140. /**
  141. * 根据月份获取工单数据
  142. */
  143. public function getWorkOrdersByMonth()
  144. {
  145. // 1. 请求方法校验
  146. if (!$this->request->isGet()) {
  147. return $this->error('请求错误');
  148. }
  149. // 2. 参数接收与严格校验
  150. $rq = $this->request->get('rq', '', 'trim');
  151. if (empty($rq) || !preg_match('/^\d{4}-\d{2}$/', $rq)) {
  152. return $this->error('参数格式错误,请使用 YYYY-MM 格式');
  153. }
  154. // 3. 日期范围计算(安全、无歧义)
  155. [$year, $month] = explode('-', $rq);
  156. $start = "{$year}-{$month}-01 00:00:00";
  157. $end = date('Y-m-01 00:00:00', strtotime("{$year}-{$month}-01 +1 month"));
  158. $productSub = \think\Db::table('设备_产量计酬')
  159. ->whereNull('Mod_rq')
  160. ->group('订单编号')
  161. ->field([
  162. '订单编号',
  163. "MIN(CASE WHEN 工序名称 = '裁剪' THEN sczl_rq END) AS 开裁日期",
  164. "SUM(CASE WHEN 工序名称 = '裁剪' THEN 数量 END) AS 实裁数量",
  165. "MIN(CASE WHEN 工序名称 = '车缝' THEN sczl_rq END) AS 上车位日期",
  166. "MIN(CASE WHEN 工序名称 = '车缝' AND 尾包 = 1 THEN sczl_rq END) AS 车位完成日期",
  167. "MIN(CASE WHEN 工序名称 = '手工' AND 尾包 = 1 THEN sczl_rq END) AS 后道完成日期",
  168. "SUM(CASE WHEN 工序名称 = '包装' THEN 数量 END) AS 已完成数量",
  169. // 修复长度限制
  170. \think\Db::raw('GROUP_CONCAT(DISTINCT CASE WHEN 工序名称 = "车缝" THEN SUBSTRING(sczl_jtbh, 3, 2) END ORDER BY SUBSTRING(sczl_jtbh, 3, 2) SEPARATOR "、") AS 生产组别'),
  171. ])
  172. ->buildSql();
  173. $stockSub = \think\Db::table('库存_出入库明细')
  174. ->whereNull('Mod_rq') // 这里补上!
  175. ->group('order_id')
  176. ->field([
  177. 'order_id',
  178. 'MIN(CASE WHEN name = "入库" THEN rq END) AS 面料入库时间',
  179. ])
  180. ->buildSql();
  181. $list = \think\Db::table('工单_基本资料')
  182. ->alias('g')
  183. ->Join([$productSub => 'p'], 'g.订单编号 = p.订单编号')
  184. ->Join([$stockSub => 's'], 'g.订单编号 = s.order_id')
  185. ->where('g.落货日期', '>=', $start)
  186. ->where('g.落货日期', '<', $end)
  187. ->whereNull('g.Mod_rq')
  188. ->field([
  189. 'g.Uniqid',
  190. 'g.订单编号',
  191. 'g.审核 AS 核批',
  192. 'g.审核日期 AS 核批日期',
  193. 'g.接单日期 AS 下单日期',
  194. 'g.落货日期 AS 货期',
  195. 'g.生产款号 AS 款号',
  196. 'g.订单数量',
  197. 'g.工单入仓数量 AS 入库数量',
  198. 'g.款式',
  199. 'g.客户编号 AS 客人编号',
  200. 'g.辅料计划入库时间',
  201. 's.面料入库时间',
  202. 'p.开裁日期',
  203. 'p.实裁数量',
  204. 'p.上车位日期',
  205. 'p.车位完成日期',
  206. 'p.后道完成日期',
  207. 'p.已完成数量',
  208. 'p.生产组别',
  209. \think\Db::raw('NULL AS 辅料入库时间'),
  210. \think\Db::raw('NULL AS 台产'),
  211. \think\Db::raw('NULL AS 产前样批核'),
  212. \think\Db::raw('NULL AS 备注'),
  213. ])
  214. ->select();
  215. $dateFields = [
  216. '下单日期', '货期', '面料入库时间', '开裁日期',
  217. '上车位日期', '车位完成日期', '后道完成日期'
  218. ];
  219. foreach ($list as &$item) {
  220. foreach ($dateFields as $field) {
  221. $item[$field] = !empty($item[$field]) ? date('Y-m-d', strtotime($item[$field])) : null;
  222. }
  223. $item['实裁数量'] = (int)($item['实裁数量'] ?? 0);
  224. $item['已完成数量'] = (int)($item['已完成数量'] ?? 0);
  225. $item['订单数量'] = (int)($item['订单数量'] ?? 0);
  226. $item['入库数量'] = (int)($item['入库数量'] ?? 0);
  227. $item['生产组别'] = $item['生产组别'] ?? '';
  228. }
  229. return $this->success('成功', $list);
  230. }
  231. }