아파트평면도 목록 페이지 추가

This commit is contained in:
yangsh
2025-12-26 17:21:21 +09:00
parent 093d1a1c0b
commit 06e266425c
8 changed files with 2407 additions and 39 deletions

View File

@@ -54,7 +54,6 @@ $routes->group('article', ['namespace' => 'App\Controllers\Article'], function (
// 관할포인트 인쇄 // 관할포인트 인쇄
$routes->get('apt/print', 'Apt::print'); $routes->get('apt/print', 'Apt::print');
/** API - 아파트단지 */ /** API - 아파트단지 */
$routes->get('apt/getAptLists', 'Apt::getAptLists'); $routes->get('apt/getAptLists', 'Apt::getAptLists');
$routes->post('apt/saveAptMemo', 'Apt::saveAptMemo'); $routes->post('apt/saveAptMemo', 'Apt::saveAptMemo');
@@ -92,6 +91,21 @@ $routes->group('article', ['namespace' => 'App\Controllers\Article'], function (
*/ */
$routes->get('apt/delChgApt/getAptLists', 'DelChgApt::getAptLists'); $routes->get('apt/delChgApt/getAptLists', 'DelChgApt::getAptLists');
$routes->post('apt/delChgApt/chgAptHscp', 'Apt::chgAptHscp'); $routes->post('apt/delChgApt/chgAptHscp', 'Apt::chgAptHscp');
// 아파트 평면도
$routes->get('apt/lists2', 'Ground::lists');
/**
* 아파트 평면도 - API
*/
$routes->get('apt/ground/getAptLists', 'Ground::getAptLists');
$routes->get('apt/ground/excel', 'Ground::excel');
$routes->post('apt/ground/chgAptDamdang', 'Ground::chgAptDamdang');
$routes->post('apt/ground/uploadFile', 'Ground::uploadFile');
$routes->get('apt/ground/print', 'Ground::print');
}); });
/** /**

View File

@@ -166,11 +166,17 @@ class Apt extends BaseController
$damdang = $this->request->getPost(index: 'damdang'); $damdang = $this->request->getPost(index: 'damdang');
if (empty($team)) { if (empty($team)) {
throw new Exception("팀정보 누락"); return $this->response->setJSON([
'code' => '9',
'msg' => '팀정보 누락',
]);
} }
if (empty($damdang)) { if (empty($damdang)) {
throw new Exception("담당자정보 누락"); return $this->response->setJSON([
'code' => '9',
'msg' => '담당자정보 누락',
]);
} }
@@ -192,7 +198,10 @@ class Apt extends BaseController
} }
} else { } else {
throw new Exception("저장할 데이터 누락"); return $this->response->setJSON([
'code' => '9',
'msg' => '저장데이터 누락',
]);
} }
return $this->response->setJSON([ return $this->response->setJSON([
@@ -262,8 +271,6 @@ class Apt extends BaseController
// 엑셀 다운로드 // 엑셀 다운로드
public function excel() public function excel()
{ {
try { try {
$data = [ $data = [

View File

@@ -4,6 +4,11 @@ namespace App\Controllers\Article;
use App\Controllers\BaseController; use App\Controllers\BaseController;
use App\Models\article\DelChgAptModel; use App\Models\article\DelChgAptModel;
/**
* 단지코드관리
* 2025.12.26
* 작성자 : yangsh
*/
class DelChgApt extends BaseController class DelChgApt extends BaseController
{ {
private $model; private $model;

View File

@@ -0,0 +1,358 @@
<?php
namespace App\Controllers\Article;
use App\Controllers\BaseController;
use App\Libraries\MyUpload;
use App\Models\article\GroundModel;
use App\Models\common\CodeModel;
/**
* 아파트 평면도
* 2025.12.26
* 작성자 : yangsh
*/
class Ground extends BaseController
{
private $model, $codeModel;
public function __construct()
{
$this->model = new GroundModel();
$this->codeModel = new CodeModel();
}
public function lists(): string
{
$codes = $this->codeModel->getCodeLists(['VIDEO_TARGET', 'APT_GROUND_STEP', 'PHO_YN', 'VDO_YN']); // 코드조회
$sido = $this->model->getAreaList(); // 지역조회
$bonbu = $this->model->getBonbuList(); // 본부
$team = $this->model->getTeamList(); // 팀
$user = $this->model->getUserList(); // 유저
return view("pages/article/lists2", [
'codes' => $codes,
'sido' => $sido,
'bonbu' => $bonbu,
'team' => $team,
'user' => $user,
]);
}
// 아파트단지목록 조회
public function getAptLists()
{
$start = (int) $this->request->getGet('start') ?: 0;
$end = (int) $this->request->getGet('length') ?: 10;
$data = [
'hscp_no' => $this->request->getGet('hscp_no'), // 단지코드
'part_no' => $this->request->getGet('part_no'), // 구분코드
'srcSido' => $this->request->getGet('srcSido'), // 시|도
'srcGugun' => $this->request->getGet('srcGugun'), // 시|군|구
'srcDong' => $this->request->getGet('srcDong'), // 읍|면|동
'rcpt_hscp_nm' => $this->request->getGet('rcpt_hscp_nm'), // 단지명
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'damdang' => $this->request->getGet('damdang'), // 담당
'stat' => $this->request->getGet('stat'), // 진행상태
];
$totalCount = $this->model->getTotalCount($data);
$datas = $this->model->getAptLists($start, $end, $data);
$deptStatistics = $this->model->getDeptStatistics($data); // 조직별통계
$areaStatistics = $this->model->getStatistics($data); // 지역별통계
return $this->response->setJSON(body: [
'draw' => (int) ($this->request->getGetPost('draw') ?? 0), // 서버사이드면 권장
'recordsTotal' => $totalCount,
'recordsFiltered' => $totalCount,
'data' => $datas,
'widgets' => [
'deptList' => $deptStatistics,
'areaStats' => $areaStatistics,
],
]);
}
// 엑셀 다운로드
public function excel()
{
try {
$data = [
'hscp_no' => $this->request->getGet('hscp_no'), // 단지코드
'part_no' => $this->request->getGet('part_no'), // 구분코드
'srcSido' => $this->request->getGet('srcSido'), // 시|도
'srcGugun' => $this->request->getGet('srcGugun'), // 시|군|구
'srcDong' => $this->request->getGet('srcDong'), // 읍|면|동
'rcpt_hscp_nm' => $this->request->getGet('rcpt_hscp_nm'), // 단지명
'sdate' => $this->request->getGet('sdate'), // 시작일
'edate' => $this->request->getGet('edate'), // 종료일
'bonbu' => $this->request->getGet('bonbu'), // 본부
'team' => $this->request->getGet('team'), // 팀
'damdang' => $this->request->getGet('damdang'), // 담당
'stat' => $this->request->getGet('stat'), // 진행상태
];
$datas = $this->model->getExcelList($data);
return $this->response->setJSON(body: [
'data' => $datas,
]);
} catch (\Exception $e) {
$e->getPrevious()->getTraceAsString();
}
}
// 관할포인트 인쇄 - 화면
public function print(): string
{
$deptSq = $this->request->getGet('depChk');
$dept_cnt = count($deptSq);
$listDept = $this->model->getDeptMapList($deptSq);
if (!empty($listDept)) {
$lati = 0;
$long = 0;
foreach ($listDept as $dept) {
$lati += $dept['rcpt_y'];
$long += $dept['rcpt_x'];
}
$lati = $lati / $dept_cnt;
$long = $long / $dept_cnt;
}
return view("pages/article/printMap", [
// 'lati' => $lati,
// 'long' => $long,
'listDept' => $listDept,
]);
}
// 담당자정보변경
public function chgAptDamdang()
{
try {
$team = $this->request->getPost('team');
$damdang = $this->request->getPost(index: 'damdang');
if (empty($team)) {
return $this->response->setJSON([
'code' => '9',
'msg' => '팀정보 누락',
]);
}
if (empty($damdang)) {
return $this->response->setJSON([
'code' => '9',
'msg' => '담당자정보 누락',
]);
}
$rows = $this->request->getPost('rows');
$rows = json_decode($rows, true);
if (count($rows) > 0) {
foreach ($rows as $row) {
$params = [
$team,
$damdang,
$row['rcpt_no'],
];
// UPDATE apt_result
$this->model->updateAptDamdang($params);
}
} else {
return $this->response->setJSON([
'code' => '9',
'msg' => '저장데이터 누락',
]);
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
// 파일업로드(평면도)
public function uploadFile()
{
$lib = new MyUpload();
try {
$rcpt_no = $this->request->getPost('rcpt_no');
$files = $this->request->getFiles();
$uploadPath = "/upload/apt_file/" . $rcpt_no . "/";
if (!isset($rcpt_no)) {
return $this->response->setJSON([
'success' => false,
'msg' => '접수번호 누락'
]);
}
if (!isset($files['file'])) {
return $this->response->setJSON([
'success' => false,
'msg' => '파일 없음'
]);
}
$arrUploadfile = [];
$file = $files['file'];
if ($file->isValid() && !$file->hasMoved()) {
$uploadData = $lib->do_upload2($file, $uploadPath);
if ($uploadData !== false) {
$arrUploadfile[] = $uploadData;
}
}
$gps_lat = null;
$gps_lon = null;
$camDate = null;
// print_r($arrUploadfile);
// exit;
if (!empty($arrUploadfile)) {
foreach ($arrUploadfile as $key => $uploadFile) {
$object_storage_url = $uploadFile['object_storage_url'];
$arrExifData = @exif_read_data($object_storage_url);
if (!empty($arrExifData)) {
$notFound = "Unavailable";
if (@array_key_exists('DateTime', $arrExifData)) {
$camDate = $arrExifData['DateTime'];
} else {
$camDate = $notFound;
}
$imageMetaData = $camDate;
$camDate = substr(str_replace(':', '-', $camDate), 0, 10);
$arrGPS = $arrExifData['GPS'] ?? null;
if (empty($arrGPS)) { // GPS 섹션이 없으면, 개별 키로도 체크
if (!empty($arrExifData['GPSLongitude']) && !empty($arrExifData['GPSLatitude'])) {
$arrGPS = [
'GPSLongitude' => $arrExifData['GPSLongitude'],
'GPSLatitude' => $arrExifData['GPSLatitude'],
];
}
}
if (
!empty($arrGPS)
&& !empty($arrGPS['GPSLongitude'])
&& !empty($arrGPS['GPSLatitude'])
&& is_array($arrGPS['GPSLongitude'])
&& is_array($arrGPS['GPSLatitude'])
) { //GPS 정보가 있다면
if (@array_key_exists('GPSLongitude', $arrGPS) && (@array_key_exists('GPSLatitude', $arrGPS))) {
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLatitude"][0], "%d/%d"); //문자->숫자로 계산
$gps_lat_d = $temp_d1 / $temp_d2;
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLatitude"][1], "%d/%d");
$gps_lat_m = $temp_d1 / $temp_d2;
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLatitude"][2], "%d/%d");
$gps_lat_s = $temp_d1 / $temp_d2;
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLongitude"][0], "%d/%d"); //문자->숫자로 계산
$gps_lon_d = $temp_d1 / $temp_d2;
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLongitude"][1], "%d/%d");
$gps_lon_m = $temp_d1 / $temp_d2;
list($temp_d1, $temp_d2) = sscanf($arrGPS["GPSLongitude"][2], "%d/%d");
$gps_lon_s = $temp_d1 / $temp_d2;
$gps_lat = $gps_lat_d + $gps_lat_m / 60 + $gps_lat_s / 3600; //도분초를 도로 변환
$gps_lon = $gps_lon_d + $gps_lon_m / 60 + $gps_lon_s / 3600;
}
}
}
$base = $uploadFile['base_name']; // xxxx
$dir = rtrim(dirname($uploadFile['object_key']), '/'); // upload/apt_file/2
$thumbKey = $dir . '/' . $base . '_thumb.jpg';
$imageDataBlob = file_get_contents($object_storage_url);
$im = new \Imagick();
$im->readImageBlob($imageDataBlob);
$im->thumbnailImage(105, 80, false);
$thumb_im = $im->getImageBlob();
// 썸네일 s3 전송
$lib->upload_object_storage_imagick2($thumbKey, $thumb_im);
/**
* 파일업로드 내용 저장
* rcpt_no, pho_lati, pho_long, filenm, filenm_up, file_path, thumb_path, thumb_nm, cloud_upload_yn
*
*/
$uploadParam = [
'rcpt_no' => $rcpt_no, // 접수번호
'gps_lat' => $gps_lat, // latitude
'gps_lon' => $gps_lon, // longitude
'origin_name' => $uploadFile['origin_name'], // 원본파일명
'file_name' => $uploadFile['file_name'], // 저장파일명
'file_ext' => '.' . $uploadFile['ext'], // 파일확장자
'upload_path' => $uploadPath, // 저장경로
'thumb_name' => $base . '_thumb.jpg',
'cam_date' => $camDate, // 촬영일
];
// INSERT INTO apt_ground_photo
$res = $this->model->saveImg($uploadParam);
log_message('debug', 'apt_ground_file :: rcpt_no : ' . $rcpt_no . ', fileName : ' . $uploadFile['file_name']);
}
}
return $this->response->setJSON([
'code' => '0',
'msg' => 'success'
]);
} catch (\Exception $e) {
return $this->response->setJSON([
'code' => '9',
'msg' => $e->getMessage(),
]);
}
}
}

View File

@@ -203,6 +203,19 @@ class AptModel extends Model
$sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} "; $sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} ";
} }
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태 // 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) { if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'"; $statList = "'" . implode("','", $data['stat']) . "'";
@@ -296,6 +309,19 @@ class AptModel extends Model
$sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} "; $sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} ";
} }
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태 // 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) { if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'"; $statList = "'" . implode("','", $data['stat']) . "'";
@@ -391,6 +417,19 @@ class AptModel extends Model
$sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} "; $sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} ";
} }
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태 // 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) { if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'"; $statList = "'" . implode("','", $data['stat']) . "'";
@@ -491,6 +530,19 @@ class AptModel extends Model
$sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} "; $sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} ";
} }
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태 // 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) { if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'"; $statList = "'" . implode("','", $data['stat']) . "'";
@@ -729,6 +781,19 @@ class AptModel extends Model
$sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} "; $sql .= "AND a.dong_cnt <= {$data['dong_cnt2']} ";
} }
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태 // 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) { if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'"; $statList = "'" . implode("','", $data['stat']) . "'";

