단속 > 단속 등록&열람: 위치정보 삭제 기능 추가, 삭제 버튼 및 체크박스 UI 구현, 논리 삭제 서버 연동 및 그리드 업데이트 처리

dev
박성영 4 months ago
parent fc508bd000
commit cfe9c52906

@ -143,4 +143,29 @@ public class CrdnPstnInfoController {
}
return ApiResponseUtil.error(MessageConstants.Common.SAVE_ERROR);
}
/**
* (AJAX)
* : (DEL_YN='Y') . ID SQL .
*/
@Operation(summary = "위치정보 삭제", description = "선택된 위치정보들을 삭제합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "삭제 성공"),
@ApiResponse(responseCode = "400", description = "삭제 실패")
})
@PostMapping("/delete.ajax")
public ResponseEntity<?> deleteAjax(@RequestParam("pstnInfoIds") List<String> pstnInfoIds) {
try {
String dltr = SessionUtil.getUserId();
int result = service.deletePstnInfos(pstnInfoIds, dltr);
if (result > 0) {
return ApiResponseUtil.success("선택된 위치정보가 삭제되었습니다.");
}
return ApiResponseUtil.error("삭제할 위치정보가 없습니다.");
} catch (Exception e) {
log.error("위치정보 삭제 중 오류 발생: {}", e.getMessage(), e);
return ApiResponseUtil.error("위치정보 삭제 중 오류가 발생했습니다.");
}
}
}

@ -2,6 +2,7 @@ package go.kr.project.crdn.crndRegistAndView.crdnPstnInfo.mapper;
import go.kr.project.crdn.crndRegistAndView.crdnPstnInfo.model.CrdnPstnInfoVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -26,4 +27,7 @@ public interface CrdnPstnInfoMapper {
/** 수정 */
int updatePstnInfo(CrdnPstnInfoVO vo);
/** 삭제 (논리삭제) */
int deletePstnInfo(@Param("pstnInfoId") String pstnInfoId, @Param("dltr") String dltr);
}

@ -66,4 +66,10 @@ public class CrdnPstnInfoVO extends PagingVO {
private String sggCdNm; // 시군구 코드명(ORG_CD)
private String stdgEmdCdNm; // 법정동 코드명
private String ldcgCdNm; // 지목 코드명
// ============ 조인 컬럼(사용자정보) ============
private String rgtrAcnt; // 등록자 계정
private String rgtrNm; // 등록자명
private String mdfrAcnt; // 수정자 계정
private String mdfrNm; // 수정자명
}

@ -17,4 +17,7 @@ public interface CrdnPstnInfoService {
// 중요로직: 수정 - 팝업에서 수정 저장 시 사용
int updatePstnInfo(CrdnPstnInfoVO vo);
// 중요로직: 다중 삭제 - 체크박스로 선택된 위치정보들을 논리 삭제
int deletePstnInfos(List<String> pstnInfoIds, String dltr);
}

@ -55,4 +55,22 @@ public class CrdnPstnInfoServiceImpl extends EgovAbstractServiceImpl implements
public int updatePstnInfo(CrdnPstnInfoVO vo) {
return mapper.updatePstnInfo(vo);
}
@Override
public int deletePstnInfos(List<String> pstnInfoIds, String dltr) {
if (pstnInfoIds == null || pstnInfoIds.isEmpty()) {
return 0;
}
// 중요로직: 각 위치정보 ID에 대해 논리 삭제 수행
int deletedCount = 0;
for (String pstnInfoId : pstnInfoIds) {
if (pstnInfoId != null && !pstnInfoId.trim().isEmpty()) {
int result = mapper.deletePstnInfo(pstnInfoId, dltr);
deletedCount += result;
}
}
return deletedCount;
}
}

