Index.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Controller;
  5. use think\Db;
  6. /**
  7. * 达成大屏数据接口
  8. */
  9. class Index extends Controller{
  10. protected $noNeedLogin = ['*'];
  11. protected $noNeedRight = ['*'];
  12. /**首页*/
  13. public function index(){$this->success('成功');}
  14. /**
  15. *当日班组报工产量【缓存】
  16. */
  17. public function GroupProductionRedis(){
  18. // 存缓存到 Redis
  19. $redis = redis();
  20. $redis_key = md5('GroupProductionRedis');
  21. // 获取当天的日期
  22. $todays = date('Y-m-d'); // 30天前
  23. // $today = date('Y-m-d'); // 当天日期
  24. // 自定义需要显示的生产工序顺序
  25. $customGroups = ['裁剪', '车缝', '手工', '大烫', '总检', '包装'];
  26. // 获取所有设备资料,并按自定义工序顺序过滤
  27. $Machine = db('设备_基本资料')
  28. ->field('生产工序, 设备编组')
  29. ->whereIn('生产工序', $customGroups)
  30. ->select();
  31. // 查询当天设备产量数据
  32. $res = db('设备_产量计酬')->alias('c')
  33. ->field('c.sczl_bh, SUM(c.数量) as 数量, c.工序名称')
  34. // ->where('c.Sys_rq', $today)
  35. ->group('c.sczl_bh')
  36. ->select();
  37. // 将产量数据转换为以设备编组为键的数组,并去除空格,方便合并
  38. $resIndexed = [];
  39. foreach ($res as $item) {
  40. $key = trim($item['sczl_bh']); // 去除空格
  41. $resIndexed[$key] = $item['数量'];
  42. }
  43. // 初始化结果数组,确保所有设备编组都有数量数据
  44. $mergedData = [];
  45. foreach ($Machine as $machine) {
  46. $groupName = trim($machine['设备编组']); // 去除空格
  47. $mergedData[] = [
  48. '工序名称' => $machine['生产工序'],
  49. '组别' => $groupName,
  50. '数量' => isset($resIndexed[$groupName]) ? $resIndexed[$groupName] : 0 // 更新数量
  51. ];
  52. }
  53. // 对 $mergedData 进行排序,先按生产工序的自定义顺序排序,再按设备编组的自然顺序排序
  54. usort($mergedData, function ($a, $b) use ($customGroups) {
  55. // 按生产工序自定义顺序排序
  56. $groupOrderA = array_search($a['工序名称'], $customGroups);
  57. $groupOrderB = array_search($b['工序名称'], $customGroups);
  58. if ($groupOrderA === $groupOrderB) {
  59. // 在同一生产工序内按设备编号自然排序
  60. return strnatcmp($a['组别'], $b['组别']);
  61. }
  62. return $groupOrderA - $groupOrderB;
  63. });
  64. $redis->set($redis_key, json_encode($mergedData));
  65. echo date("Y-m-d H:i:s").'存进去了';
  66. return $mergedData;
  67. }
  68. //车缝
  69. public function GroupMachineCFyi()
  70. {
  71. $redis = redis();
  72. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  73. // 初始化小组名称和数量
  74. $categories = [];
  75. $dataSeries = [];
  76. // 遍历数据,找到所有工序名称为“车缝”的小组,且不属于“大办组”、“小芬组”、“美英组”
  77. foreach ($row as $data) {
  78. if ($data['工序名称'] === '车缝' && $data['组别'] != '大办组' && $data['组别'] != '小芬组' && $data['组别'] != '美英组') {
  79. $categories[] = $data['组别']; // 添加组别到分类中
  80. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  81. }
  82. }
  83. // 构建输出数据格式
  84. $list = [
  85. 'categories' => $categories,
  86. 'series' => [
  87. [
  88. 'name' => '完成',
  89. 'data' => array_values($dataSeries) // 获取数量数组
  90. ]
  91. ]
  92. ];
  93. $res = [
  94. 'status' => 0,
  95. 'msg' => '',
  96. 'data' => $list
  97. ];
  98. // 返回 JSON 格式的结果
  99. return json($res);
  100. }
  101. // 板房车缝
  102. public function GroupMachinebfCFyi()
  103. {
  104. $redis = redis();
  105. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  106. // 初始化小组名称和数量
  107. $categories = [];
  108. $dataSeries = [];
  109. // 遍历数据,找到所有工序名称为“车缝”的小组,且只包含“大办组”、“小芬组”、“美英组”
  110. foreach ($row as $data) {
  111. if ($data['工序名称'] === '车缝' && in_array($data['组别'], ['大办组', '小芬组', '美英组'])) {
  112. $categories[] = $data['组别']; // 添加组别到分类中
  113. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  114. }
  115. }
  116. // 构建输出数据格式
  117. $list = [
  118. 'categories' => $categories,
  119. 'series' => [
  120. [
  121. 'name' => '完成',
  122. 'data' => array_values($dataSeries) // 获取数量数组
  123. ]
  124. ]
  125. ];
  126. $res = [
  127. 'status' => 0,
  128. 'msg' => '',
  129. 'data' => $list
  130. ];
  131. // 返回 JSON 格式的结果
  132. return json($res);
  133. }
  134. //裁剪
  135. public function GroupMachineCJyi()
  136. {
  137. $redis = redis();
  138. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  139. // 初始化小组名称和数量
  140. $categories = [];
  141. $dataSeries = [];
  142. // 遍历数据,找到所有工序名称为“车缝”的小组
  143. foreach ($row as $data) {
  144. if ($data['工序名称'] !== '车缝') {
  145. $categories[] = $data['组别']; // 添加组别到分类中
  146. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  147. }
  148. }
  149. // 构建输出数据格式
  150. $list = [
  151. 'categories' => $categories,
  152. 'series' => [
  153. [
  154. 'name' => '完成',
  155. 'data' => array_values($dataSeries) // 获取数量数组
  156. ]
  157. ]
  158. ];
  159. $res = [
  160. 'status' => 0,
  161. 'msg' => '',
  162. 'data' => $list
  163. ];
  164. // 返回 JSON 格式的结果
  165. return json($res);
  166. }
  167. //手工
  168. public function GroupMachineSGyi()
  169. {
  170. $redis = redis();
  171. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  172. // 初始化小组名称和数量
  173. $categories = [];
  174. $dataSeries = [];
  175. // 遍历数据,找到所有工序名称为“车缝”的小组
  176. foreach ($row as $data) {
  177. if ($data['工序名称'] === '手工') {
  178. $categories[] = $data['组别']; // 添加组别到分类中
  179. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  180. }
  181. }
  182. // 构建输出数据格式
  183. $list = [
  184. 'categories' => $categories,
  185. 'series' => [
  186. [
  187. 'name' => '完成',
  188. 'data' => array_values($dataSeries) // 获取数量数组
  189. ]
  190. ]
  191. ];
  192. $res = [
  193. 'status' => 0,
  194. 'msg' => '',
  195. 'data' => $list
  196. ];
  197. // 返回 JSON 格式的结果
  198. return json($res);
  199. }
  200. //大烫
  201. public function GroupMachineDTyi()
  202. {
  203. $redis = redis();
  204. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  205. // 初始化小组名称和数量
  206. $categories = [];
  207. $dataSeries = [];
  208. // 遍历数据,找到所有工序名称为“车缝”的小组
  209. foreach ($row as $data) {
  210. if ($data['工序名称'] === '大烫') {
  211. $categories[] = $data['组别']; // 添加组别到分类中
  212. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  213. }
  214. }
  215. // 构建输出数据格式
  216. $list = [
  217. 'categories' => $categories,
  218. 'series' => [
  219. [
  220. 'name' => '完成',
  221. 'data' => array_values($dataSeries) // 获取数量数组
  222. ]
  223. ]
  224. ];
  225. $res = [
  226. 'status' => 0,
  227. 'msg' => '',
  228. 'data' => $list
  229. ];
  230. // 返回 JSON 格式的结果
  231. return json($res);
  232. }
  233. //总检
  234. public function GroupMachineZJyi()
  235. {
  236. $redis = redis();
  237. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  238. // 初始化小组名称和数量
  239. $categories = [];
  240. $dataSeries = [];
  241. // 遍历数据,找到所有工序名称为“车缝”的小组
  242. foreach ($row as $data) {
  243. if ($data['工序名称'] === '总检') {
  244. $categories[] = $data['组别']; // 添加组别到分类中
  245. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  246. }
  247. }
  248. // 构建输出数据格式
  249. $list = [
  250. 'categories' => $categories,
  251. 'series' => [
  252. [
  253. 'name' => '完成',
  254. 'data' => array_values($dataSeries) // 获取数量数组
  255. ]
  256. ]
  257. ];
  258. $res = [
  259. 'status' => 0,
  260. 'msg' => '',
  261. 'data' => $list
  262. ];
  263. // 返回 JSON 格式的结果
  264. return json($res);
  265. }
  266. //包装
  267. public function GroupMachineBZyi()
  268. {
  269. $redis = redis();
  270. $row = json_decode($redis->get(md5('GroupProductionRedis')), true);
  271. // 初始化小组名称和数量
  272. $categories = [];
  273. $dataSeries = [];
  274. // 遍历数据,找到所有工序名称为“车缝”的小组
  275. foreach ($row as $data) {
  276. if ($data['工序名称'] === '包装') {
  277. $categories[] = $data['组别']; // 添加组别到分类中
  278. $dataSeries[$data['组别']] = $data['数量']; // 更新小组数量
  279. }
  280. }
  281. // 构建输出数据格式
  282. $list = [
  283. 'categories' => $categories,
  284. 'series' => [
  285. [
  286. 'name' => '完成',
  287. 'data' => array_values($dataSeries) // 获取数量数组
  288. ]
  289. ]
  290. ];
  291. $res = [
  292. 'status' => 0,
  293. 'msg' => '',
  294. 'data' => $list
  295. ];
  296. // 返回 JSON 格式的结果
  297. return json($res);
  298. }
  299. /**
  300. * 在产订单工序完工详情【缓存】
  301. */
  302. public function getJhzByRedis(){
  303. //存缓存Redis
  304. $redis = redis();
  305. $redis_key = md5('getJhzByRedis');
  306. // 定义固定工序名称
  307. $processNames = ['裁剪', '车缝', '手工', '大烫', '总检', '包装'];
  308. $startTime = date('Y-m-d', strtotime('-30 days'));
  309. $endTime = date('Y-m-d');
  310. $where['c.Sys_rq'] = ['between', [$startTime, $endTime]];
  311. $where['j.出库日期'] = ['<>', 'NULL'];
  312. $where['c.mod_rq'] = null;
  313. // 第一个查询:获取完工数量
  314. $list = \db('工单_基本资料')->alias('j')
  315. ->join('设备_产量计酬 c', 'j.订单编号 = c.订单编号', 'LEFT')
  316. ->field('c.订单编号, j.工单入仓数量, j.客户编号, j.生产款号, j.款式, c.工序名称, sum(c.数量) as 完工数量, j.gd_statu as 订单状态')
  317. ->where($where)
  318. ->group('c.订单编号, c.工序名称')
  319. ->having('完工数量 > 0')
  320. ->select();
  321. // 第二个查询:获取制单数
  322. $yjwhere['y.Mod_rq'] = null;
  323. $yjlist = \db('工单_基本资料')->alias('j')
  324. ->join('工单_印件资料 y', 'j.订单编号 = y.订单编号', 'LEFT')
  325. ->field('y.订单编号, SUM(y.zdtotal) as 制单数')
  326. ->where($yjwhere)
  327. ->group('y.订单编号')
  328. ->select();
  329. // 将制单数结果转换为以订单编号为键的数组,方便后续合并
  330. $yjlistIndexed = [];
  331. foreach ($yjlist as $yj) {
  332. $yjlistIndexed[$yj['订单编号']] = $yj['制单数'];
  333. }
  334. // 合并数据
  335. $mergedData = [];
  336. foreach ($list as $order) {
  337. $orderId = $order['订单编号'];
  338. // 初始化订单数据,如果还未存在
  339. if (!isset($mergedData[$orderId])) {
  340. // 获取制单数和已完工数量
  341. $zdTotal = $yjlistIndexed[$orderId] ?? 0; // 制单数
  342. $completedTotal = $order['工单入仓数量']; // 已完工数量
  343. // 计算完成百分比
  344. $completionPercentage = $zdTotal > 0 ? round(($completedTotal / $zdTotal) * 100, 2) . '%' : '0%';
  345. // 初始化订单数据
  346. $mergedData[$orderId] = [
  347. '订单编号' => $orderId,
  348. '客户编号' => $order['客户编号'],
  349. '生产款号' => $order['生产款号'],
  350. '款式' => $order['款式'],
  351. '订单状态' => $order['订单状态'],
  352. '已完工数量' => $completedTotal,
  353. '制单数' => $zdTotal,
  354. '完成百分比' => $completionPercentage, // 新增字段:完成百分比
  355. ];
  356. // 初始化所有工序的完工数量为空
  357. foreach ($processNames as $process) {
  358. $mergedData[$orderId][$process] = '';
  359. }
  360. }
  361. // 更新对应的工序名称和完工数量
  362. if (in_array($order['工序名称'], $processNames)) {
  363. $mergedData[$orderId][$order['工序名称']] = $order['完工数量'];
  364. }
  365. }
  366. // 转换合并后的数组格式
  367. $result = array_values($mergedData);
  368. $redis->set($redis_key, json_encode($result));
  369. echo date("Y-m-d H:i:s").'存进去了';
  370. return $result;
  371. }
  372. /**
  373. * 在产订单工序完工详情【接口】
  374. */
  375. public function getJhzBy(){
  376. $redis = redis();
  377. $row = json_decode($redis->get(md5('getJhzByRedis')), true);
  378. // 列定义
  379. $result['columns'] = [
  380. ['name' => '订单编号', 'id' => 'ddbh', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  381. ['name' => '客户编号', 'id' => 'khbh', 'width' => '6%', 'textAlign' => 'left'],
  382. ['name' => '生产款号', 'id' => 'sckh', 'width' => '6%', 'textAlign' => 'left'],
  383. ['name' => '款式', 'id' => 'ks', 'width' => '5%', 'textAlign' => 'left'],
  384. ['name' => '订单状态', 'id' => 'ddzt', 'width' => '6%', 'autoWrap' => "true", 'textAlign' => 'left'],
  385. ['name' => '裁剪已完成', 'id' => 'cj', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  386. ['name' => '车缝已完成', 'id' => 'cf', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  387. ['name' => '手工已完成', 'id' => 'sg', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  388. ['name' => '大烫已完成', 'id' => 'dt', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  389. ['name' => '总检已完成', 'id' => 'zj', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  390. ['name' => '包装已完成', 'id' => 'bz', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  391. ['name' => '已完成数量', 'id' => 'ywgsl', 'width' => '7%', 'autoWrap' => "true", 'textAlign' => 'left'],
  392. ['name' => '制单总数', 'id' => 'zds', 'width' => '6%', 'autoWrap' => "true", 'textAlign' => 'left'],
  393. ['name' => '完成百分比', 'id' => 'bfb', 'width' => '9%', 'autoWrap' => "true", 'textAlign' => 'left'],
  394. ];
  395. if ($row) {
  396. foreach ($row as $k => $v) {
  397. $result['rows'][$k]['ddbh'] = $v['订单编号'];
  398. $result['rows'][$k]['khbh'] = $v['客户编号'];
  399. $result['rows'][$k]['sckh'] = $v['生产款号'];
  400. $result['rows'][$k]['ks'] = $v['款式'];
  401. $result['rows'][$k]['ddzt'] = $v['订单状态'];
  402. // 工序数量字段,根据之前的定义调整字段名
  403. $result['rows'][$k]['cj'] = $v['裁剪'] ?? '';
  404. $result['rows'][$k]['cf'] = $v['车缝'] ?? '';
  405. $result['rows'][$k]['sg'] = $v['手工'] ?? '';
  406. $result['rows'][$k]['dt'] = $v['大烫'] ?? '';
  407. $result['rows'][$k]['zj'] = $v['总检'] ?? '';
  408. $result['rows'][$k]['bz'] = $v['包装'] ?? '';
  409. // 其他数量字段
  410. $result['rows'][$k]['ywgsl'] = $v['已完工数量'] ?? ''; // 示例字段,需确保与数据一致
  411. $result['rows'][$k]['zds'] = $v['制单数'] ?? ''; // 对应制单数
  412. $result['rows'][$k]['bfb'] = $v['完成百分比'] ?? ''; // 对应制单数
  413. }
  414. } else {
  415. // 如果没有数据,初始化空行
  416. $result['rows'][0] = [
  417. 'ddbh' => '', 'khbh' => '', 'sckh' => '', 'ks' => '', 'ddzt' => '',
  418. 'cj' => '', 'cf' => '', 'sg' => '', 'dt' => '', 'zj' => '', 'bz' => '',
  419. 'ywgsl' => '', 'zds' => ''
  420. ];
  421. }
  422. // echo "<pre>";print_r($result);echo "<pre>";die;
  423. $res['status'] = 0;
  424. $res['msg'] = '';
  425. $res['data'] = $result;
  426. return json($res);
  427. }
  428. /**
  429. *已制单样衣未审、已审核待生产、生产中未完成【缓存】
  430. */
  431. public function yscjDbToRedis(){
  432. //存缓存Redis
  433. $redis = redis();
  434. $redis_key = md5('yscjDbToRedis');
  435. $res = \db('工单_基本资料')
  436. ->where('sys_rq', '>=', date('Y-m-d', strtotime('-30 days')))
  437. ->select();
  438. $redis->set($redis_key, json_encode($res));
  439. echo date("Y-m-d H:i:s").'存进去了';
  440. return $res;
  441. }
  442. /**
  443. *已制单样衣未审【接口】
  444. * 订单已下单 未审核数量
  445. */
  446. public function yhcjDbToRedis(){
  447. $redis = redis();
  448. // 从 Redis 中获取数据
  449. $row = json_decode($redis->get(md5('yscjDbToRedis')), true);
  450. // 初始化计数器
  451. $count = 0;
  452. // 遍历数据,统计审核日期为空、mod_rq 为空、审核状态为空的数据
  453. foreach ($row as $item) {
  454. if (empty($item['审核日期']) && empty($item['Mod_rq']) && empty($item['审核'])) {
  455. $count++;
  456. }
  457. }
  458. // 构造返回数据
  459. $result = [
  460. 'name' => '已制单样衣未审',
  461. 'value' => $count,
  462. ];
  463. // 构造最终的返回结构
  464. $res = [
  465. 'status' => 0,
  466. 'msg' => '',
  467. 'data' => [$result],
  468. ];
  469. // 返回JSON格式的结果
  470. return json($res);
  471. }
  472. /**
  473. *已审核待生产【接口】
  474. */
  475. public function getYscjByRedis(){
  476. $redis = redis();
  477. // 从 Redis 中获取数据
  478. $row = json_decode($redis->get(md5('yscjDbToRedis')), true);
  479. // 初始化计数器
  480. $count = 0;
  481. // 遍历数据,统计审核日期为空、mod_rq 为空、审核状态为空的数据
  482. foreach ($row as $item) {
  483. if (empty($item['出库日期'])) {
  484. $count++;
  485. }
  486. }
  487. // 构造返回数据
  488. $result = [
  489. 'name' => '已审核待生产',
  490. 'value' => $count,
  491. ];
  492. // 构造最终的返回结构
  493. $res = [
  494. 'status' => 0,
  495. 'msg' => '',
  496. 'data' => [$result],
  497. ];
  498. // 返回JSON格式的结果
  499. return json($res);
  500. }
  501. /**
  502. *生产中未完成【缓存】
  503. */
  504. public function getJtClDbByRedis(){
  505. //存缓存Redis
  506. $redis = redis();
  507. $redis_key = md5('getJtClDbByRedis');
  508. $res = \db('工单_排程班次')
  509. ->alias('a')
  510. ->join('工单_印件资料 b','b.订单编号 = a.订单编号 AND a.子订单编号 = a.子订单编号')
  511. ->join('设备_产量计酬 c','a.订单编号 = c.订单编号 AND a.子订单编号 = c.子订单编号','LEFT')
  512. ->field('a.订单编号,a.子订单编号,b.款号,b.颜色,b.船样,b.zdtotal as 制单数,SUM(c.数量) as 已完成')
  513. ->where('a.mod_rq',null)
  514. ->select();
  515. $redis->set($redis_key, json_encode($res));
  516. echo date("Y-m-d H:i:s").'存进去了';
  517. return $res;
  518. }
  519. /**
  520. *生产中未完成【接口】
  521. */
  522. public function getYhcjByRedis(){
  523. $redis = redis();
  524. // 从 Redis 中获取数据
  525. $row = json_decode($redis->get(md5('getJtClDbByRedis')), true);
  526. // 初始化计数器
  527. $count = 0;
  528. // 遍历数据,统计未完成的记录条数
  529. foreach ($row as $item) {
  530. // 假设 '制单数' 是生产总数,'已完成' 是完成的数量
  531. if (isset($item['制单数']) && isset($item['已完成'])) {
  532. // 判断未完成数量是否大于0
  533. if ($item['制单数'] > $item['已完成']) {
  534. $count++;
  535. }
  536. }
  537. }
  538. // 构造返回数据
  539. $result = [
  540. 'name' => '生产中未完成',
  541. 'value' => $count,
  542. ];
  543. // 构造最终的返回结构
  544. $res = [
  545. 'status' => 0,
  546. 'msg' => '',
  547. 'data' => [$result],
  548. ];
  549. // 返回JSON格式的结果
  550. return json($res);
  551. }
  552. public function jtClDbToRedis(){
  553. }
  554. }