service === null) { $this->service = service('trafficservice'); } $this->addActionPaths(self::PATH); } protected function action_init_process(string $action): void { $fields = ['client', 'server', 'switch', 'server_ip', 'interface', 'ip', 'status']; $filters = ['status']; $batchjobFilters = $filters; $actionButtons = ['view' => ICONS['SEARCH'], 'dashboard' => ICONS['CHART']]; switch ($action) { case 'create': case 'create_form': case 'modify': case 'modify_form': break; case 'view': $fields = [...$fields, 'created_at']; break; case 'index': case 'download': $fields = [...$fields, 'created_at']; break; default: throw new \Exception("[{$action}] 지원하지 않는 action입니다."); // break; } $this->service->getFormService()->setFormFields($fields); $this->service->getFormService()->setFormRules($action, $fields); $this->service->getFormService()->setFormFilters($filters); $this->service->getFormService()->setFormOptions($filters); $this->service->getFormService()->setBatchjobFilters($batchjobFilters); $this->service->getFormService()->setActionButtons($actionButtons); parent::action_init_process($action); } protected function create_process(): TrafficEntity { return parent::create_process(); } protected function modify_form_process($uid): TrafficEntity { return parent::modify_form_process($uid); } protected function modify_process($uid): TrafficEntity { return parent::modify_process($uid); } protected function delete_process($uid): TrafficEntity { return parent::delete_process($uid); } protected function view_process($uid): TrafficEntity { return parent::view_process($uid); } protected function batchjob_process($uid, array $formDatas): TrafficEntity { return parent::batchjob_process($uid, $formDatas); } public function dashboard($uid): string { $entity = $this->service->getEntity($uid); if (!$entity instanceof TrafficEntity) { throw new \Exception(__METHOD__ . "에서 오류발생:{$uid}에 해당하는 트래픽정보를 찾을수없습니다."); } return $this->action_render_process( $this->getActionPaths(), self::PATH . DIRECTORY_SEPARATOR . __FUNCTION__, ['entity' => $entity] ); } /** * AJAX 요청을 처리하고, 모델에서 집계된 데이터를 JSON 형식으로 반환합니다. */ public function getAggregatedData($uid): ResponseInterface { $entity = $this->service->getEntity($uid); if (!$entity instanceof TrafficEntity) { throw new \Exception(__METHOD__ . "에서 오류발생:{$uid}에 해당하는 트래픽정보를 찾을수없습니다."); } $startDate = $this->request->getVar('startDate'); $endDate = $this->request->getVar('endDate'); // 입력값 검증 (실제 프로덕션에서는 반드시 수행해야 함) if (empty($startDate) || empty($endDate)) { return $this->response->setStatusCode(400)->setJSON([ 'status' => 'error', 'message' => '필수 파라미터(날짜 또는 집계 기준)가 누락되었습니다.', ]); } try { // 모델 로드 및 데이터 조회 $collectorService = service('collectorservice'); //기간의 시작 시점 (YYYY-MM-DD 00:00:00) 설정~기간의 종료 시점 (YYYY-MM-DD 23:59:59) 설정 $start_timestamp = $startDate . ' 00:00:00'; $end_timestamp = $endDate . ' 23:59:59'; $aggregateDatas = $collectorService->getAggregateDatas($entity, $start_timestamp, $end_timestamp); // 데이터를 JSON 형식으로 반환 return $this->response->setJSON([ 'message' => sprintf("[%s~%s] %s 트랙픽차트 ", $startDate, $endDate, $entity->getCustomTitle()), 'status' => 'success', 'data' => $aggregateDatas // 이 데이터는 이제 사용자가 제공한 필드 구조를 가집니다. ]); } catch (\Exception $e) { // 예외 처리 log_message('error', 'Traffic data aggregation error: ' . $e->getMessage()); return $this->response->setStatusCode(500)->setJSON([ 'status' => 'error', 'message' => '데이터 처리 중 서버 오류가 발생했습니다.', ]); } } }