« Back to History
beam_manage_with_filter.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php error_reporting(E_ALL); ini_set('display_errors', 1); /* ================= AUTH + DB ================= */ require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('beam_manager'); $company_id = (int)$ctx['company_id']; $user_id = (int)$ctx['user']['id']; $pdo = $ctx['pdo']; require_once __DIR__ . '/helpers/activity_helper.php'; function h($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } $msg = $err = ''; /* ================= MACHINE FILTER ================= */ $selected_machine = $_GET['machine_no'] ?? ''; /* ================= ACTION HANDLER ================= */ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; $beam_no = (int)($_POST['beam_no'] ?? 0); $machine_no = $_POST['machine_no'] ?? ''; $slot = $_POST['slot'] ?? ''; $date = $_POST['action_date'] ?? ''; try { if (!$beam_no || !$machine_no || !$slot) { throw new Exception('Invalid input.'); } if (!$date) { throw new Exception('Date required.'); } $pdo->beginTransaction(); /* Ensure lifecycle row exists */ $pdo->prepare(" INSERT INTO beam_life_cycle (beam_no) VALUES (?) ON DUPLICATE KEY UPDATE beam_no = beam_no ")->execute([$beam_no]); /* Fetch lifecycle JSON FOR UPDATE */ $lcStmt = $pdo->prepare(" SELECT life_events FROM beam_life_cycle WHERE beam_no = ? FOR UPDATE "); $lcStmt->execute([$beam_no]); $lifeJson = $lcStmt->fetchColumn(); $events = $lifeJson ? json_decode($lifeJson, true) : []; if (!is_array($events)) $events = []; /* Find last open running event */ $runIndex = null; for ($i = count($events) - 1; $i >= 0; $i--) { $ev = $events[$i] ?? null; if (!is_array($ev)) continue; if ( (string)($ev['machine_no'] ?? '') === (string)$machine_no && ($ev['slot'] ?? '') === $slot && !isset($ev['cut_date']) && !isset($ev['finish_date']) && (($ev['action'] ?? '') === 'running') ) { $runIndex = $i; break; } } if ($runIndex === null) { throw new Exception("Open running lifecycle not found."); } /* Remove beam from machine */ $col = ($slot === 'primary') ? 'primary_running_beam' : 'secondary_running_beam'; $pdo->prepare(" UPDATE machine_beam_status SET $col = NULL WHERE company_id = ? AND machine_no = ? ")->execute([$company_id, $machine_no]); if ($action === 'cut') { $pdo->prepare(" UPDATE company_beam_stock SET load_type = 'stock', beam_load_date = NULL WHERE company_id = ? AND beam_no = ? ")->execute([$company_id, $beam_no]); $events[$runIndex]['cut_date'] = $date; $events[$runIndex]['action'] = 'cut'; $msg = "Beam $beam_no CUT on $date."; } elseif ($action === 'finish') { $pdo->prepare(" UPDATE company_beam_stock SET load_type = 'finished' WHERE company_id = ? AND beam_no = ? ")->execute([$company_id, $beam_no]); $events[$runIndex]['finish_date'] = $date; $events[$runIndex]['action'] = 'finish'; $events[$runIndex]['machine_id'] = (string)$machine_no; $msg = "Beam $beam_no FINISHED on $date."; } else { throw new Exception('Invalid action.'); } /* Save lifecycle JSON */ $pdo->prepare(" UPDATE beam_life_cycle SET life_events = ? WHERE beam_no = ? ")->execute([ json_encode($events, JSON_UNESCAPED_UNICODE), $beam_no ]); $pdo->commit(); if ($action === 'cut') { activity_status_change('beam', 'beam_manager_cut', $beam_no, 'Beam cut on machine'); } else { activity_status_change('beam', 'beam_manager_finish', $beam_no, 'Beam finished on machine'); } } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $err = $e->getMessage(); } } /* ================= VIEW DATA ================= */ /* Machine list */ $machines = $pdo->prepare(" SELECT machine_no FROM machine_beam_status WHERE company_id = ? ORDER BY machine_no "); $machines->execute([$company_id]); $machine_list = $machines->fetchAll(PDO::FETCH_COLUMN); /* Main query */ $sql = " SELECT * FROM machine_beam_status WHERE company_id = ? "; $params = [$company_id]; if ($selected_machine !== '') { $sql .= " AND machine_no = ?"; $params[] = $selected_machine; } $sql .= " ORDER BY machine_no"; $st = $pdo->prepare($sql); $st->execute($params); $rows = $st->fetchAll(PDO::FETCH_ASSOC); /* ================= VIEW ================= */ require_once __DIR__ . '/partials/header.php'; ?> <div class="container py-4"> <h3 class="mb-4">Beam Manager</h3> <div class="card mb-4"> <div class="card-body"> <form method="get" class="row g-3"> <div class="col-md-4"> <label class="form-label">Machine</label> <select name="machine_no" class="form-select" onchange="this.form.submit()"> <option value="">All Machines</option> <?php foreach ($machine_list as $m): ?> <option value="<?=h($m)?>" <?=($m===$selected_machine?'selected':'')?>> <?=h($m)?> </option> <?php endforeach; ?> </select> </div> </form> </div> </div> <?php if ($msg): ?> <div class="alert alert-success"><?=h($msg)?></div> <?php endif; ?> <?php if ($err): ?> <div class="alert alert-danger"><?=h($err)?></div> <?php endif; ?> <div class="card"> <div class="table-responsive"> <table class="table table-bordered table-hover align-middle mb-0"> <thead class="table-light"> <tr> <th>Machine</th> <th>Slot</th> <th>Beam</th> <th>Action</th> </tr> </thead> <tbody> <?php foreach ($rows as $r): ?> <?php foreach (['primary','secondary'] as $slot): $beam = $r[$slot.'_running_beam'] ?? null; if (!$beam) continue; ?> <tr> <td><?=h($r['machine_no'])?></td> <td> <span class="badge <?= $slot==='primary'?'bg-primary':'bg-secondary' ?>"> <?=ucfirst($slot)?> </span> </td> <td><strong><?=h($beam)?></strong></td> <td> <form method="post" class="row g-2 align-items-center"> <input type="hidden" name="beam_no" value="<?=$beam?>"> <input type="hidden" name="machine_no" value="<?=$r['machine_no']?>"> <input type="hidden" name="slot" value="<?=$slot?>"> <div class="col-auto"> <input type="date" name="action_date" class="form-control form-control-sm" required> </div> <div class="col-auto"> <button name="action" value="cut" class="btn btn-danger btn-sm"> Cut </button> </div> <div class="col-auto"> <button name="action" value="finish" class="btn btn-warning btn-sm"> Finish </button> </div> <div class="col-auto"> <a class="btn btn-primary btn-sm" href="/erp/beam_load.php?beam_no=<?=$beam?>&beam_slot=<?=$slot?>"> Load </a> </div> </form> </td> </tr> <?php endforeach; ?> <?php endforeach; ?> </tbody> </table> </div> </div> </div> <?php require_once __DIR__ . '/partials/footer.php'; ?>