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