개발자포탈 사용자/법인 삭제 기능 개선 및 완전삭제 기능 추가
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8"%>
|
||||
<%@ page import="java.io.*"%>
|
||||
<%@ page import="com.eactive.eai.common.util.SystemUtil"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
@@ -8,6 +9,7 @@
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Expires", "0");
|
||||
|
||||
boolean isProdServer = SystemUtil.isProdServer();
|
||||
%>
|
||||
<html>
|
||||
<head>
|
||||
@@ -20,7 +22,8 @@ var url = '<c:url value="/onl/apim/portalorg/portalOrgMan.json" />';
|
||||
var url_view = '<c:url value="/onl/apim/portalorg/portalOrgMan.view" />';
|
||||
var select_approvalStatus = "";
|
||||
var select_status = "";
|
||||
/* var select_orgType = ""; */
|
||||
var isProdServer = <%= isProdServer %>;
|
||||
var gridRowDataMap = {};
|
||||
|
||||
function getGridSelectText(key, value, data) {
|
||||
if (!Array.isArray(data) || data.length === 0) {
|
||||
@@ -34,9 +37,104 @@ function getGridSelectText(key, value, data) {
|
||||
}
|
||||
|
||||
function formatCompanyRegNo(text) {
|
||||
if (!text) return "";
|
||||
return text.replace(/(\d{3})(\d{2})(\d{5})/, "$1-$2-$3");
|
||||
}
|
||||
|
||||
/* 선택된 법인 삭제 - 상태에 따라 Soft/Hard Delete 자동 분기 */
|
||||
function deleteSelectedOrgs() {
|
||||
var selectedIds = $("#grid").jqGrid('getGridParam', 'selarrrow');
|
||||
|
||||
if (selectedIds.length === 0) {
|
||||
showAlert("삭제할 법인을 선택해주세요.", {type: 'warning'});
|
||||
return;
|
||||
}
|
||||
|
||||
// 선택된 항목을 REMOVED / 비REMOVED로 분류
|
||||
var softDeleteIds = [];
|
||||
var hardDeleteIds = [];
|
||||
for (var i = 0; i < selectedIds.length; i++) {
|
||||
var rowRaw = gridRowDataMap[selectedIds[i]];
|
||||
if (rowRaw && rowRaw.orgStatus === 'REMOVED') {
|
||||
hardDeleteIds.push(selectedIds[i]);
|
||||
} else {
|
||||
softDeleteIds.push(selectedIds[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// 비운영 환경이 아니면 Hard Delete 불가
|
||||
if (isProdServer && hardDeleteIds.length > 0) {
|
||||
showAlert("운영 환경에서는 삭제(탈퇴) 상태인 항목을 완전삭제할 수 없습니다.", {type: 'error'});
|
||||
return;
|
||||
}
|
||||
|
||||
var messages = [];
|
||||
if (softDeleteIds.length > 0) messages.push(softDeleteIds.length + "개 삭제(탈퇴 처리)");
|
||||
if (hardDeleteIds.length > 0) messages.push(hardDeleteIds.length + "개 완전삭제(DB 영구 삭제)");
|
||||
|
||||
var confirmMsg = "선택된 법인: " + messages.join(", ") + "\n진행하시겠습니까?";
|
||||
var confirmType = hardDeleteIds.length > 0 ? 'error' : 'warning';
|
||||
|
||||
showConfirm(confirmMsg, {
|
||||
type: confirmType,
|
||||
onConfirm: function() {
|
||||
var confirmAndExecute = function() {
|
||||
var completed = 0;
|
||||
var total = (softDeleteIds.length > 0 ? 1 : 0) + (hardDeleteIds.length > 0 ? 1 : 0);
|
||||
var resultMessages = [];
|
||||
var hasError = false;
|
||||
|
||||
function checkDone() {
|
||||
completed++;
|
||||
if (completed >= total) {
|
||||
var finalType = hasError ? 'error' : 'success';
|
||||
showAlert(resultMessages.join("\n"), {type: finalType, onClose: function() {
|
||||
$("#grid").trigger("reloadGrid");
|
||||
}});
|
||||
}
|
||||
}
|
||||
|
||||
if (softDeleteIds.length > 0) {
|
||||
$.ajax({
|
||||
type: "POST", url: url, dataType: "json",
|
||||
data: { cmd: 'DELETE_MULTIPLE', ids: softDeleteIds.join(',') },
|
||||
success: function(data) {
|
||||
resultMessages.push(data.message);
|
||||
if (data.status !== "success") hasError = true;
|
||||
checkDone();
|
||||
},
|
||||
error: function(e) { hasError = true; resultMessages.push("삭제 오류: " + e.responseText); checkDone(); }
|
||||
});
|
||||
}
|
||||
|
||||
if (hardDeleteIds.length > 0) {
|
||||
$.ajax({
|
||||
type: "POST", url: url, dataType: "json",
|
||||
data: { cmd: 'HARD_DELETE_MULTIPLE', ids: hardDeleteIds.join(',') },
|
||||
success: function(data) {
|
||||
resultMessages.push(data.message);
|
||||
if (data.status !== "success") hasError = true;
|
||||
checkDone();
|
||||
},
|
||||
error: function(e) { hasError = true; resultMessages.push("완전삭제 오류: " + e.responseText); checkDone(); }
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Hard Delete 포함 시 2차 확인
|
||||
if (hardDeleteIds.length > 0) {
|
||||
showConfirm("최종 확인: 완전삭제는 되돌릴 수 없습니다. 정말로 실행하시겠습니까?", {
|
||||
type: 'error',
|
||||
title: '최종 확인',
|
||||
onConfirm: confirmAndExecute
|
||||
});
|
||||
} else {
|
||||
confirmAndExecute();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function init(){
|
||||
$.ajax({
|
||||
type : "POST",
|
||||
@@ -110,6 +208,8 @@ function initializeGrid() {
|
||||
autowidth: true,
|
||||
viewrecords: true,
|
||||
rowList : eval('[${rmsDefaultRowList}]'),
|
||||
multiselect: true,
|
||||
multiboxonly: true,
|
||||
loadComplete:function (d){
|
||||
var records = $(this).getGridParam('records');
|
||||
var page = $(this).getGridParam('page');
|
||||
@@ -119,12 +219,26 @@ function initializeGrid() {
|
||||
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var number = ((page - 1) * rowNum + i) + 1;
|
||||
// var reverseNumber = records - ((page - 1) * rowNum + i);
|
||||
$(this).setCell(rows[i], 'rowNum', number);
|
||||
}
|
||||
for(var i = 0 ; i< colModel.length; i++){
|
||||
$(this).setColProp(colModel[i].name, {sortable : false});
|
||||
}
|
||||
|
||||
// 원본 행 데이터 맵 구성 및 REMOVED 행 스타일링
|
||||
if (d && d.rows) {
|
||||
gridRowDataMap = {};
|
||||
for (var j = 0; j < d.rows.length; j++) {
|
||||
gridRowDataMap[d.rows[j].id] = d.rows[j];
|
||||
if (!isProdServer && d.rows[j].orgStatus === 'REMOVED') {
|
||||
$('#grid tr#' + $.jgrid.jqID(d.rows[j].id)).css({
|
||||
'background-color': '#f8d7da',
|
||||
'text-decoration': 'line-through',
|
||||
'opacity': '0.7'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
ondblClickRow: function(rowId) {
|
||||
var rowData = $(this).getRowData(rowId);
|
||||
@@ -169,6 +283,10 @@ $(document).ready(function() {
|
||||
goNav(url2);
|
||||
});
|
||||
|
||||
$("#btn_delete_selected").click(function(){
|
||||
deleteSelectedOrgs();
|
||||
});
|
||||
|
||||
$("input[name^=search]").keydown(function(key){
|
||||
if (key.keyCode == 13){
|
||||
$("#btn_search").click();
|
||||
@@ -194,10 +312,16 @@ $(document).ready(function() {
|
||||
<div class="content_middle" id="content_middle">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_new" level="W"><i class="material-icons">add</i> <%= localeMessage.getString("button.new") %></button>
|
||||
<button type="button" class="cssbtn" id="btn_delete_selected" level="W" style="background-color: #dc3545; border-color: #dc3545; color: white;"><i class="material-icons">delete_forever</i> 선택 삭제</button>
|
||||
<button type="button" class="cssbtn" id="btn_search" level="R"><i class="material-icons">search</i> <%= localeMessage.getString("button.search") %></button>
|
||||
</div>
|
||||
<%--법인정보관리--%>
|
||||
<div class="title"><%= localeMessage.getString("portalOrg.title") %></div>
|
||||
<% if (!isProdServer) { %>
|
||||
<div style="background:#fff3cd; border:1px solid #ffc107; padding:8px 15px; margin:5px 0; border-radius:4px; color:#856404;">
|
||||
<strong>[비운영 환경]</strong> 삭제된(탈퇴) 데이터가 포함되어 표시됩니다. 탈퇴 상태 항목 선택 시 DB에서 영구 삭제됩니다.
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<table class="search_condition" cellspacing=0;>
|
||||
<tbody>
|
||||
@@ -235,4 +359,3 @@ $(document).ready(function() {
|
||||
</div><!-- end right_box -->
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" %>
|
||||
<%@ page import="java.io.*" %>
|
||||
<%@ page import="com.eactive.eai.common.util.SystemUtil"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
@@ -8,6 +9,7 @@
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Expires", "0");
|
||||
|
||||
boolean isProdServer = SystemUtil.isProdServer();
|
||||
%>
|
||||
<html>
|
||||
<head>
|
||||
@@ -22,41 +24,101 @@
|
||||
var url_view = '<c:url value="/onl/apim/portaluser/portalUserMan.view" />';
|
||||
var select_approvalStatus = "";
|
||||
var select_userStatus = "";
|
||||
var isProdServer = <%= isProdServer %>;
|
||||
|
||||
/* 선택된 사용자 일괄 삭제 */
|
||||
// 원본 행 데이터를 ID로 조회하기 위한 맵
|
||||
var gridRowDataMap = {};
|
||||
|
||||
/* 선택된 사용자 삭제 - 상태에 따라 Soft/Hard Delete 자동 분기 */
|
||||
function deleteSelectedUsers() {
|
||||
var selectedIds = $("#grid").jqGrid('getGridParam', 'selarrrow');
|
||||
|
||||
if (selectedIds.length === 0) {
|
||||
alert("삭제할 사용자를 선택해주세요.");
|
||||
showAlert("삭제할 사용자를 선택해주세요.", {type: 'warning'});
|
||||
return;
|
||||
}
|
||||
|
||||
if (!confirm("선택된 " + selectedIds.length + "명의 사용자를 삭제하시겠습니까?\n이 작업은 되돌릴 수 없습니다.")) {
|
||||
// 선택된 항목을 REMOVED / 비REMOVED로 분류
|
||||
var softDeleteIds = [];
|
||||
var hardDeleteIds = [];
|
||||
for (var i = 0; i < selectedIds.length; i++) {
|
||||
var rowRaw = gridRowDataMap[selectedIds[i]];
|
||||
if (rowRaw && rowRaw.userStatus === 'REMOVED') {
|
||||
hardDeleteIds.push(selectedIds[i]);
|
||||
} else {
|
||||
softDeleteIds.push(selectedIds[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// 비운영 환경이 아니면 Hard Delete 불가
|
||||
if (isProdServer && hardDeleteIds.length > 0) {
|
||||
showAlert("운영 환경에서는 삭제(탈퇴) 상태인 항목을 완전삭제할 수 없습니다.", {type: 'error'});
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
data: {
|
||||
cmd: 'DELETE_MULTIPLE',
|
||||
ids: selectedIds.join(',')
|
||||
},
|
||||
success: function (data) {
|
||||
if (data.status === "success") {
|
||||
alert(data.message || "선택된 사용자가 삭제되었습니다.");
|
||||
$("#grid").trigger("reloadGrid");
|
||||
// 체크박스 초기화
|
||||
$("#grid").jqGrid('clearGridData', true);
|
||||
$("#grid").trigger("reloadGrid");
|
||||
var messages = [];
|
||||
if (softDeleteIds.length > 0) messages.push(softDeleteIds.length + "명 삭제(탈퇴 처리)");
|
||||
if (hardDeleteIds.length > 0) messages.push(hardDeleteIds.length + "명 완전삭제(DB 영구 삭제)");
|
||||
|
||||
var confirmMsg = "선택된 사용자: " + messages.join(", ") + "\n진행하시겠습니까?";
|
||||
var confirmType = hardDeleteIds.length > 0 ? 'error' : 'warning';
|
||||
|
||||
showConfirm(confirmMsg, {
|
||||
type: confirmType,
|
||||
onConfirm: function() {
|
||||
var confirmAndExecute = function() {
|
||||
var completed = 0;
|
||||
var total = (softDeleteIds.length > 0 ? 1 : 0) + (hardDeleteIds.length > 0 ? 1 : 0);
|
||||
var resultMessages = [];
|
||||
var hasError = false;
|
||||
|
||||
function checkDone() {
|
||||
completed++;
|
||||
if (completed >= total) {
|
||||
var finalType = hasError ? 'error' : 'success';
|
||||
showAlert(resultMessages.join("\n"), {type: finalType, onClose: function() {
|
||||
$("#grid").trigger("reloadGrid");
|
||||
}});
|
||||
}
|
||||
}
|
||||
|
||||
if (softDeleteIds.length > 0) {
|
||||
$.ajax({
|
||||
type: "POST", url: url, dataType: "json",
|
||||
data: { cmd: 'DELETE_MULTIPLE', ids: softDeleteIds.join(',') },
|
||||
success: function(data) {
|
||||
resultMessages.push(data.message);
|
||||
if (data.status !== "success") hasError = true;
|
||||
checkDone();
|
||||
},
|
||||
error: function(e) { hasError = true; resultMessages.push("삭제 오류: " + e.responseText); checkDone(); }
|
||||
});
|
||||
}
|
||||
|
||||
if (hardDeleteIds.length > 0) {
|
||||
$.ajax({
|
||||
type: "POST", url: url, dataType: "json",
|
||||
data: { cmd: 'HARD_DELETE_MULTIPLE', ids: hardDeleteIds.join(',') },
|
||||
success: function(data) {
|
||||
resultMessages.push(data.message);
|
||||
if (data.status !== "success") hasError = true;
|
||||
checkDone();
|
||||
},
|
||||
error: function(e) { hasError = true; resultMessages.push("완전삭제 오류: " + e.responseText); checkDone(); }
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Hard Delete 포함 시 2차 확인
|
||||
if (hardDeleteIds.length > 0) {
|
||||
showConfirm("최종 확인: 완전삭제는 되돌릴 수 없습니다. 정말로 실행하시겠습니까?", {
|
||||
type: 'error',
|
||||
title: '최종 확인',
|
||||
onConfirm: confirmAndExecute
|
||||
});
|
||||
} else {
|
||||
alert(data.message || "삭제 중 오류가 발생했습니다.");
|
||||
confirmAndExecute();
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
alert("오류: " + e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -168,12 +230,26 @@
|
||||
|
||||
for (var i = 0; i < rows.length; i++) {
|
||||
var number = ((page - 1) * rowNum + i) + 1;
|
||||
// var reverseNumber = records - ((page - 1) * rowNum + i);
|
||||
$(this).setCell(rows[i], 'rowNum', number);
|
||||
}
|
||||
for (var i = 0; i < colModel.length; i++) {
|
||||
$(this).setColProp(colModel[i].name, {sortable: false});
|
||||
}
|
||||
|
||||
// 원본 행 데이터 맵 구성 및 REMOVED 행 스타일링
|
||||
if (d && d.rows) {
|
||||
gridRowDataMap = {};
|
||||
for (var j = 0; j < d.rows.length; j++) {
|
||||
gridRowDataMap[d.rows[j].id] = d.rows[j];
|
||||
if (!isProdServer && d.rows[j].userStatus === 'REMOVED') {
|
||||
$('#grid tr#' + $.jgrid.jqID(d.rows[j].id)).css({
|
||||
'background-color': '#f8d7da',
|
||||
'text-decoration': 'line-through',
|
||||
'opacity': '0.7'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
ondblClickRow: function (rowId) {
|
||||
var rowData = $(this).getRowData(rowId);
|
||||
@@ -198,7 +274,6 @@
|
||||
init();
|
||||
|
||||
$("#btn_search").click(function () {
|
||||
//var searchMobileNumber = $("#searchMobileNumber").val().trim();
|
||||
var postData = getSearchForJqgrid("cmd", "LIST");
|
||||
|
||||
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
|
||||
@@ -253,6 +328,11 @@
|
||||
</div>
|
||||
<div class="title"><%= localeMessage.getString("portalUser.title") %>
|
||||
</div>
|
||||
<% if (!isProdServer) { %>
|
||||
<div style="background:#fff3cd; border:1px solid #ffc107; padding:8px 15px; margin:5px 0; border-radius:4px; color:#856404;">
|
||||
<strong>[비운영 환경]</strong> 삭제된(탈퇴) 데이터가 포함되어 표시됩니다. 탈퇴 상태 항목 선택 시 DB에서 영구 삭제됩니다.
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<table class="search_condition" cellspacing=0;>
|
||||
<tbody>
|
||||
@@ -292,21 +372,6 @@
|
||||
</th>
|
||||
<td><input type="text" name="searchMobileNumber" value="${param.searchMobileNumber}"></td>
|
||||
</tr>
|
||||
<%--<tr>
|
||||
<th><%= localeMessage.getString("portalUser.approvalStatus") %></th>
|
||||
<td>
|
||||
<div class="select-style">
|
||||
<select type="text" name="searchApprovalStatus" value="${param.searchApprovalStatus}"></select>
|
||||
</div>
|
||||
</td>
|
||||
<th ><%= localeMessage.getString("portalUser.createOn")%></th>
|
||||
<td>
|
||||
<input type="text" name="searchStartYYYYMMDD" id="startDatepicker" readonly="readonly" value="" size="10" style="width:160px;">
|
||||
~ <input type="text" name="searchEndYYYYMMDD" value="" id="endDatepicker" size="10" readonly="readonly" style="width:160px;">
|
||||
<input type="hidden" name="searchStartDate" value="" style="width:0px;">
|
||||
<input type="hidden" name="searchEndDate" value="" style="width:0px;">
|
||||
</td>
|
||||
</tr> --%>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -317,4 +382,3 @@
|
||||
</div><!-- end right_box -->
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user