diff --git a/app/Controllers/Article/Processible.php b/app/Controllers/Article/Processible.php index 7364cf6..533b346 100644 --- a/app/Controllers/Article/Processible.php +++ b/app/Controllers/Article/Processible.php @@ -7,210 +7,242 @@ use App\Models\article\ProcessibleModel; class Processible extends BaseController { - private $model; + private $model; - public function __construct() - { - $this->model = new ProcessibleModel(); - } + public function __construct() + { + $this->model = new ProcessibleModel(); + } - public function datecount(): string - { + public function datecount(): string + { - $sido = $this->model->getAreaList(); // 지역조회 + $sido = $this->model->getAreaList(); // 지역조회 - $this->data['sido'] = $sido; + $this->data['sido'] = $sido; - return view("pages/article/processible/datecount", $this->data); - } + return view("pages/article/processible/datecount", $this->data); + } - public function getList1() - { - $start = (int) $this->request->getGet('start') ?: 0; - $end = (int) $this->request->getGet('length') ?: 10; + public function getList1() + { + $start = (int) $this->request->getGet('start') ?: 0; + $end = (int) $this->request->getGet('length') ?: 10; - $data = [ - 'sdate' => $this->request->getGet('sdate'), // 시작일 - 'edate' => $this->request->getGet('edate'), // 종료일 - ]; + $data = [ + 'sdate' => $this->request->getGet('sdate'), // 시작일 + 'edate' => $this->request->getGet('edate'), // 종료일 + ]; - $totalCount = $this->model->getTotal1($data); + $totalCount = $this->model->getTotal1($data); - $datas = $this->model->getList1($start, $end, $data); + $datas = $this->model->getList1($start, $end, $data); - return $this->response->setJSON(body: [ - 'recordsTotal' => $totalCount, - 'recordsFiltered' => $totalCount, - 'data' => $datas, - ]); - } + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } - public function getList2() - { - // $start = (int) $this->request->getGet('start') ?: 0; - // $end = (int) $this->request->getGet('length') ?: 10; + public function getList2() + { + // $start = (int) $this->request->getGet('start') ?: 0; + // $end = (int) $this->request->getGet('length') ?: 10; - $data = [ - 'sdate' => $this->request->getGet('sdate'), // 시작일 - 'region' => $this->request->getGet('region'), // 종료일 - ]; + $data = [ + 'sdate' => $this->request->getGet('sdate'), // 시작일 + 'region' => $this->request->getGet('region'), // 종료일 + ]; - $totalCount = $this->model->getTotal2($data); + $totalCount = $this->model->getTotal2($data); - $datas = $this->model->getList2($data); + $datas = $this->model->getList2($data); - return $this->response->setJSON(body: [ - 'recordsTotal' => $totalCount, - 'recordsFiltered' => $totalCount, - 'data' => $datas, - ]); - } + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } - public function getList3() - { + public function getList3() + { - $data = [ - 'region' => $this->request->getGet('region'), // 종료일 - ]; + $data = [ + 'region' => $this->request->getGet('region'), // 종료일 + ]; - $totalCount = $this->model->getTotal3($data); + $totalCount = $this->model->getTotal3($data); - $datas = $this->model->getList3($data); + $datas = $this->model->getList3($data); - return $this->response->setJSON(body: [ - 'recordsTotal' => $totalCount, - 'recordsFiltered' => $totalCount, - 'data' => $datas, - ]); - } + return $this->response->setJSON(body: [ + 'recordsTotal' => $totalCount, + 'recordsFiltered' => $totalCount, + 'data' => $datas, + ]); + } // 엑셀다운로드 - public function excel() - { - try { + public function excel() + { + try { - $data = [ - 'sdate' => $this->request->getGet('sdate'), - 'edate' => $this->request->getGet('edate'), - ]; + $data = [ + 'sdate' => $this->request->getGet('sdate'), + 'edate' => $this->request->getGet('edate'), + ]; - $datas = $this->model->getExcelList($data); + $datas = $this->model->getExcelList($data); - return $this->response->setJSON(body: [ - 'data' => $datas, - ]); + return $this->response->setJSON(body: [ + 'data' => $datas, + ]); - } catch (\Exception $e) { - $e->getPrevious()->getTraceAsString(); + } catch (\Exception $e) { + $e->getPrevious()->getTraceAsString(); + } } - } // 지역별 수량 저장 public function saveArea() { log_message('info', '[Processible::saveArea] 진입'); + try { $rows = $this->request->getPost('rows'); $rows = json_decode($rows, true); - if (count($rows) > 0) { - // API 형식으로 변환 및 DB 저장을 한 번에 처리 - $syncSlotData = []; - foreach ($rows as $row) { - // DB 저장 - $this->model->saveArea($row); - // 동시에 API 데이터 구성 - $syncSlotData[] = [ - 'baseDate' => $row['sc_date'], - 'legalDivisionNumber' => $row['region_cd'], - 'slots' => [ - 'am' => [ - 'max' => (int) $row['am_cnt'], - 'reserved' => 0 - ], - 'pm' => [ - 'max' => (int) $row['pm_cnt'], - 'reserved' => 0 - ] - ] - ]; - } - log_message('info', '[Processible::saveArea] 슬롯 동기화 시작 | Count: ' . count($syncSlotData)); - $naverClient = new \App\Libraries\NaverApiClient(); - $apiResponse = $naverClient->syncSiteSlot($syncSlotData); - // API 응답 처리 - if ($apiResponse === null) { - log_message('error', '[Processible::saveArea] Naver API 슬롯 동기화 실패 | Data: ' . json_encode($syncSlotData, JSON_UNESCAPED_UNICODE)); - return $this->response->setJSON([ - 'code' => '1', - 'msg' => '저장은 완료되었으나 네이버 슬롯 동기화에 실패했습니다. 로그를 확인하세요.', - 'syncData' => $syncSlotData, - 'hint' => '로그 위치: writable/logs/ 에서 ERROR 확인' - ]); - } - log_message('info', '[Processible::saveArea] Naver API 슬롯 동기화 성공 | Response: ' . json_encode($apiResponse, JSON_UNESCAPED_UNICODE)); - return $this->response->setJSON([ - 'code' => '0', - 'msg' => 'success', - 'syncData' => $syncSlotData, - 'apiResponse' => $apiResponse - ]); - } else { + if (empty($rows)) { log_message('info', '[Processible::saveArea] 저장가능한 데이터가 없습니다.'); return $this->response->setJSON([ 'code' => '9', 'msg' => '저장가능한 데이터가 없습니다.' ]); } - } catch (\Exception $e) { - log_message('error', '[Processible::saveArea] 예외: ' . $e->getMessage()); - return $this->response->setJSON([ - 'code' => '9', - 'msg' => $e->getMessage(), - ]); - } - } - public function saveCount() - { - try { - $rows = $this->request->getPost('rows'); - $rows = json_decode($rows, true); - - if (count($rows) > 0) { + // API 형식으로 변환 및 DB 저장 + $syncSlotData = []; + foreach ($rows as $row) { + // DB 저장 (API 실패와 무관하게 저장됨) + $this->model->saveArea($row); + + // API 데이터 구성 + $syncSlotData[] = [ + 'baseDate' => $row['sc_date'], + 'legalDivisionNumber' => $row['region_cd'], + 'slots' => [ + 'am' => [ + 'max' => (int) $row['am_cnt'], + 'reserved' => 0 + ], + 'pm' => [ + 'max' => (int) $row['pm_cnt'], + 'reserved' => 0 + ] + ] + ]; + } - $results = []; + log_message('info', '[Processible::saveArea] DB 저장 완료 | Count: ' . count($rows)); + + // 네이버 API 슬롯 동기화 시도 + log_message('info', '[Processible::saveArea] 슬롯 동기화 시작 | Count: ' . count($syncSlotData)); + $naverClient = new \App\Libraries\NaverApiClient(); + $apiResponse = $naverClient->syncSiteSlot($syncSlotData); + + // API 응답 에러 체크 $hasError = false; + $errorMessage = ''; - foreach ($rows as $row): - $result = $this->model->saveCount($row); - $results[] = $result; - - if (!$result['success']) { + if ($apiResponse === null) { $hasError = true; - } - endforeach; - + $errorMessage = 'API 응답 없음 (null)'; + } elseif (!empty($apiResponse['error'])) { + $hasError = true; + $errorType = $apiResponse['error_type'] ?? 'UNKNOWN'; + $httpCode = $apiResponse['http_code'] ?? 'N/A'; + $errorMessage = "API Error: {$errorType} (HTTP {$httpCode})"; + } elseif (isset($apiResponse['http_code']) && $apiResponse['http_code'] >= 400) { + $hasError = true; + $errorMessage = "HTTP Error: {$apiResponse['http_code']}"; + } + + // API 에러 발생 시 (DB는 이미 저장됨) + if ($hasError) { + log_message('error', "[Processible::saveArea] {$errorMessage} | Response: " . json_encode($apiResponse, JSON_UNESCAPED_UNICODE)); + + return $this->response->setJSON([ + 'code' => '1', + 'msg' => 'DB 저장은 완료되었으나 네이버 슬롯 동기화에 실패했습니다. 관리자에게 문의하세요.', + 'error' => $errorMessage, + 'dbSaved' => true, + 'syncData' => $syncSlotData, + 'apiResponse' => $apiResponse + ]); + } + + // 성공 + log_message('info', '[Processible::saveArea] Naver API 슬롯 동기화 성공 | Response: ' . json_encode($apiResponse, JSON_UNESCAPED_UNICODE)); + return $this->response->setJSON([ - 'code' => $hasError ? '9' : '0', - 'msg' => $hasError ? '일부 저장 실패' : 'success', - 'debug' => $results // 디버깅 정보 포함 + 'code' => '0', + 'msg' => 'success', + 'dbSaved' => true, + 'syncData' => $syncSlotData, + 'apiResponse' => $apiResponse ]); - - } else { + + } catch (\Exception $e) { + log_message('error', '[Processible::saveArea] 예외 발생: ' . $e->getMessage()); return $this->response->setJSON([ - 'code' => '9', - 'msg' => '저장가능한 데이터가 없습니다.' + 'code' => '9', + 'msg' => '처리 중 오류가 발생했습니다: ' . $e->getMessage(), ]); } - - - } catch (\Exception $e) { - return $this->response->setJSON([ - 'code' => '9', - 'msg' => $e->getMessage(), - ]); } - } + public function saveCount() + { + try { + + $rows = $this->request->getPost('rows'); + $rows = json_decode($rows, true); + + if (count($rows) > 0) { + + $results = []; + $hasError = false; + + foreach ($rows as $row): + $result = $this->model->saveCount($row); + $results[] = $result; + + if (!$result['success']) { + $hasError = true; + } + endforeach; + + return $this->response->setJSON([ + 'code' => $hasError ? '9' : '0', + 'msg' => $hasError ? '일부 저장 실패' : 'success', + 'debug' => $results // 디버깅 정보 포함 + ]); + + } else { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => '저장가능한 데이터가 없습니다.' + ]); + } + + + } catch (\Exception $e) { + return $this->response->setJSON([ + 'code' => '9', + 'msg' => $e->getMessage(), + ]); + } + } } \ No newline at end of file diff --git a/app/Models/article/ProcessibleModel.php b/app/Models/article/ProcessibleModel.php index be7415e..d337884 100644 --- a/app/Models/article/ProcessibleModel.php +++ b/app/Models/article/ProcessibleModel.php @@ -6,318 +6,294 @@ use CodeIgniter\Model; class ProcessibleModel extends Model { // 지역 목록 조회 - public function getAreaList($sido = '', $gugun = '') - { + public function getAreaList($sido = '', $gugun = '') + { - if (!empty($gugun)) { - $gugun = substr($gugun, '0', '5'); + if (!empty($gugun)) { + $gugun = substr($gugun, '0', '5'); - $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" . - " FROM region_codes a" . - " LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" . - " WHERE a.region_cd LIKE concat(?, '%')" . - " AND a.region_cd NOT LIKE '%00000'" . - " AND a.region_cd LIKE '%00'" . - " AND a.use_yn = 'Y'" . - " ORDER BY a.region_nm ASC"; - - $query = $this->db->query($sql, [$gugun]); - - } else if (!empty($sido)) { - $chk_sido = substr($sido, '0', '2'); - - if ($chk_sido === '36') { - $sido = substr($sido, '0', '4'); - $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm " . - "FROM region_codes a " . - "LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,4),'000000') " . - "WHERE a.region_cd LIKE concat(?, '%') " . - "AND a.region_cd NOT LIKE '%000000' " . - "AND a.region_cd LIKE '%00' " . - "AND a.use_yn = 'Y' " . - "AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000')) " . - "ORDER BY a.region_nm ASC"; - } else { - $sido = substr($sido, '0', '2'); $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" . - " FROM region_codes a" . - " LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" . - " WHERE a.region_cd LIKE concat(?, '%')" . - " AND a.region_cd NOT LIKE '%00000000'" . - " AND a.region_cd LIKE '%00000'" . - " AND a.use_yn = 'Y'" . - " AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000'))" . - " ORDER BY a.region_nm ASC"; - } + " FROM region_codes a" . + " LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" . + " WHERE a.region_cd LIKE concat(?, '%')" . + " AND a.region_cd NOT LIKE '%00000'" . + " AND a.region_cd LIKE '%00'" . + " AND a.use_yn = 'Y'" . + " ORDER BY a.region_nm ASC"; - $query = $this->db->query($sql, [$sido]); - } else { - $sql = "SELECT a.region_cd, a.region_nm " . - "FROM region_codes a " . - "WHERE (a.region_cd LIKE '%00000000' " . - "AND a.use_yn = 'Y') " . - "OR region_cd = 3611000000;"; + $query = $this->db->query($sql, [$gugun]); - $query = $this->db->query($sql); + } else if (!empty($sido)) { + $chk_sido = substr($sido, '0', '2'); + + if ($chk_sido === '36') { + $sido = substr($sido, '0', '4'); + $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm " . + "FROM region_codes a " . + "LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,4),'000000') " . + "WHERE a.region_cd LIKE concat(?, '%') " . + "AND a.region_cd NOT LIKE '%000000' " . + "AND a.region_cd LIKE '%00' " . + "AND a.use_yn = 'Y' " . + "AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000')) " . + "ORDER BY a.region_nm ASC"; + } else { + $sido = substr($sido, '0', '2'); + $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" . + " FROM region_codes a" . + " LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" . + " WHERE a.region_cd LIKE concat(?, '%')" . + " AND a.region_cd NOT LIKE '%00000000'" . + " AND a.region_cd LIKE '%00000'" . + " AND a.use_yn = 'Y'" . + " AND EXISTS (SELECT 'x' FROM region_codes c WHERE c.region_cd LIKE CONCAT(SUBSTR(a.region_cd,1,5),'%') AND c.region_cd > CONCAT(SUBSTR(a.region_cd,1,5),'00000'))" . + " ORDER BY a.region_nm ASC"; + } + + $query = $this->db->query($sql, [$sido]); + } else { + $sql = "SELECT a.region_cd, a.region_nm " . + "FROM region_codes a " . + "WHERE (a.region_cd LIKE '%00000000' " . + "AND a.use_yn = 'Y') " . + "OR region_cd = 3611000000;"; + + $query = $this->db->query($sql); + } + + + return $query->getResultArray(); } - return $query->getResultArray(); - } + /** + * 일자별 처리가능 수량 + */ + public function getTotal1($data) + { + $sql = " + SELECT + COUNT(*) AS cnt + FROM + ( + SELECT + a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week + , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt + , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt + , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt + , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check + , sum(c.day_cnt) svc_count + FROM calendar a + LEFT JOIN service_count b on b.sc_date = '0000-00-00' + LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd + WHERE a.sol_date BETWEEN ? AND ? + GROUP BY a.sol_date ASC + ) AS a"; + $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); - /** - * 일자별 처리가능 수량 - */ - public function getTotal1($data) - { - $sql = " - SELECT - COUNT(*) AS cnt - FROM - ( - SELECT - a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week - , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt - , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt - , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt - , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check - , sum(c.day_cnt) svc_count - FROM calendar a - LEFT JOIN service_count b on b.sc_date = '0000-00-00' - LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd - WHERE a.sol_date BETWEEN ? AND ? - GROUP BY a.sol_date ASC - ) AS a"; + return $query->getRow()->cnt; + } - $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); + public function getList1($start, $end, $data) + { + $sql = "SELECT + a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week + , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt + , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt + , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt + , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check + , sum(c.day_cnt) svc_count + FROM calendar a + LEFT JOIN service_count b on b.sc_date = '0000-00-00' + LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd + WHERE a.sol_date BETWEEN ? AND ? + GROUP BY a.sol_date ASC "; - return $query->getRow()->cnt; - } + $sql .= "LIMIT {$start}, {$end}"; - public function getList1($start, $end, $data) - { - $sql = "SELECT - a.sol_date sc_date, DATE_FORMAT(a.sol_date, '%w') day_week - , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt - , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt - , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt - , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check - , sum(c.day_cnt) svc_count - FROM calendar a - LEFT JOIN service_count b on b.sc_date = '0000-00-00' - LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd - WHERE a.sol_date BETWEEN ? AND ? - GROUP BY a.sol_date ASC "; + $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); - $sql .= "LIMIT {$start}, {$end}"; - - $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); - - return $query->getResultArray(); - } + return $query->getResultArray(); + } /** * 지역별 수량 */ - public function getTotal2($data) - { - $sql = "SELECT - COUNT(*) AS cnt - FROM calendar a - LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%') - LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd - JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y' - WHERE a.sol_date = ? - ORDER BY d.region_nm"; + public function getTotal2($data) + { + $sql = "SELECT + COUNT(*) AS cnt + FROM calendar a + LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%') + LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd + JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y' + WHERE a.sol_date = ? + ORDER BY d.region_nm"; - $query = $this->db->query($sql, [$data['region'], $data['sdate']]); + $query = $this->db->query($sql, [$data['region'], $data['sdate']]); - return $query->getRow()->cnt; - } + return $query->getRow()->cnt; + } - public function getList2($data) - { - $sql = "SELECT - a.sol_date - , b.region_cd, d.region_nm - , c.am_cnt, b.am_cnt default_am_cnt - , c.pm_cnt, b.pm_cnt default_pm_cnt - , c.day_cnt, b.day_cnt default_day_cnt - FROM calendar a - LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%') - LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd - JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y' - WHERE a.sol_date = ? - ORDER BY d.region_nm"; + public function getList2($data) + { + $sql = "SELECT + a.sol_date + , b.region_cd, d.region_nm + , c.am_cnt, b.am_cnt default_am_cnt + , c.pm_cnt, b.pm_cnt default_pm_cnt + , c.day_cnt, b.day_cnt default_day_cnt + FROM calendar a + LEFT JOIN service_count b on b.sc_date = '0000-00-00' and b.region_cd LIKE CONCAT(SUBSTR(?,1,2),'%') + LEFT JOIN service_count c on c.sc_date = a.sol_date and c.region_cd = b.region_cd + JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y' + WHERE a.sol_date = ? + ORDER BY d.region_nm"; - $query = $this->db->query($sql, [$data['region'], $data['sdate']]); + $query = $this->db->query($sql, [$data['region'], $data['sdate']]); - return $query->getResultArray(); - } + return $query->getResultArray(); + } /** * 기본수량 */ - public function getTotal3($data) - { - $sql = "SELECT - COUNT(*) AS cnt - FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a - INNER JOIN region_codes b ON b.region_cd = a.region_cd - LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd - ORDER BY b.region_nm"; + public function getTotal3($data) + { + $sql = "SELECT + COUNT(*) AS cnt + FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a + INNER JOIN region_codes b ON b.region_cd = a.region_cd + LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd + ORDER BY b.region_nm"; - $query = $this->db->query($sql, [$data['region']]); + $query = $this->db->query($sql, [$data['region']]); - return $query->getRow()->cnt; - } + return $query->getRow()->cnt; + } - public function getList3($data) - { - $sql = "SELECT - b.region_cd, b.region_nm, IFNULL(c.am_cnt,0)am_cnt, IFNULL(c.pm_cnt,0) pm_cnt - FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a - INNER JOIN region_codes b ON b.region_cd = a.region_cd - LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd - ORDER BY b.region_nm"; + public function getList3($data) + { + $sql = "SELECT + b.region_cd, b.region_nm, IFNULL(c.am_cnt,0)am_cnt, IFNULL(c.pm_cnt,0) pm_cnt + FROM (SELECT DISTINCT CONCAT(SUBSTR(aa.region_cd, 1, 5), '00000') region_cd FROM region_codes aa WHERE aa.region_cd like CONCAT(SUBSTR(?,1,2),'%') AND aa.region_cd NOT LIKE '%00000000' AND aa.dept_sq != 0 AND aa.use_yn = 'Y') a + INNER JOIN region_codes b ON b.region_cd = a.region_cd + LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd + ORDER BY b.region_nm"; - $query = $this->db->query($sql, [$data['region']]); + $query = $this->db->query($sql, [$data['region']]); - return $query->getResultArray(); - } + return $query->getResultArray(); + } // 일자별 수량 엑셀 - public function getExcelList($data) - { - $sql = "SELECT - a.sol_date sc_date - , CASE WHEN DATE_FORMAT(a.sol_date, '%w') = 'N' THEN '기본지정' ELSE '별도지정' END AS sc_type - , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt - , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt - , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt - , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check - , sum(c.day_cnt) svc_count - FROM calendar a - LEFT JOIN service_count b on b.sc_date = '0000-00-00' - LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd - WHERE a.sol_date BETWEEN ? AND ? - GROUP BY a.sol_date ASC"; + public function getExcelList($data) + { + $sql = "SELECT + a.sol_date sc_date + , CASE WHEN DATE_FORMAT(a.sol_date, '%w') = 'N' THEN '기본지정' ELSE '별도지정' END AS sc_type + , sum(ifnull(c.am_cnt, b.am_cnt)) am_cnt + , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt + , sum(ifnull(c.day_cnt, b.day_cnt)) day_cnt + , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check + , sum(c.day_cnt) svc_count + FROM calendar a + LEFT JOIN service_count b on b.sc_date = '0000-00-00' + LEFT JOIN service_count c on c.sc_date = a.sol_date AND c.region_cd = b.region_cd + WHERE a.sol_date BETWEEN ? AND ? + GROUP BY a.sol_date ASC"; - $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); + $query = $this->db->query($sql, [$data['sdate'], $data['edate']]); - return $query->getResultArray(); - } + return $query->getResultArray(); + } // 지역별 수량 저장 - public function saveArea($data) - { - $this->db->transStart(); + public function saveArea($data) + { + $usr_sq = session('usr_sq'); + $now = date('Y-m-d H:i:s'); - $usr_sq = session('usr_sq'); + $insertData = [ + 'sc_date' => $data['sc_date'], + 'region_cd' => $data['region_cd'], + 'am_cnt' => $data['am_cnt'], + 'pm_cnt' => $data['pm_cnt'], + 'day_cnt' => (int)$data['am_cnt'] + (int)$data['pm_cnt'], + 'insert_usr' => $usr_sq, + 'insert_tm' => $now, + 'update_usr' => $usr_sq, + 'update_tm' => $now + ]; - $sql = "INSERT INTO service_count - (sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm) - VALUES - (?, ?, ?, ?, ?, ?, NOW(), ?, NOW()) - ON DUPLICATE KEY UPDATE am_cnt=values(am_cnt), pm_cnt=values(pm_cnt), day_cnt=values(day_cnt), update_usr=values(update_usr) - "; + // CI4 Query Builder upsert (INSERT ... ON DUPLICATE KEY UPDATE) + $result = $this->db->table('service_count')->upsert($insertData); - $datas = [ - $data['sc_date'], - $data['region_cd'], - $data['am_cnt'], - $data['pm_cnt'], - ((int) $data['am_cnt'] + (int) $data['pm_cnt']), - $usr_sq, - $usr_sq - ]; - - if ($this->db->query($sql, $datas) === false) { - return [ - 'success' => false, - 'msg' => '저장실패', - ]; + return [ + 'success' => $result !== false, + 'msg' => $result !== false ? '성공' : '저장실패' + ]; } - $this->db->transComplete(); + public function saveCount($data) + { + $usr_sq = session('usr_sq'); + $now = date('Y-m-d H:i:s'); - return [ - 'success' => true, - ]; - } + $insertData = [ + 'sc_date' => '0000-00-00', + 'region_cd' => $data['region_cd'], + 'am_cnt' => $data['am_cnt'], + 'pm_cnt' => $data['pm_cnt'], + 'day_cnt' => (int)$data['am_cnt'] + (int)$data['pm_cnt'], + 'insert_usr' => $usr_sq, + 'insert_tm' => $now, + 'update_usr' => $usr_sq, + 'update_tm' => $now + ]; - public function saveCount($data) - { - // $this->db->transStart(); + // CI4 Query Builder upsert + $result = $this->db->table('service_count')->upsert($insertData); + + // 실행된 쿼리 로그 출력 + $lastQuery = $this->db->getLastQuery(); + log_message('info', '[ProcessibleModel::saveCount] Query: ' . $lastQuery); + log_message('info', '[ProcessibleModel::saveCount] Affected Rows: ' . $this->db->affectedRows()); + + if ($result === false) { + $error = $this->db->error(); + log_message('error', '[ProcessibleModel::saveCount] Error: ' . json_encode($error)); + + return [ + 'success' => false, + 'msg' => '저장실패: ' . ($error['message'] ?? '알 수 없는 오류'), + 'query' => (string) $lastQuery, + 'error' => $error + ]; + } - $usr_sq = session('usr_sq'); - - $sql = "INSERT INTO service_count - (sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm) - VALUES - (?, ?, ?, ?, ?, ?, NOW(), ?, NOW()) - ON DUPLICATE KEY UPDATE - am_cnt = VALUES(am_cnt), - pm_cnt = VALUES(pm_cnt), - day_cnt = VALUES(day_cnt), - update_usr = VALUES(update_usr), - update_tm = NOW() - "; - - $datas = [ - '0000-00-00', - $data['region_cd'], - $data['am_cnt'], - $data['pm_cnt'], - ((int) $data['am_cnt'] + (int) $data['pm_cnt']), - $usr_sq, - $usr_sq - ]; - - // 쿼리 실행 - $result = $this->db->query($sql, $datas); - - // 실행된 쿼리 로그 출력 - $lastQuery = $this->db->getLastQuery(); - log_message('info', '[ProcessibleModel::saveCount] Query: ' . $lastQuery); - log_message('info', '[ProcessibleModel::saveCount] Affected Rows: ' . $this->db->affectedRows()); - - if ($result === false) { - $error = $this->db->error(); - log_message('error', '[ProcessibleModel::saveCount] Error: ' . json_encode($error)); - - return [ - 'success' => false, - 'msg' => '저장실패: ' . ($error['message'] ?? '알 수 없는 오류'), - 'query' => (string) $lastQuery, - 'error' => $error - ]; + return [ + 'success' => true, + 'query' => (string) $lastQuery, + 'affected_rows' => $this->db->affectedRows() + ]; } - // $this->db->transComplete(); - - return [ - 'success' => true, - 'query' => (string) $lastQuery, - 'affected_rows' => $this->db->affectedRows() - ]; - } - /** * 슬롯 동기화 * */ - public function getSyncSlotData($baseDate, $region_cd) - { - - $sql = "SELECT sc_date, region_cd, am_cnt, pm_cnt, day_cnt FROM service_count WHERE sc_date = ? AND region_cd IN ?"; - $datas = [ - $baseDate, - $region_cd - ]; - $query = $this->db->query($sql, $datas); - return $query->getResultArray(); - - } + public function getSyncSlotData($baseDate, $region_cd) + { + + $sql = "SELECT sc_date, region_cd, am_cnt, pm_cnt, day_cnt FROM service_count WHERE sc_date = ? AND region_cd IN ?"; + $datas = [ + $baseDate, + $region_cd + ]; + $query = $this->db->query($sql, $datas); + return $query->getResultArray(); + + } } \ No newline at end of file diff --git a/public/test_log.php b/public/test_log.php index 4f1d3c5..d6e46e6 100644 --- a/public/test_log.php +++ b/public/test_log.php @@ -16,3 +16,5 @@ echo "테스트 파일: " . $testFile . "
"; if (file_exists($testFile)) { echo "파일 내용:
" . file_get_contents($testFile) . "
"; } + +// 파일 변경 \ No newline at end of file