처리가능 수량관리 수정
This commit is contained in:
@@ -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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -16,3 +16,5 @@ echo "테스트 파일: " . $testFile . "<br>";
|
||||
if (file_exists($testFile)) {
|
||||
echo "파일 내용:<pre>" . file_get_contents($testFile) . "</pre>";
|
||||
}
|
||||
|
||||
// 파일 변경
|
||||
Reference in New Issue
Block a user