처리가능 수량관리 수정

This commit is contained in:
2026-03-20 13:35:55 +09:00
parent b553310dc1
commit 1f445512f7
3 changed files with 424 additions and 414 deletions

View File

@@ -7,210 +7,242 @@ use App\Models\article\ProcessibleModel;
class Processible extends BaseController class Processible extends BaseController
{ {
private $model; private $model;
public function __construct() public function __construct()
{ {
$this->model = new ProcessibleModel(); $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() public function getList1()
{ {
$start = (int) $this->request->getGet('start') ?: 0; $start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10; $end = (int) $this->request->getGet('length') ?: 10;
$data = [ $data = [
'sdate' => $this->request->getGet('sdate'), // 시작일 'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일 '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: [ return $this->response->setJSON(body: [
'recordsTotal' => $totalCount, 'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount, 'recordsFiltered' => $totalCount,
'data' => $datas, 'data' => $datas,
]); ]);
} }
public function getList2() public function getList2()
{ {
// $start = (int) $this->request->getGet('start') ?: 0; // $start = (int) $this->request->getGet('start') ?: 0;
// $end = (int) $this->request->getGet('length') ?: 10; // $end = (int) $this->request->getGet('length') ?: 10;
$data = [ $data = [
'sdate' => $this->request->getGet('sdate'), // 시작일 'sdate' => $this->request->getGet('sdate'), // 시작일
'region' => $this->request->getGet('region'), // 종료일 '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: [ return $this->response->setJSON(body: [
'recordsTotal' => $totalCount, 'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount, 'recordsFiltered' => $totalCount,
'data' => $datas, 'data' => $datas,
]); ]);
} }
public function getList3() public function getList3()
{ {
$data = [ $data = [
'region' => $this->request->getGet('region'), // 종료일 '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: [ return $this->response->setJSON(body: [
'recordsTotal' => $totalCount, 'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount, 'recordsFiltered' => $totalCount,
'data' => $datas, 'data' => $datas,
]); ]);
} }
// 엑셀다운로드 // 엑셀다운로드
public function excel() public function excel()
{ {
try { try {
$data = [ $data = [
'sdate' => $this->request->getGet('sdate'), 'sdate' => $this->request->getGet('sdate'),
'edate' => $this->request->getGet('edate'), 'edate' => $this->request->getGet('edate'),
]; ];
$datas = $this->model->getExcelList($data); $datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [ return $this->response->setJSON(body: [
'data' => $datas, 'data' => $datas,
]); ]);
} catch (\Exception $e) { } catch (\Exception $e) {
$e->getPrevious()->getTraceAsString(); $e->getPrevious()->getTraceAsString();
}
} }
}
// 지역별 수량 저장 // 지역별 수량 저장
public function saveArea() public function saveArea()
{ {
log_message('info', '[Processible::saveArea] 진입'); log_message('info', '[Processible::saveArea] 진입');
try { try {
$rows = $this->request->getPost('rows'); $rows = $this->request->getPost('rows');
$rows = json_decode($rows, true); $rows = json_decode($rows, true);
if (count($rows) > 0) { if (empty($rows)) {
// 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 {
log_message('info', '[Processible::saveArea] 저장가능한 데이터가 없습니다.'); log_message('info', '[Processible::saveArea] 저장가능한 데이터가 없습니다.');
return $this->response->setJSON([ return $this->response->setJSON([
'code' => '9', 'code' => '9',
'msg' => '저장가능한 데이터가 없습니다.' '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'); // API 형식으로 변환 및 DB 저장
$rows = json_decode($rows, true); $syncSlotData = [];
foreach ($rows as $row) {
// DB 저장 (API 실패와 무관하게 저장됨)
$this->model->saveArea($row);
if (count($rows) > 0) { // 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; $hasError = false;
$errorMessage = '';
foreach ($rows as $row): if ($apiResponse === null) {
$result = $this->model->saveCount($row);
$results[] = $result;
if (!$result['success']) {
$hasError = true; $hasError = true;
} $errorMessage = 'API 응답 없음 (null)';
endforeach; } 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([ return $this->response->setJSON([
'code' => $hasError ? '9' : '0', 'code' => '0',
'msg' => $hasError ? '일부 저장 실패' : 'success', 'msg' => 'success',
'debug' => $results // 디버깅 정보 포함 'dbSaved' => true,
'syncData' => $syncSlotData,
'apiResponse' => $apiResponse
]); ]);
} else { } catch (\Exception $e) {
log_message('error', '[Processible::saveArea] 예외 발생: ' . $e->getMessage());
return $this->response->setJSON([ return $this->response->setJSON([
'code' => '9', 'code' => '9',
'msg' => '저장가능한 데이터가 없습니다.' '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(),
]);
}
}
} }

View File

@@ -6,318 +6,294 @@ use CodeIgniter\Model;
class ProcessibleModel extends Model class ProcessibleModel extends Model
{ {
// 지역 목록 조회 // 지역 목록 조회
public function getAreaList($sido = '', $gugun = '') public function getAreaList($sido = '', $gugun = '')
{ {
if (!empty($gugun)) { if (!empty($gugun)) {
$gugun = substr($gugun, '0', '5'); $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" . $sql = "SELECT a.region_cd, TRIM(REPLACE(a.region_nm, b.region_nm, '')) region_nm" .
" FROM region_codes a" . " FROM region_codes a" .
" LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,2),'00000000')" . " LEFT JOIN region_codes b ON b.region_cd = CONCAT(SUBSTR(a.region_cd,1,5),'00000')" .
" WHERE a.region_cd LIKE concat(?, '%')" . " WHERE a.region_cd LIKE concat(?, '%')" .
" AND a.region_cd NOT LIKE '%00000000'" . " AND a.region_cd NOT LIKE '%00000'" .
" AND a.region_cd LIKE '%00000'" . " AND a.region_cd LIKE '%00'" .
" AND a.use_yn = 'Y'" . " 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";
" ORDER BY a.region_nm ASC";
}
$query = $this->db->query($sql, [$sido]); $query = $this->db->query($sql, [$gugun]);
} 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); } 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']]);
/** return $query->getRow()->cnt;
* 일자별 처리가능 수량 }
*/
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 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) $query = $this->db->query($sql, [$data['sdate'], $data['edate']]);
{
$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 ";
$sql .= "LIMIT {$start}, {$end}"; return $query->getResultArray();
}
$query = $this->db->query($sql, [$data['sdate'], $data['edate']]);
return $query->getResultArray();
}
/** /**
* 지역별 수량 * 지역별 수량
*/ */
public function getTotal2($data) public function getTotal2($data)
{ {
$sql = "SELECT $sql = "SELECT
COUNT(*) AS cnt COUNT(*) AS cnt
FROM calendar a 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 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 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' JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y'
WHERE a.sol_date = ? WHERE a.sol_date = ?
ORDER BY d.region_nm"; 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) public function getList2($data)
{ {
$sql = "SELECT $sql = "SELECT
a.sol_date a.sol_date
, b.region_cd, d.region_nm , b.region_cd, d.region_nm
, c.am_cnt, b.am_cnt default_am_cnt , c.am_cnt, b.am_cnt default_am_cnt
, c.pm_cnt, b.pm_cnt default_pm_cnt , c.pm_cnt, b.pm_cnt default_pm_cnt
, c.day_cnt, b.day_cnt default_day_cnt , c.day_cnt, b.day_cnt default_day_cnt
FROM calendar a 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 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 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' JOIN region_codes d on d.region_cd = b.region_cd and d.use_yn = 'Y'
WHERE a.sol_date = ? WHERE a.sol_date = ?
ORDER BY d.region_nm"; 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) public function getTotal3($data)
{ {
$sql = "SELECT $sql = "SELECT
COUNT(*) AS cnt 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 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 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 LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd
ORDER BY b.region_nm"; 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) public function getList3($data)
{ {
$sql = "SELECT $sql = "SELECT
b.region_cd, b.region_nm, IFNULL(c.am_cnt,0)am_cnt, IFNULL(c.pm_cnt,0) pm_cnt 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 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 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 LEFT JOIN service_count c ON c.sc_date = '0000-00-00' AND c.region_cd = a.region_cd
ORDER BY b.region_nm"; 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) public function getExcelList($data)
{ {
$sql = "SELECT $sql = "SELECT
a.sol_date sc_date a.sol_date sc_date
, CASE WHEN DATE_FORMAT(a.sol_date, '%w') = 'N' THEN '기본지정' ELSE '별도지정' END AS sc_type , 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.am_cnt, b.am_cnt)) am_cnt
, sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt , sum(ifnull(c.pm_cnt,b.pm_cnt)) pm_cnt
, sum(ifnull(c.day_cnt, b.day_cnt)) day_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 , case count(b.region_cd) when count(c.region_cd) then 'Y' ELSE 'N' END svc_check
, sum(c.day_cnt) svc_count , sum(c.day_cnt) svc_count
FROM calendar a FROM calendar a
LEFT JOIN service_count b on b.sc_date = '0000-00-00' 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 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 ? WHERE a.sol_date BETWEEN ? AND ?
GROUP BY a.sol_date ASC"; 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) public function saveArea($data)
{ {
$this->db->transStart(); $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 // CI4 Query Builder upsert (INSERT ... ON DUPLICATE KEY UPDATE)
(sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm) $result = $this->db->table('service_count')->upsert($insertData);
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)
";
$datas = [ return [
$data['sc_date'], 'success' => $result !== false,
$data['region_cd'], 'msg' => $result !== false ? '성공' : '저장실패'
$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' => '저장실패',
];
} }
$this->db->transComplete(); public function saveCount($data)
{
$usr_sq = session('usr_sq');
$now = date('Y-m-d H:i:s');
return [ $insertData = [
'success' => true, '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) // CI4 Query Builder upsert
{ $result = $this->db->table('service_count')->upsert($insertData);
// $this->db->transStart();
$usr_sq = session('usr_sq'); // 실행된 쿼리 로그 출력
$lastQuery = $this->db->getLastQuery();
log_message('info', '[ProcessibleModel::saveCount] Query: ' . $lastQuery);
log_message('info', '[ProcessibleModel::saveCount] Affected Rows: ' . $this->db->affectedRows());
$sql = "INSERT INTO service_count if ($result === false) {
(sc_date, region_cd, am_cnt, pm_cnt, day_cnt, insert_usr, insert_tm, update_usr, update_tm) $error = $this->db->error();
VALUES log_message('error', '[ProcessibleModel::saveCount] Error: ' . json_encode($error));
(?, ?, ?, ?, ?, ?, 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 = [ return [
'0000-00-00', 'success' => false,
$data['region_cd'], 'msg' => '저장실패: ' . ($error['message'] ?? '알 수 없는 오류'),
$data['am_cnt'], 'query' => (string) $lastQuery,
$data['pm_cnt'], 'error' => $error
((int) $data['am_cnt'] + (int) $data['pm_cnt']), ];
$usr_sq, }
$usr_sq
];
// 쿼리 실행 return [
$result = $this->db->query($sql, $datas); 'success' => true,
'query' => (string) $lastQuery,
// 실행된 쿼리 로그 출력 'affected_rows' => $this->db->affectedRows()
$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
];
} }
// $this->db->transComplete();
return [
'success' => true,
'query' => (string) $lastQuery,
'affected_rows' => $this->db->affectedRows()
];
}
/** /**
* 슬롯 동기화 * 슬롯 동기화
* *
*/ */
public function getSyncSlotData($baseDate, $region_cd) 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 ?"; $sql = "SELECT sc_date, region_cd, am_cnt, pm_cnt, day_cnt FROM service_count WHERE sc_date = ? AND region_cd IN ?";
$datas = [ $datas = [
$baseDate, $baseDate,
$region_cd $region_cd
]; ];
$query = $this->db->query($sql, $datas); $query = $this->db->query($sql, $datas);
return $query->getResultArray(); return $query->getResultArray();
} }
} }

View File

@@ -16,3 +16,5 @@ echo "테스트 파일: " . $testFile . "<br>";
if (file_exists($testFile)) { if (file_exists($testFile)) {
echo "파일 내용:<pre>" . file_get_contents($testFile) . "</pre>"; echo "파일 내용:<pre>" . file_get_contents($testFile) . "</pre>";
} }
// 파일 변경