View File

@@ -0,0 +1,651 @@
<?php
namespace App\Models\article;
use CodeIgniter\Model;
class GroundModel extends Model
{
// 지역 목록 조회
public function getAreaList($sido = '', $gugun = '')
{
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";
}
$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();
}
// 소속본부조회
public function getBonbuList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm, dept_desc, dept_head, use_yn, depth, insert_tm, insert_usr, update_tm, update_usr, lft, rgt" .
" FROM departments" .
" WHERE depth = 1" .
" AND use_yn = 'Y'" .
" ORDER BY lft";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 소속팀 조회
public function getTeamList()
{
$sql = "SELECT dept_sq, pdept_sq, dept_nm" .
" FROM departments" .
" WHERE depth = 2" .
" AND use_yn = 'Y'" .
" ORDER BY dept_nm";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 유저 조회
public function getUserList()
{
$sql = "SELECT
a.usr_sq, a.usr_id, a.usr_nm, a.dept_sq
FROM users a
WHERE
a.usr_level IN ('3','4','40','5','50','6','60','61','62','7','8','70')
AND a.use_yn = 'Y'
AND EXISTS (
SELECT 'x' FROM departments a1 INNER JOIN departments a2 ON a2.lft BETWEEN a1.lft AND a1.rgt AND a2.use_yn = 'Y'
WHERE 1=1 AND a2.dept_sq = a.dept_sq AND a1.use_yn = 'Y'
)
ORDER BY a.usr_level DESC, a.usr_nm ASC ";
$query = $this->db->query($sql);
return $query->getResultArray();
}
public function getTotalCount($data)
{
$sql = "SELECT COUNT(*) AS cnt
FROM apt_ground AS a
LEFT JOIN apt_ground_photo AS gp ON gp.pho_no = (SELECT p.pho_no
FROM apt_ground_photo p
WHERE p.rcpt_no = a.rcpt_no
ORDER BY p.pho_no DESC
LIMIT 1)
LEFT JOIN users b ON a.charger = b.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq
LEFT JOIN codes f ON a.write_complete_yn = f.cd AND f.category = 'PHO_YN'
LEFT JOIN codes h ON a.vdo_up_ynx = h.cd AND h.category = 'VDO_YN'
LEFT JOIN codes g ON a.apt_step = g.cd AND g.category = 'APT_STEP'
LEFT JOIN apt_history j ON a.rcpt_no = j.rcpt_no AND j.changed_detail = 'C2' AND NOT EXISTS (SELECT 'x' FROM apt_history WHERE changed_detail LIKE 'A%' AND rcpt_no = j.rcpt_no) ";
$sql .= "WHERE 1=1 ";
if (!empty($data['hscp_no'])) {
$sql .= "AND a.hscp_no LIKE CONCAT('%', '{$data['hscp_no']}', '%') ";
} else {
if (!empty($data['hscp_no'])) {
$sql .= "AND a.part_no LIKE CONCAT('%', '{$data['part_no']}', '%') ";
}
if (!empty($data['rcpt_hscp_nm'])) {
$sql .= "AND a.rcpt_hscp_nm LIKE CONCAT('%', '{$data['rcpt_hscp_nm']}', '%') ";
}
// 법정동코드로 지역구분
if (!empty($data['srcDong'])) {
$sql .= "AND a.region_cd = '{$data['srcDong']}' ";
} else {
if (!empty($data['srcGugun'])) {
$str_gugun = substr($data['srcGugun'], '0', '2');
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
$sql .= "AND a.region_cd = '{$data['srcGugun']}' ";
} else {
$gugunPrefix = substr($data['srcGugun'], '0', '5');
$sql .= "AND a.region_cd LIKE '{$gugunPrefix}%' ";
}
} else {
if (!empty($data['srcSido'])) {
$sidoPrefix = substr($data['srcSido'], '0', '2');
$sql .= "AND a.region_cd LIKE '{$sidoPrefix}%' ";
}
}
}
//촬영일자 == 단지정보작성완료 일자
if (!empty($data['sdate'])) {
$sql .= "AND b.write_complete_tm >= '{$data['sdate']} 00:00:00' ";
}
if (!empty($data['edate'])) {
$sql .= "AND b.write_complete_tm <= '{$data['edate']} 00:00:00' ";
}
// 담당자
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'";
$sql .= " AND a.apt_step IN ({$statList}) ";
}
}
$query = $this->db->query($sql);
return $query->getRow()->cnt;
}
public function getAptLists($start, $end, $data)
{
$sql = "SELECT
a.rcpt_no, a.hscp_no, a.part_no, a.addr, a.addr2, a.rcpt_hscp_nm, a.pyeong_cnt, a.households_cnt, a.dong_cnt, a.rcpt_hscp_nm,
a.apt_cate_nm, a.rcpt_x, a.rcpt_y,
a.charger, a.memo, a.write_complete_yn, a.gpho_up_yn, a.vdo_up_ynx, a.apt_step, a.video_target, a.all_no_pho, a.send_end_tm,
a.dept_sq, a.vdo_up_tm, a.not_vdo_tm, a.check_tm, a.write_complete_tm,
b.usr_nm, i.dept_nm, j.changed_tm, gp.pho_no, gp.filenm, gp.filenm_up, gp.file_path, gp.file_ext, gp.cloud_upload_yn, gp.insert_tm
FROM
apt_ground AS a
LEFT JOIN apt_ground_photo AS gp ON gp.pho_no = (SELECT p.pho_no
FROM apt_ground_photo p
WHERE p.rcpt_no = a.rcpt_no
ORDER BY p.pho_no DESC
LIMIT 1)
LEFT JOIN users b ON a.charger = b.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq
LEFT JOIN codes f ON a.write_complete_yn = f.cd AND f.category = 'PHO_YN'
LEFT JOIN codes h ON a.vdo_up_ynx = h.cd AND h.category = 'VDO_YN'
LEFT JOIN codes g ON a.apt_step = g.cd AND g.category = 'APT_STEP'
LEFT JOIN apt_history j ON a.rcpt_no = j.rcpt_no AND j.changed_detail = 'C2' AND NOT EXISTS (SELECT 'x' FROM apt_history WHERE changed_detail LIKE 'A%' AND rcpt_no = j.rcpt_no) ";
$sql .= "WHERE 1=1 ";
if (!empty($data['hscp_no'])) {
$sql .= "AND a.hscp_no LIKE CONCAT('%', '{$data['hscp_no']}', '%') ";
} else {
if (!empty($data['hscp_no'])) {
$sql .= "AND a.part_no LIKE CONCAT('%', '{$data['part_no']}', '%') ";
}
if (!empty($data['rcpt_hscp_nm'])) {
$sql .= "AND a.rcpt_hscp_nm LIKE CONCAT('%', '{$data['rcpt_hscp_nm']}', '%') ";
}
// 법정동코드로 지역구분
if (!empty($data['srcDong'])) {
$sql .= "AND a.region_cd = '{$data['srcDong']}' ";
} else {
if (!empty($data['srcGugun'])) {
$str_gugun = substr($data['srcGugun'], '0', '2');
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
$sql .= "AND a.region_cd = '{$data['srcGugun']}' ";
} else {
$gugunPrefix = substr($data['srcGugun'], '0', '5');
$sql .= "AND a.region_cd LIKE '{$gugunPrefix}%' ";
}
} else {
if (!empty($data['srcSido'])) {
$sidoPrefix = substr($data['srcSido'], '0', '2');
$sql .= "AND a.region_cd LIKE '{$sidoPrefix}%' ";
}
}
}
//촬영일자 == 단지정보작성완료 일자
if (!empty($data['sdate'])) {
$sql .= "AND b.write_complete_tm >= '{$data['sdate']} 00:00:00' ";
}
if (!empty($data['edate'])) {
$sql .= "AND b.write_complete_tm <= '{$data['edate']} 00:00:00' ";
}
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'";
$sql .= " AND a.apt_step IN ({$statList}) ";
}
}
$sql .= "LIMIT {$start}, {$end}";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 조직별 통계
public function getDeptStatistics($data)
{
$sql = "SELECT
a.dept_sq, IFNULL(f.dept_nm, '') AS bonbu_nm, IFNULL(i.dept_nm, '미지정') AS team_nm, COUNT(a.dept_sq) as cnt
FROM
apt_ground a
LEFT JOIN apt_ground_photo AS gp ON gp.pho_no = (SELECT p.pho_no
FROM apt_ground_photo p
WHERE p.rcpt_no = a.rcpt_no
ORDER BY p.pho_no DESC
LIMIT 1)
LEFT JOIN users c ON a.charger = c.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq
LEFT JOIN departments f ON i.dept_sq = f.dept_sq ";
$sql .= "WHERE 1=1 ";
if (!empty($data['hscp_no'])) {
$sql .= "AND a.hscp_no LIKE CONCAT('%', '{$data['hscp_no']}', '%') ";
} else {
if (!empty($data['hscp_no'])) {
$sql .= "AND a.part_no LIKE CONCAT('%', '{$data['part_no']}', '%') ";
}
if (!empty($data['rcpt_hscp_nm'])) {
$sql .= "AND a.rcpt_hscp_nm LIKE CONCAT('%', '{$data['rcpt_hscp_nm']}', '%') ";
}
// 법정동코드로 지역구분
if (!empty($data['srcDong'])) {
$sql .= "AND a.region_cd = '{$data['srcDong']}' ";
} else {
if (!empty($data['srcGugun'])) {
$str_gugun = substr($data['srcGugun'], '0', '2');
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
$sql .= "AND a.region_cd = '{$data['srcGugun']}' ";
} else {
$gugunPrefix = substr($data['srcGugun'], '0', '5');
$sql .= "AND a.region_cd LIKE '{$gugunPrefix}%' ";
}
} else {
if (!empty($data['srcSido'])) {
$sidoPrefix = substr($data['srcSido'], '0', '2');
$sql .= "AND a.region_cd LIKE '{$sidoPrefix}%' ";
}
}
}
//촬영일자 == 단지정보작성완료 일자
if (!empty($data['sdate'])) {
$sql .= "AND b.write_complete_tm >= '{$data['sdate']} 00:00:00' ";
}
if (!empty($data['edate'])) {
$sql .= "AND b.write_complete_tm <= '{$data['edate']} 00:00:00' ";
}
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'";
$sql .= " AND a.apt_step IN ({$statList}) ";
}
}
$sql .= "GROUP BY a.dept_sq ORDER BY bonbu_nm ASC, team_nm ASC ";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 지역별 통계
public function getStatistics($data)
{
$sql = "SELECT
a.addr AS addr, COUNT(a.addr) AS cnt
FROM
apt_ground a
LEFT JOIN apt_ground_photo gp ON a.rcpt_no = gp.rcpt_no
LEFT JOIN users c ON a.charger = c.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq ";
$sql .= "WHERE 1=1 ";
if (!empty($data['hscp_no'])) {
$sql .= "AND a.hscp_no LIKE CONCAT('%', '{$data['hscp_no']}', '%') ";
} else {
if (!empty($data['hscp_no'])) {
$sql .= "AND a.part_no LIKE CONCAT('%', '{$data['part_no']}', '%') ";
}
if (!empty($data['rcpt_hscp_nm'])) {
$sql .= "AND a.rcpt_hscp_nm LIKE CONCAT('%', '{$data['rcpt_hscp_nm']}', '%') ";
}
// 법정동코드로 지역구분
if (!empty($data['srcDong'])) {
$sql .= "AND a.region_cd = '{$data['srcDong']}' ";
} else {
if (!empty($data['srcGugun'])) {
$str_gugun = substr($data['srcGugun'], '0', '2');
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
$sql .= "AND a.region_cd = '{$data['srcGugun']}' ";
} else {
$gugunPrefix = substr($data['srcGugun'], '0', '5');
$sql .= "AND a.region_cd LIKE '{$gugunPrefix}%' ";
}
} else {
if (!empty($data['srcSido'])) {
$sidoPrefix = substr($data['srcSido'], '0', '2');
$sql .= "AND a.region_cd LIKE '{$sidoPrefix}%' ";
}
}
}
//촬영일자 == 단지정보작성완료 일자
if (!empty($data['sdate'])) {
$sql .= "AND b.write_complete_tm >= '{$data['sdate']} 00:00:00' ";
}
if (!empty($data['edate'])) {
$sql .= "AND b.write_complete_tm <= '{$data['edate']} 00:00:00' ";
}
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'";
$sql .= " AND a.apt_step IN ({$statList}) ";
}
}
$sql .= "GROUP BY a.addr ORDER BY a.addr ASC ";
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 엑셀 다운로드
public function getExcelList($data)
{
$sql = "SELECT
a.part_no AS '구분코드',
a.hscp_no AS '단지코드',
SUBSTRING_INDEX(a.addr, ' ', 1) AS '시도',
SUBSTRING_INDEX(a.addr, ' ', 2) AS '시군구',
SUBSTRING_INDEX(a.addr, ' ', 3) AS '읍면동',
a.addr2 AS '지번',
a.rcpt_hscp_nm AS '단지명',
a.apt_cate_nm AS '단지유형',
a.pyeong_cnt AS '평형',
i.dept_nm AS '방문팀',
b.usr_nm AS '담당자',
gp.insert_tm AS '촬영일자',
a.rcpt_x AS '단지X좌표',
a.rcpt_y AS '단지Y좌표'
FROM
apt_ground AS a
LEFT JOIN apt_ground_photo AS gp ON gp.pho_no = (SELECT p.pho_no
FROM apt_ground_photo p
WHERE p.rcpt_no = a.rcpt_no
ORDER BY p.pho_no DESC
LIMIT 1)
LEFT JOIN users b ON a.charger = b.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq
LEFT JOIN codes f ON a.write_complete_yn = f.cd AND f.category = 'PHO_YN'
LEFT JOIN codes h ON a.vdo_up_ynx = h.cd AND h.category = 'VDO_YN'
LEFT JOIN codes g ON a.apt_step = g.cd AND g.category = 'APT_STEP'
LEFT JOIN apt_history j ON a.rcpt_no = j.rcpt_no AND j.changed_detail = 'C2' AND NOT EXISTS (SELECT 'x' FROM apt_history WHERE changed_detail LIKE 'A%' AND rcpt_no = j.rcpt_no) ";
$sql .= "WHERE 1=1 ";
if (!empty($data['hscp_no'])) {
$sql .= "AND a.hscp_no LIKE CONCAT('%', '{$data['hscp_no']}', '%') ";
} else {
if (!empty($data['hscp_no'])) {
$sql .= "AND a.part_no LIKE CONCAT('%', '{$data['part_no']}', '%') ";
}
if (!empty($data['rcpt_hscp_nm'])) {
$sql .= "AND a.rcpt_hscp_nm LIKE CONCAT('%', '{$data['rcpt_hscp_nm']}', '%') ";
}
// 법정동코드로 지역구분
if (!empty($data['srcDong'])) {
$sql .= "AND a.region_cd = '{$data['srcDong']}' ";
} else {
if (!empty($data['srcGugun'])) {
$str_gugun = substr($data['srcGugun'], '0', '2');
if ($str_gugun == '36') { //세종시는 군구가 없고 바로 동이라서 예외
$sql .= "AND a.region_cd = '{$data['srcGugun']}' ";
} else {
$gugunPrefix = substr($data['srcGugun'], '0', '5');
$sql .= "AND a.region_cd LIKE '{$gugunPrefix}%' ";
}
} else {
if (!empty($data['srcSido'])) {
$sidoPrefix = substr($data['srcSido'], '0', '2');
$sql .= "AND a.region_cd LIKE '{$sidoPrefix}%' ";
}
}
}
//촬영일자 == 단지정보작성완료 일자
if (!empty($data['sdate'])) {
$sql .= "AND b.write_complete_tm >= '{$data['sdate']} 00:00:00' ";
}
if (!empty($data['edate'])) {
$sql .= "AND b.write_complete_tm <= '{$data['edate']} 00:00:00' ";
}
if (!empty($data['damdang'])) {
$sql .= "AND a.charger = '{$data['damdang']}' ";
} else {
if (!empty($data['team'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['team']}') ";
} else {
if (!empty($data['bonbu'])) {
$sql .= "AND a.dept_sq IN (SELECT h.dept_sq FROM departments i INNER JOIN departments h ON h.lft >= i.lft AND h.lft <= i.rgt WHERE i.dept_sq = '{$data['bonbu']}') ";
}
}
}
// 진행상태
if (!empty($data['stat']) && is_array($data['stat'])) {
$statList = "'" . implode("','", $data['stat']) . "'";
$sql .= " AND a.apt_step IN ({$statList}) ";
}
}
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 지도 마커 조회
public function getDeptMapList($deptSq)
{
$sql = "SELECT
a.hscp_no, a.rcpt_hscp_nm, a.rcpt_no, a.dept_sq, a.rcpt_x, a.rcpt_y
, a.charger, i.dept_nm, i.pdept_sq, i.dept_desc, c.usr_nm, c.usr_id
,(SELECT pdept_sq FROM departments WHERE dept_sq = i.dept_sq) bonbu
FROM
apt_ground a
LEFT JOIN apt_ground_photo AS gp ON gp.pho_no = (SELECT p.pho_no
FROM apt_ground_photo p
WHERE p.rcpt_no = a.rcpt_no
ORDER BY p.pho_no DESC
LIMIT 1)
LEFT JOIN users c ON a.charger = c.usr_id
LEFT JOIN region_codes e ON a.region_cd = e.region_cd
LEFT JOIN departments i ON a.dept_sq = i.dept_sq
LEFT JOIN codes f ON a.write_complete_yn = f.cd AND f.category = 'PHO_YN'
LEFT JOIN codes h ON a.vdo_up_ynx = h.cd AND h.category = 'VDO_YN'
LEFT JOIN codes g ON a.apt_step = g.cd AND g.category = 'APT_STEP' ";
$sql .= "WHERE 1=1 ";
if (!empty($deptSq)) {
$datas = "'" . implode("','", $deptSq) . "'";
$sql .= " AND a.dept_sq IN ({$datas}) ";
}
$query = $this->db->query($sql);
return $query->getResultArray();
}
// 아파트 담당자 정보변경
public function updateAptDamdang($params)
{
$sql = "UPDATE apt_ground SET ";
$sql .= "dept_sq = ?, charger = ? ";
$sql .= "WHERE rcpt_no = ? ";
$this->db->query($sql, $params);
if ($this->db->transStatus() === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
// 성공
return [
'success' => true,
];
}
// 평면도 정보 저장
public function saveImg($data)
{
$sql = "INSERT INTO apt_ground_photo
(rcpt_no, filenm, filenm_up, file_ext, insert_tm, file_path, thumb_path, thumb_nm, use_yn, cloud_upload_yn)
VALUES
({$data['rcpt_no']}, '{$data['origin_name']}', '{$data['file_name']}', '{$data['file_ext']}', NOW(), '{$data['upload_path']}', '{$data['upload_path']}'
, '{$data['thumb_name']}', 'Y', 'Y')
";
if ($this->db->query($sql) === false) {
return [
'success' => false,
'msg' => '저장실패',
];
}
return [
'success' => true,
];
}
}

View File

@@ -191,37 +191,16 @@
onclick="progressStatAll(this, this.checked);"> onclick="progressStatAll(this, this.checked);">
<label class="form-check-label" for="progress_stat_all">전체</label> <label class="form-check-label" for="progress_stat_all">전체</label>
</div> </div>
<?php foreach ($codes as $code): ?>
<?php if ($code['category'] === "APT_STEP"): ?>
<div class="form-check"> <div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]" <input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S01" value="S01"> id="stat_<?= $code['cd'] ?>" value="<?= $code['cd'] ?>">
<label class="form-check-label" for="stat_S01">미촬영</label> <label class="form-check-label"
</div> for="stat_<?= $code['cd'] ?>"><?= $code['cd_nm'] ?></label>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S02" value="S02">
<label class="form-check-label" for="stat_S02">사진촬영</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S03" value="S03">
<label class="form-check-label" for="stat_S03">영상촬영</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S04" value="S04">
<label class="form-check-label" for="stat_S04">촬영완료</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S05" value="S05">
<label class="form-check-label" for="stat_S05">검수완료</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="stat[]"
id="stat_S06" value="S06">
<label class="form-check-label" for="stat_S06">전송완료</label>
</div> </div>
<?php endif; ?>
<?php endforeach; ?>
</div> </div>
</div> </div>
@@ -536,7 +515,7 @@
// 이 팀이 현재 본부에 속한 팀인지 체크 // 이 팀이 현재 본부에 속한 팀인지 체크
if (String(userArr[i].dept_sq) === String(dept_sq)) { if (String(userArr[i].dept_sq) === String(dept_sq)) {
str += ` str += `
<option value="${userArr[i].usr_sq}">${userArr[i].usr_nm}</option> <option value="${userArr[i].usr_id}">${userArr[i].usr_nm}</option>
`; `;
} }
} }
@@ -653,7 +632,7 @@
} }
}, },
"columnDefs": [ "columnDefs": [
{ targets: 0, orderable: false, className: 'text-center' }, { className: 'text-center', targets: '_all' },
{ 'targets': '_all', "defaultContent": "" }, { 'targets': '_all', "defaultContent": "" },
// { 'className': 'text-center', 'targets': [0, 2, 3, 4] }, // { 'className': 'text-center', 'targets': [0, 2, 3, 4] },
], ],

File diff suppressed because it is too large Load Diff