lookup = StatisticsColumnGetData([]); } public function getColumnHtml(int $locationId): string { if (!isset($this->lookup[$locationId])) return ''; if ($this->lookup[$locationId]['hasChild'] ?? false) { $child = <<↓{$this->lookup[$locationId]['clientCountSum']}) EOF; } else { $child = ''; } return <<  {$this->lookup[$locationId]['clientCount']}  $child EOF; } public function getEditUrl(int $locationId): string { return ''; } public function header(): string { return Dictionary::translateFileModule('statistics', 'module', 'location-column-header-count'); } public function priority(): int { return 800; } } class ClientLoadLocationColumn extends AbstractLocationColumn { private $lookup; public function __construct() { $this->lookup = StatisticsColumnGetData([]); } public function getColumnHtml(int $locationId): string { if (!isset($this->lookup[$locationId]) || $this->lookup[$locationId]['clientCount'] === 0) return ''; $c =& $this->lookup[$locationId]; return << {$c['clientLoad']} % EOF; } public function getEditUrl(int $locationId): string { return ''; } public function header(): string { return Dictionary::translateFileModule('statistics', 'module', 'location-column-header-load'); } public function priority(): int { return 900; } } function StatisticsColumnGetData(array $allowedLocationIds): array { static $data = []; if (!empty($data)) return $data; $extra = ''; if (in_array(0, $allowedLocationIds)) { $extra = ' OR locationid IS NULL'; } $locs = Location::getLocationsAssoc(); $res = Database::simpleQuery("SELECT m.locationid, Count(*) AS cnt, Sum(If(m.state = 'OCCUPIED', 1, 0)) AS used, Sum(If(m.state = 'IDLE', 1, 0)) AS idle FROM machine m WHERE (locationid IN (:allowedLocationIds) $extra) GROUP BY locationid", compact('allowedLocationIds')); foreach ($res as $row) { $locId = (int)$row['locationid']; $data[$locId] = [ 'clientCount' => $row['cnt'], 'clientLoad' => round(100 * $row['used'] / $row['cnt']), 'clientIdle' => round(100 * ($row['used'] + $row['idle']) / $row['cnt']), ]; } foreach ($allowedLocationIds as $locId) { if (isset($data[$locId])) continue; $data[$locId] = [ 'clientCount' => 0, 'clientLoad' => 0, 'clientIdle' => 0, ]; } foreach ($data as $locId => &$loc) { if (!in_array($locId, $allowedLocationIds)) continue; if (!isset($loc['clientCountSum'])) { $loc['clientCountSum'] = 0; } $loc['clientCountSum'] += $loc['clientCount']; if ($locId !== 0) { foreach ($locs[$locId]['parents'] as $pid) { if (!in_array($pid, $allowedLocationIds)) continue; $data[$pid]['hasChild'] = true; if (!isset($data[$pid]['clientCountSum'])) { $data[$pid]['clientCountSum'] = 0; } $data[$pid]['clientCountSum'] += $loc['clientCount']; } } } unset($loc); return $data; } StatisticsColumnGetData($allowedLocationIds); return [new ClientCountLocationColumn(), new ClientLoadLocationColumn()];