Achievementatestatistics.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use Monolog\Handler\IFTTTHandler;
  5. use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  6. use think\Db;
  7. use think\Request;
  8. use PhpOffice\PhpSpreadsheet\IOFactory;
  9. class Achievementatestatistics extends Api
  10. {
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**
  14. * 1.1达成率统计->左侧菜单
  15. */
  16. public function Leftmenu(){
  17. // 获取所有部门(排除特定)
  18. $departments = Db::name('设备_基本资料')
  19. ->field('使用部门')
  20. ->whereNotIn('使用部门', ['打样室', '智能车间'])
  21. ->group('使用部门')
  22. ->select();
  23. // 部门名数组
  24. $deptList = array_map(function($item) {
  25. return trim($item['使用部门']);
  26. }, $departments);
  27. // 获取产量表日期
  28. $rawData = Db::name('设备_产量计酬')
  29. ->field("DATE(sys_rq) as rq")
  30. ->whereRaw("YEAR(sys_rq) >= 2000")
  31. ->order("rq desc")
  32. ->select();
  33. $workStats = [];
  34. $addedMonths = []; // 记录已处理年月
  35. foreach ($rawData as $item) {
  36. $rq = $item['rq'];
  37. $year = date('Y', strtotime($rq));
  38. $yearMonth = date('Ym', strtotime($rq));
  39. // 如果该年月还没加过,才添加
  40. if (!isset($addedMonths[$year][$yearMonth])) {
  41. $workStats[$year][$yearMonth] = $deptList;
  42. $addedMonths[$year][$yearMonth] = true;
  43. }
  44. }
  45. $result = [
  46. '排产计划达成率统计' => $departments,
  47. '设备工时达成率统计' => $workStats
  48. ];
  49. $this->success('成功',$result);
  50. }
  51. public function Machine_List()
  52. {
  53. if (!$this->request->isGet()) {
  54. $this->error('请求方式错误');
  55. }
  56. $param = $this->request->param();
  57. if (empty($param['Machine'])) {
  58. $this->error('缺少参数 Machine');
  59. }
  60. // 日期映射:近 7 天
  61. $dateMap = [];
  62. $recentDates = [];
  63. for ($i = 0; $i < 7; $i++) {
  64. $date = date('Y-m-d', strtotime("-{$i} days"));
  65. $label = date('m月d日', strtotime($date));
  66. $dateMap[$date] = $label;
  67. $recentDates[] = $date;
  68. }
  69. $devices = Db::name('设备_基本资料')
  70. ->field('设备编号, 设备名称')
  71. ->whereLike('使用部门', '%' . $param['Machine'] . '%')
  72. ->select();
  73. $results = [];
  74. foreach ($devices as $device) {
  75. $jtbh = $device['设备编号'];
  76. $jtname = trim($device['设备名称']);
  77. // 获取原始产量数据
  78. $records = Db::name('设备_产量计酬')
  79. ->field([
  80. 'sczl_bzdh as 班组',
  81. 'sczl_cl',
  82. 'sczl_Pgcl',
  83. 'sczl_rq as 日期',
  84. 'sczl_gdbh',
  85. 'sczl_yjno',
  86. 'sczl_gxh'
  87. ])
  88. ->where('sczl_jtbh', $jtbh)
  89. ->where('sczl_rq', '>=', date('Y-m-d 00:00:00', strtotime('-6 days')))
  90. ->where('sczl_rq', '<=', date('Y-m-d 23:59:59'))
  91. ->select();
  92. $stat = [];
  93. $summary = [];
  94. foreach ($records as $row) {
  95. $bz = $row['班组'] ?: '未分组';
  96. $rq = date('Y-m-d', strtotime($row['日期']));
  97. $cl = floatval($row['sczl_cl']);
  98. $pgcl = floatval($row['sczl_Pgcl']);
  99. $actual = ($cl == 0) ? 0 : (($pgcl > 0) ? $cl * $pgcl : $cl);
  100. // 查询排产产量
  101. $plan = Db::name('工单_工艺资料')
  102. ->where('Gy0_gdbh', $row['sczl_gdbh'])
  103. ->where('Gy0_yjno', $row['sczl_yjno'])
  104. ->where('Gy0_gxh', $row['sczl_gxh'])
  105. ->value('Gy0_计划接货数');
  106. $plan = floatval($plan);
  107. // 班组维度统计
  108. if (!isset($stat[$bz][$rq])) {
  109. $stat[$bz][$rq] = ['实际产量' => 0, '排产产量' => 0];
  110. }
  111. $stat[$bz][$rq]['实际产量'] += $actual;
  112. $stat[$bz][$rq]['排产产量'] += $plan;
  113. // 合计维度统计
  114. if (!isset($summary[$rq])) {
  115. $summary[$rq] = ['实际产量' => 0, '排产产量' => 0];
  116. }
  117. $summary[$rq]['实际产量'] += $actual;
  118. $summary[$rq]['排产产量'] += $plan;
  119. }
  120. // 输出每个班组
  121. foreach ($stat as $bz => $dateList) {
  122. $item = [
  123. '机台编号' => $jtbh,
  124. '机台名称' => $jtname,
  125. '班组' => $bz,
  126. '实际总产量' => 0,
  127. '排产总产量' => 0,
  128. '近7天综合达成率' => '0%'
  129. ];
  130. $i = 1;
  131. foreach ($dateMap as $date => $label) {
  132. $actual = isset($dateList[$date]) ? round($dateList[$date]['实际产量'], 2) : 0;
  133. $plan = isset($dateList[$date]) ? round($dateList[$date]['排产产量'], 2) : 0;
  134. $rate = ($plan > 0) ? round($actual / $plan * 100, 2) . '%' : '0%';
  135. $item[$label] = $rate;
  136. $item["实际产量{$i}"] = $actual;
  137. $item["排产产量{$i}"] = $plan;
  138. $item['实际总产量'] += $actual;
  139. $item['排产总产量'] += $plan;
  140. $i++;
  141. }
  142. $item['近7天综合达成率'] = ($item['排产总产量'] > 0)
  143. ? round($item['实际总产量'] / $item['排产总产量'] * 100, 2) . '%'
  144. : '0%';
  145. $results[] = $item;
  146. }
  147. // 合计行
  148. $item = [
  149. '机台编号' => $jtbh,
  150. '机台名称' => '合计',
  151. '班组' => '',
  152. '实际总产量' => 0,
  153. '排产总产量' => 0,
  154. '近7天综合达成率' => '0%'
  155. ];
  156. $i = 1;
  157. foreach ($dateMap as $date => $label) {
  158. $actual = isset($summary[$date]) ? round($summary[$date]['实际产量'], 2) : 0;
  159. $plan = isset($summary[$date]) ? round($summary[$date]['排产产量'], 2) : 0;
  160. // 重新计算达成率,不使用之前累加的百分比
  161. $rate = ($plan > 0) ? round($actual / $plan * 100, 2) . '%' : '0%';
  162. $item[$label] = $rate;
  163. $item["实际产量{$i}"] = $actual;
  164. $item["排产产量{$i}"] = $plan;
  165. $item['实际总产量'] += $actual;
  166. $item['排产总产量'] += $plan;
  167. $i++;
  168. }
  169. // 修正“近7天综合达成率”的计算
  170. $item['近7天综合达成率'] = ($item['排产总产量'] > 0)
  171. ? round($item['实际总产量'] / $item['排产总产量'] * 100, 2) . '%'
  172. : '0%';
  173. $results[] = $item;
  174. }
  175. $this->success('成功', [
  176. 'data' => $results,
  177. 'list' => $recentDates
  178. ]);
  179. }
  180. /**
  181. * 1.3达成率统计->机台生产详情
  182. */
  183. public function Machine_Detail()
  184. {
  185. if (!$this->request->isGet()) {
  186. $this->error('请求方式错误');
  187. }
  188. $param = $this->request->param();
  189. if (empty($param['jtbh']) || empty($param['bz'])) {
  190. // $this->error('缺少参数:jtbh(机台编号)或 bz(班组)');
  191. }
  192. $jtbh = $param['jtbh'];
  193. $bz = $param['bz'];
  194. // 查询近 7 天产量记录
  195. $records = Db::name('设备_产量计酬')->alias('a')
  196. ->field('
  197. a.sczl_rq as 日期,
  198. a.sczl_jtbh as 机台编号,
  199. a.sczl_bzdh as 班组,
  200. a.sczl_gdbh as 工单编号,
  201. a.sczl_yjno as 印件号,
  202. b.yj_yjmc as 印件名称,
  203. a.sczl_gxh as 工序号,
  204. a.sczl_gxmc as 工序名称,
  205. a.sczl_cl as 实际产量,
  206. c.排单小时定额 as 排产标准产能,
  207. d.Gy0_计划接货数 as 排产产量,
  208. a.sczl_设备运行工时 as 上报运行工时,
  209. a.sczl_装版总工时 as 装版实际工时,
  210. a.sczl_保养工时 as 保养工时,
  211. a.sczl_打样总工时 as 打样工时,
  212. d.版距 as 版距,
  213. c.设备名称 as 机台名称
  214. ')
  215. ->join('工单_印件资料 b','a.sczl_gdbh = b.Yj_Gdbh')
  216. ->join('设备_基本资料 c','a.sczl_jtbh = c.设备编号')
  217. ->join('工单_工艺资料 d','a.sczl_gdbh = d.Gy0_gdbh AND a.sczl_yjno = d.Gy0_yjno AND a.sczl_gxh = d.Gy0_gxh')
  218. ->where('a.sczl_jtbh', $jtbh)
  219. ->where('a.sczl_bzdh', $bz)
  220. ->where('a.sczl_rq', '>=', date('Y-m-d 00:00:00', strtotime('-6 days')))
  221. ->where('a.sczl_rq', '<=', date('Y-m-d 23:59:59'))
  222. ->order('a.sczl_rq desc')
  223. ->select();
  224. $details = [];
  225. foreach ($records as $row) {
  226. $rq = date('Y-m-d', strtotime($row['日期']));
  227. $details[] = [
  228. '日期' => $rq,
  229. '机台编号' => $row['机台编号'],
  230. '班组' => $row['班组'],
  231. '工单编号' => $row['工单编号'],
  232. '印件号' => $row['印件号'],
  233. '印件名称' => $row['印件名称'],
  234. '工序号' => $row['工序号'],
  235. '工序名称' => $row['工序名称'],
  236. '实际产量' => floatval($row['实际产量']),
  237. '排产标准产能' => $row['排产标准产能'],
  238. '排产产量' => floatval($row['排产产量']),
  239. '上报运行工时' => $row['上报运行工时'],
  240. '装版实际工时' => $row['装版实际工时'],
  241. '保养工时' => $row['保养工时'],
  242. '打样工时' => $row['打样工时'],
  243. '版距' => $row['版距'],
  244. '机台名称' => $row['机台名称'],
  245. ];
  246. }
  247. $this->success('明细获取成功', $details);
  248. }
  249. /**
  250. * 1.4达成率统计 -> 按月份汇总机台产量(按班组分组)
  251. */
  252. public function Machine_production_list()
  253. {
  254. if (!$this->request->isGet()) {
  255. $this->error('请求方式错误');
  256. }
  257. $param = $this->request->param();
  258. if (empty($param['Machine']) || empty($param['rq'])) {
  259. $this->error('参数错误');
  260. }
  261. $machine = $param['Machine'];
  262. $rq = $param['rq'];
  263. $ym = substr($rq, 0, 4) . '-' . substr($rq, 4, 2);
  264. // 查询设备编号
  265. $devices = Db::name('设备_基本资料')
  266. ->where('使用部门', $machine)
  267. ->column('设备编号');
  268. $devices = array_map('trim', $devices);
  269. // 查询产量记录
  270. $records = Db::name('设备_产量计酬')
  271. ->field([
  272. 'sczl_jtbh as 机台编号',
  273. 'sczl_bzdh as 班组',
  274. 'sczl_rq',
  275. 'sczl_cl',
  276. 'sczl_ls',
  277. 'sczl_rq',
  278. 'sczl_装版总工时 as 装板实际工时',
  279. 'sczl_装版工时 as 装板补产工时',
  280. 'sczl_保养工时 as 保养工时',
  281. 'sczl_打样总工时 as 打样总工时',
  282. 'sczl_打样工时 as 打样补产工时',
  283. 'sczl_异常停机工时 as 异常总工时',
  284. 'sczl_异常工时1 as 异常补时',
  285. 'sczl_设备运行工时 as 运行工时'
  286. ])
  287. ->whereIn('sczl_jtbh', $devices)
  288. ->where('sczl_rq', 'like', $ym . '%')
  289. ->select();
  290. $小时产能 = 50000;
  291. // 分组汇总:按 机台编号 + 班组
  292. $resultList = [];
  293. foreach ($records as $row) {
  294. $jtbh = $row['机台编号'];
  295. $bz = $row['班组'] ?: '未分组';
  296. $key = $jtbh . '|' . $bz;
  297. if (!isset($resultList[$key])) {
  298. $resultList[$key] = [
  299. '机台编号' => $jtbh,
  300. '班组' => $bz,
  301. '实际产量' => 0,
  302. '装板实际工时' => 0,
  303. '装板补产工时' => 0,
  304. '保养工时' => 0,
  305. '打样总工时' => 0,
  306. '打样补产工时' => 0,
  307. '异常总工时' => 0,
  308. '异常补时' => 0,
  309. '运行工时' => 0,
  310. 'sczl_rq' => date('Ym', strtotime($row['sczl_rq'])),
  311. // 新增字段
  312. '目标产量' => 0,
  313. '负荷产量' => 0,
  314. ];
  315. }
  316. // 累加字段
  317. $resultList[$key]['实际产量'] += floatval($row['sczl_cl']);
  318. $resultList[$key]['装板实际工时'] += floatval($row['装板实际工时']);
  319. $resultList[$key]['装板补产工时'] += floatval($row['装板补产工时']);
  320. $resultList[$key]['保养工时'] += floatval($row['保养工时']);
  321. $resultList[$key]['打样总工时'] += floatval($row['打样总工时']);
  322. $resultList[$key]['打样补产工时'] += floatval($row['打样补产工时']);
  323. $resultList[$key]['异常总工时'] += floatval($row['异常总工时']);
  324. $resultList[$key]['异常补时'] += floatval($row['异常补时']);
  325. $resultList[$key]['运行工时'] += floatval($row['运行工时']);
  326. }
  327. // 汇总并计算目标/负荷产量及达成率
  328. $grouped = []; // [机台编号 => [班组数据...]]
  329. foreach ($resultList as $item) {
  330. $jtbh = $item['机台编号'];
  331. $grouped[$jtbh][] = $item;
  332. }
  333. $finalList = [];
  334. foreach ($grouped as $jtbh => $rows) {
  335. $sum = [
  336. '机台编号' => $jtbh,
  337. '班组' => '合计',
  338. '实际产量' => 0,
  339. '装板实际工时' => 0,
  340. '装板补产工时' => 0,
  341. '保养工时' => 0,
  342. '打样总工时' => 0,
  343. '打样补产工时' => 0,
  344. '异常总工时' => 0,
  345. '异常补时' => 0,
  346. '运行工时' => 0,
  347. '目标产量' => 0,
  348. '负荷产量' => 0,
  349. 'sczl_rq' => $rows[0]['sczl_rq'] ?? '',
  350. ];
  351. foreach ($rows as &$row) {
  352. // 计算目标 & 负荷产量
  353. $有效工时 = max(0, $row['运行工时'] - $row['保养工时'] - $row['装板补产工时'] - $row['异常总工时']);
  354. $row['目标产量'] = round($有效工时 * $小时产能, 2);
  355. $row['负荷产量'] = $row['目标产量'];
  356. // 计算达成率 & 利用率
  357. $row['目标达成'] = ($row['目标产量'] > 0)
  358. ? round($row['实际产量'] / $row['目标产量'] * 100, 2) . '%'
  359. : '0%';
  360. $row['综合利用率'] = ($row['负荷产量'] > 0)
  361. ? round($row['实际产量'] / $row['负荷产量'] * 100, 2) . '%'
  362. : '0%';
  363. $finalList[] = $row;
  364. // 合计累加
  365. $sum['实际产量'] += $row['实际产量'];
  366. $sum['装板实际工时'] += $row['装板实际工时'];
  367. $sum['装板补产工时'] += $row['装板补产工时'];
  368. $sum['保养工时'] += $row['保养工时'];
  369. $sum['打样总工时'] += $row['打样总工时'];
  370. $sum['打样补产工时'] += $row['打样补产工时'];
  371. $sum['异常总工时'] += $row['异常总工时'];
  372. $sum['异常补时'] += $row['异常补时'];
  373. $sum['运行工时'] += $row['运行工时'];
  374. $sum['目标产量'] += $row['目标产量'];
  375. $sum['负荷产量'] += $row['负荷产量'];
  376. }
  377. // 合计达成率
  378. $sum['目标达成'] = ($sum['目标产量'] > 0)
  379. ? round($sum['实际产量'] / $sum['目标产量'] * 100, 2) . '%'
  380. : '0%';
  381. $sum['综合利用率'] = ($sum['负荷产量'] > 0)
  382. ? round($sum['实际产量'] / $sum['负荷产量'] * 100, 2) . '%'
  383. : '0%';
  384. $finalList[] = $sum;
  385. }
  386. $this->success('汇总成功', $finalList);
  387. }
  388. /**
  389. * 1.5达成率统计 -> 按日期+工单统计生产明细
  390. */
  391. public function Machine_production_details()
  392. {
  393. if (!$this->request->isGet()) {
  394. $this->error('请求方式错误');
  395. }
  396. $param = $this->request->param();
  397. if (empty($param['jtbh']) || empty($param['rq'])) {
  398. $this->error('缺少必要参数:jtbh(机台编号)、rq(年月)');
  399. }
  400. $jtbh = $param['jtbh'];
  401. $rq = $param['rq'];
  402. $ym = substr($rq, 0, 4) . '-' . substr($rq, 4, 2);
  403. // 查询该月份内该机台的每日工单产量明细
  404. $records = Db::name('设备_产量计酬')->alias('a')
  405. ->field([
  406. 'a.sczl_jtbh as 机台编号',
  407. 'a.sczl_rq as 日期',
  408. 'a.sczl_bzdh as 班组',
  409. 'a.sczl_gdbh as 工单编号',
  410. 'b.yj_yjmc as 印件名称',
  411. 'a.sczl_yjno as 印件号',
  412. 'a.sczl_gxh as 工序号',
  413. 'a.sczl_gxmc as 工序名称',
  414. 'a.sczl_ls',
  415. 'SUM(a.sczl_cl) as 实际产量',
  416. 'SUM(a.sczl_装版总工时) as 装版实际工时',
  417. 'SUM(a.sczl_装版工时) as 装版补产工时',
  418. 'SUM(a.sczl_保养工时) as 保养工时',
  419. 'SUM(a.sczl_打样总工时) as 打样总工时',
  420. 'SUM(a.sczl_打样工时) as 打样补产工时',
  421. 'SUM(a.sczl_异常停机工时) as 异常总工时',
  422. 'SUM(a.sczl_异常工时1) as 异常补时',
  423. 'SUM(a.sczl_设备运行工时) as 运行工时',
  424. 'c.排单小时定额 as 小时产能',
  425. 'c.平均车速'
  426. ])
  427. ->join('工单_印件资料 b', 'a.sczl_gdbh = b.Yj_Gdbh AND a.sczl_yjno = b.Yj_YjNo', 'LEFT') // 添加印件号关联条件
  428. ->join('设备_基本资料 c', 'a.sczl_jtbh = c.设备编号')
  429. ->where('a.sczl_jtbh', $jtbh)
  430. ->whereLike('a.sczl_rq', $ym . '%')
  431. ->group('a.sczl_rq, a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, a.sczl_jtbh ,a.sczl_bzdh') // 确保唯一性分组
  432. ->order('a.sczl_rq desc, a.sczl_bzdh')
  433. ->select();
  434. // 查询每个班组的运行工时
  435. $Operating_hours = \db('设备_产量计酬')
  436. ->field('sczl_rq as 日期,sczl_bzdh as 班组,sum(sczl_设备运行工时) as 设备运行工时')
  437. ->where('sczl_jtbh', $jtbh)
  438. ->whereLike('sczl_rq', $ym . '%')
  439. ->group('sczl_rq, sczl_bzdh')
  440. ->order('sczl_rq desc, sczl_bzdh')
  441. ->select();
  442. // 设备运行达成率设备运行工时计算规则:
  443. // 1.上报通电工时>8小时,设备运行工时=上报通电工时-1小时
  444. // 2.上报通电工时<8小时且上报通电工时>4小时,设备运行工时= 上报通电工时-0.5小时
  445. // 3.上报通电工时<4小时,设备运行工时 = 上报通电工时
  446. foreach ($Operating_hours as $k => $v) {
  447. if ($v['设备运行工时'] >= 8) {
  448. $Operating_hours[$k]['设备运行工时'] = $v['设备运行工时'] - 1;
  449. }elseif ($v['设备运行工时'] < 8 && $v['设备运行工时'] > 4) {
  450. $Operating_hours[$k]['设备运行工时'] = $v['设备运行工时'] - 0.5;
  451. }else{
  452. $Operating_hours[$k]['设备运行工时'] = $v['设备运行工时'];
  453. }
  454. }
  455. // 数据格式化与目标产量计算
  456. foreach ($records as $key => $row) {
  457. $records[$key]['日期'] = date('Y-m-d', strtotime($row['日期']));
  458. $records[$key]['印件工序'] = $row['印件号'] . '-' . $row['工序名称'];
  459. // 胶印设备换型工时(装版补产工时)计算规则:
  460. //1.按班次工单分开计算装版补产工时,基础计算规则:装版补产工时*1.7
  461. //2.当装版补产工时*1.7<实际装版工时*1.5时,按照装版补产工时*1.7计算
  462. //3.当装版补产工时*1.7>实际装版工时*1.5,按照实际装版工时*1.5计算
  463. //4.当装版补产工时>实际装版工时*1.5,按照装版补产工时计算
  464. if (strpos($row['机台编号'],'YJY') !== false) {
  465. $plate_hours = $row['装版补产工时'] * 1.7;
  466. $plate_mounting_hours = $row['装版实际工时'] * 1.5;
  467. if ($plate_hours < $plate_mounting_hours) {
  468. $records[$key]['装版补产工时'] = $plate_hours;
  469. }elseif ($plate_hours > $plate_mounting_hours) {
  470. $records[$key]['装版补产工时'] = $plate_mounting_hours;
  471. }elseif ($row['装版补产工时'] > $plate_mounting_hours) {
  472. $records[$key]['装版补产工时'] = $row['装版补产工时'];
  473. }else{
  474. $records[$key]['装版补产工时'] = $plate_hours;
  475. }
  476. }
  477. // 计算目标产量
  478. foreach ($Operating_hours as $k => $v) {
  479. if ($v['日期'] === $row['日期'] && $v['班组'] === $row['班组']) {
  480. //重新赋值运行工时
  481. $records[$key]['运行工时'] = $v['设备运行工时'];
  482. //计算目标产量
  483. $records[$key]['目标产量'] = round(
  484. max(0, $v['设备运行工时'] - $row['保养工时'] - $row['装版补产工时'] - $row['异常补时'] - $row['打样补产工时']) * $row['小时产能'],
  485. 2
  486. );
  487. // 计算负荷产量
  488. $records[$key]['负荷产量'] = round(
  489. max(0, $v['设备运行工时'] - $row['保养工时'] - $row['异常补时'] - $row['打样补产工时'] ) * $row['平均车速'],
  490. 2
  491. );
  492. // 计算目标达成率
  493. $records[$key]['目标达成'] = $records[$key]['目标产量'] > 0
  494. ? round($row['实际产量'] / $records[$key]['目标产量'] * 100, 2) . '%'
  495. : '0%';
  496. // 计算综合利用率
  497. $records[$key]['综合利用率'] = $records[$key]['负荷产量'] > 0
  498. ? round($row['实际产量'] / $records[$key]['负荷产量'] * 100, 2) . '%'
  499. : '0%';
  500. }
  501. }
  502. }
  503. $this->success('明细获取成功', $records);
  504. }
  505. /**
  506. * 1.6达成率统计->按时段导出Excel
  507. */
  508. public function Machine_date_excel()
  509. {
  510. if (!$this->request->isGet()) {
  511. $this->error('请求方式错误');
  512. }
  513. $param = $this->request->param();
  514. if (empty($param['start_rq']) || empty($param['end_rq']) || empty($param['bm'])) {
  515. $this->error('缺少参数:start_rq(开始日期)或 end_rq(结束日期)或 bm(部门)');
  516. }
  517. $start_rq = $param['start_rq'];
  518. $end_rq = $param['end_rq'];
  519. $bm = $param['bm'];
  520. // 1. 先查询设备_基本资料表,获取该部门下的所有设备编号(去重)
  521. $deviceIds = Db::name('设备_基本资料')
  522. ->where('使用部门', $bm)
  523. ->group('设备编号') // 去重
  524. ->column('设备编号');
  525. if (empty($deviceIds)) {
  526. $this->error('该部门下没有设备数据');
  527. }
  528. // 2. 查询设备_产量计酬表,筛选符合条件的记录
  529. $records = Db::name('设备_产量计酬')->alias('a')
  530. ->field([
  531. 'a.sczl_jtbh as 机台编号',
  532. 'a.sczl_rq as 日期',
  533. 'a.sczl_bzdh as 班组',
  534. 'a.sczl_gdbh as 工单编号',
  535. 'b.yj_yjmc as 印件名称',
  536. 'a.sczl_yjno as 印件号',
  537. 'a.sczl_gxh as 工序号',
  538. 'a.sczl_gxmc as 工序名称',
  539. 'a.sczl_ls',
  540. 'SUM(a.sczl_cl) as 实际产量',
  541. 'sczl_装版总工时 as 装板实际工时',
  542. 'sczl_装版工时 as 装板补产工时',
  543. 'sczl_保养工时 as 保养工时',
  544. 'sczl_打样总工时 as 打样总工时',
  545. 'sczl_打样工时 as 打样补产工时',
  546. 'sczl_异常停机工时 as 异常总工时',
  547. 'sczl_异常工时1 as 异常补时',
  548. 'sczl_设备运行工时 as 运行工时'
  549. ])
  550. ->join('工单_印件资料 b', 'a.sczl_gdbh = b.Yj_Gdbh')
  551. ->whereIn('a.sczl_jtbh', $deviceIds) // 使用设备编号列表筛选
  552. ->whereBetween('a.sczl_rq', [
  553. $start_rq . ' 00:00:00',
  554. $end_rq . ' 23:59:59'
  555. ])
  556. ->group('a.sczl_jtbh, a.sczl_rq, a.sczl_bzdh, a.sczl_gdbh') // 按设备、日期、班组、工单分组
  557. ->order('a.sczl_rq desc')
  558. ->select();
  559. // 格式化数据
  560. foreach ($records as &$row) {
  561. $row['日期'] = date('Y-m-d', strtotime($row['日期']));
  562. $row['印件工序'] = $row['印件号'] . '-' . $row['工序名称'];
  563. }
  564. $this->success('明细获取成功', $records);
  565. }
  566. }