@ -37,8 +37,12 @@
p.RMRK,
p.REG_DT,
p.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
p.MDFCN_DT,
p.MDFR,
modUser.USER_ACNT AS MDFR_ACNT,
modUser.USER_NM AS MDFR_NM,
p.DEL_YN,
p.DEL_DT,
p.DLTR
@ -46,6 +50,8 @@
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = p.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_cd_detail emd ON emd.CD_GROUP_ID = 'STDG_EMD_CD' AND emd.CD_ID = p.STDG_EMD_CD AND emd.USE_YN = 'Y'
LEFT JOIN tb_cd_detail ld ON ld.CD_GROUP_ID = 'LDCG_CD' AND ld.CD_ID = p.LDCG_CD AND ld.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = p.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = p.MDFR
WHERE p.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND p.CRDN_YR = #{crdnYr}
@ -172,8 +178,12 @@
p.RMRK,
p.REG_DT,
p.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
p.MDFCN_DT,
p.MDFR,
modUser.USER_ACNT AS MDFR_ACNT,
modUser.USER_NM AS MDFR_NM,
p.DEL_YN,
p.DEL_DT,
p.DLTR
@ -181,6 +191,8 @@
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = p.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_cd_detail emd ON emd.CD_GROUP_ID = 'STDG_EMD_CD' AND emd.CD_ID = p.STDG_EMD_CD AND emd.USE_YN = 'Y'
LEFT JOIN tb_cd_detail ld ON ld.CD_GROUP_ID = 'LDCG_CD' AND ld.CD_ID = p.LDCG_CD AND ld.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = p.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = p.MDFR
WHERE p.PSTN_INFO_ID = #{pstnInfoId}
AND p.DEL_YN = 'N'
</select>
@ -216,4 +228,16 @@
AND DEL_YN = 'N'
</update>
<!-- 위치정보 삭제 (논리삭제) -->
<update id="deletePstnInfo">
/* PstnInfoMapper.deletePstnInfo : 위치정보 논리 삭제 */
UPDATE tb_pstn_info
SET
DEL_YN = 'Y',
DEL_DT = NOW(),
DLTR = #{dltr}
WHERE PSTN_INFO_ID = #{pstnInfoId}
AND DEL_YN = 'N'
</update>
</mapper>

@ -37,10 +37,8 @@
gridConfig.setOptGridId('pstnGrid'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
gridConfig.setOptRowHeaderType('checkbox'); // 행 첫번째 셀 타입(checkbox: 체크박스)
gridConfig.setOptUseClientSort(true); // 클라이언트 사이드 정렬
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
@ -77,9 +75,9 @@
{ header: '산여부', name: 'mtnYnCd', align: 'center', width: 80, hidden: true },
{ header: '비고', name: 'rmrk', align: 'left', width: 200 },
{ header: '등록일시', name: 'regDt', align: 'center', width: 150, hidden: true },
{ header: '등록자', name: 'rgtr', align: 'center', width: 100, hidden: true },
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 100, hidden: true },
{ header: '수정일시', name: 'mdfcnDt', align: 'center', width: 150 },
{ header: '수정자', name: 'mdfr', align: 'center', width: 100 },
{ header: '수정자', name: 'mdfrNm', align: 'center', width: 100 },
{ header: '삭제여부', name: 'delYn', align: 'center', width: 80, hidden: true },
{ header: '삭제일시', name: 'delDt', align: 'center', width: 150, hidden: true },
{ header: '삭제자', name: 'dltr', align: 'center', width: 100, hidden: true }

@ -106,6 +106,7 @@
<li class="tit">위치 정보</li>
<li class="rig">
<button type="button" id="pstnInfoRegistBtn" class="newbtn bg2-1">위치정보 추가</button>
<button type="button" id="pstnInfoDeleteBtn" class="newbtn bg2">삭제</button>
</li>
</ul>
<div class="containers">
@ -388,6 +389,62 @@
window.open(url, 'pstnInfoPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');
});
// 위치정보 삭제 버튼 클릭 이벤트
$('#pstnInfoDeleteBtn').on('click', function() {
// 중요로직: 위치정보 그리드에서 체크된 행들을 삭제
if (!self.grids.pstn || !self.grids.pstn.grid || !self.grids.pstn.grid.instance) {
alert('위치정보 그리드가 초기화되지 않았습니다.');
return;
}
var checkedRows = self.grids.pstn.grid.instance.getCheckedRows();
if (checkedRows.length === 0) {
alert('삭제할 위치정보를 선택해주세요.');
return;
}
if (!confirm('선택된 ' + checkedRows.length + '건의 위치정보를 삭제하시겠습니까?')) {
return;
}
// 삭제할 위치정보 ID 목록 수집
var deleteIds = checkedRows.map(function(row) {
return row.pstnInfoId;
}).filter(function(id) {
return id; // 빈 값 제외
});
if (deleteIds.length === 0) {
alert('삭제할 수 있는 위치정보가 없습니다.');
return;
}
// 중요로직: 서버에 삭제 요청
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnPstnInfo/delete.ajax"/>',
type: 'POST',
data: {
pstnInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {
if (response && response.success) {
alert('선택된 위치정보가 삭제되었습니다.');
// 그리드 새로고침
if (self.grids.pstn && self.grids.pstn.search) {
self.grids.pstn.search();
}
} else {
alert(response.message || '위치정보 삭제에 실패했습니다.');
}
},
error: function(xhr, status, error) {
alert('위치정보 삭제 중 오류가 발생했습니다.');
console.error('삭제 오류:', error);
}
});
});
// 조사원 선택 버튼 클릭 이벤트 (한글 주석: 화면에서 팝업을 호출하는 트리거)
$('#btnExmnrSelect').on('click', function() {
self.openExmnrPopup();

Loading…
Cancel
Save