개발자포탈 사용자/법인 삭제 기능 개선 및 완전삭제 기능 추가
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=utf-8"%>
|
<%@ page language="java" contentType="text/html; charset=utf-8"%>
|
||||||
<%@ page import="java.io.*"%>
|
<%@ page import="java.io.*"%>
|
||||||
|
<%@ page import="com.eactive.eai.common.util.SystemUtil"%>
|
||||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||||
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
|
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
|
||||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||||
@@ -8,6 +9,7 @@
|
|||||||
response.setHeader("Cache-Control", "no-cache");
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
response.setHeader("Expires", "0");
|
response.setHeader("Expires", "0");
|
||||||
|
|
||||||
|
boolean isProdServer = SystemUtil.isProdServer();
|
||||||
%>
|
%>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<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 url_view = '<c:url value="/onl/apim/portalorg/portalOrgMan.view" />';
|
||||||
var select_approvalStatus = "";
|
var select_approvalStatus = "";
|
||||||
var select_status = "";
|
var select_status = "";
|
||||||
/* var select_orgType = ""; */
|
var isProdServer = <%= isProdServer %>;
|
||||||
|
var gridRowDataMap = {};
|
||||||
|
|
||||||
function getGridSelectText(key, value, data) {
|
function getGridSelectText(key, value, data) {
|
||||||
if (!Array.isArray(data) || data.length === 0) {
|
if (!Array.isArray(data) || data.length === 0) {
|
||||||
@@ -34,9 +37,104 @@ function getGridSelectText(key, value, data) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function formatCompanyRegNo(text) {
|
function formatCompanyRegNo(text) {
|
||||||
|
if (!text) return "";
|
||||||
return text.replace(/(\d{3})(\d{2})(\d{5})/, "$1-$2-$3");
|
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(){
|
function init(){
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type : "POST",
|
type : "POST",
|
||||||
@@ -110,6 +208,8 @@ function initializeGrid() {
|
|||||||
autowidth: true,
|
autowidth: true,
|
||||||
viewrecords: true,
|
viewrecords: true,
|
||||||
rowList : eval('[${rmsDefaultRowList}]'),
|
rowList : eval('[${rmsDefaultRowList}]'),
|
||||||
|
multiselect: true,
|
||||||
|
multiboxonly: true,
|
||||||
loadComplete:function (d){
|
loadComplete:function (d){
|
||||||
var records = $(this).getGridParam('records');
|
var records = $(this).getGridParam('records');
|
||||||
var page = $(this).getGridParam('page');
|
var page = $(this).getGridParam('page');
|
||||||
@@ -119,12 +219,26 @@ function initializeGrid() {
|
|||||||
|
|
||||||
for (var i = 0; i < rows.length; i++) {
|
for (var i = 0; i < rows.length; i++) {
|
||||||
var number = ((page - 1) * rowNum + i) + 1;
|
var number = ((page - 1) * rowNum + i) + 1;
|
||||||
// var reverseNumber = records - ((page - 1) * rowNum + i);
|
|
||||||
$(this).setCell(rows[i], 'rowNum', number);
|
$(this).setCell(rows[i], 'rowNum', number);
|
||||||
}
|
}
|
||||||
for(var i = 0 ; i< colModel.length; i++){
|
for(var i = 0 ; i< colModel.length; i++){
|
||||||
$(this).setColProp(colModel[i].name, {sortable : false});
|
$(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) {
|
ondblClickRow: function(rowId) {
|
||||||
var rowData = $(this).getRowData(rowId);
|
var rowData = $(this).getRowData(rowId);
|
||||||
@@ -169,6 +283,10 @@ $(document).ready(function() {
|
|||||||
goNav(url2);
|
goNav(url2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#btn_delete_selected").click(function(){
|
||||||
|
deleteSelectedOrgs();
|
||||||
|
});
|
||||||
|
|
||||||
$("input[name^=search]").keydown(function(key){
|
$("input[name^=search]").keydown(function(key){
|
||||||
if (key.keyCode == 13){
|
if (key.keyCode == 13){
|
||||||
$("#btn_search").click();
|
$("#btn_search").click();
|
||||||
@@ -194,10 +312,16 @@ $(document).ready(function() {
|
|||||||
<div class="content_middle" id="content_middle">
|
<div class="content_middle" id="content_middle">
|
||||||
<div class="search_wrap">
|
<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_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>
|
<button type="button" class="cssbtn" id="btn_search" level="R"><i class="material-icons">search</i> <%= localeMessage.getString("button.search") %></button>
|
||||||
</div>
|
</div>
|
||||||
<%--법인정보관리--%>
|
<%--법인정보관리--%>
|
||||||
<div class="title"><%= localeMessage.getString("portalOrg.title") %></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;>
|
<table class="search_condition" cellspacing=0;>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -235,4 +359,3 @@ $(document).ready(function() {
|
|||||||
</div><!-- end right_box -->
|
</div><!-- end right_box -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=utf-8" %>
|
<%@ page language="java" contentType="text/html; charset=utf-8" %>
|
||||||
<%@ page import="java.io.*" %>
|
<%@ page import="java.io.*" %>
|
||||||
|
<%@ page import="com.eactive.eai.common.util.SystemUtil"%>
|
||||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
|
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
|
||||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||||
@@ -8,6 +9,7 @@
|
|||||||
response.setHeader("Cache-Control", "no-cache");
|
response.setHeader("Cache-Control", "no-cache");
|
||||||
response.setHeader("Expires", "0");
|
response.setHeader("Expires", "0");
|
||||||
|
|
||||||
|
boolean isProdServer = SystemUtil.isProdServer();
|
||||||
%>
|
%>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
@@ -22,41 +24,101 @@
|
|||||||
var url_view = '<c:url value="/onl/apim/portaluser/portalUserMan.view" />';
|
var url_view = '<c:url value="/onl/apim/portaluser/portalUserMan.view" />';
|
||||||
var select_approvalStatus = "";
|
var select_approvalStatus = "";
|
||||||
var select_userStatus = "";
|
var select_userStatus = "";
|
||||||
|
var isProdServer = <%= isProdServer %>;
|
||||||
|
|
||||||
/* 선택된 사용자 일괄 삭제 */
|
// 원본 행 데이터를 ID로 조회하기 위한 맵
|
||||||
|
var gridRowDataMap = {};
|
||||||
|
|
||||||
|
/* 선택된 사용자 삭제 - 상태에 따라 Soft/Hard Delete 자동 분기 */
|
||||||
function deleteSelectedUsers() {
|
function deleteSelectedUsers() {
|
||||||
var selectedIds = $("#grid").jqGrid('getGridParam', 'selarrrow');
|
var selectedIds = $("#grid").jqGrid('getGridParam', 'selarrrow');
|
||||||
|
|
||||||
if (selectedIds.length === 0) {
|
if (selectedIds.length === 0) {
|
||||||
alert("삭제할 사용자를 선택해주세요.");
|
showAlert("삭제할 사용자를 선택해주세요.", {type: 'warning'});
|
||||||
return;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$.ajax({
|
var messages = [];
|
||||||
type: "POST",
|
if (softDeleteIds.length > 0) messages.push(softDeleteIds.length + "명 삭제(탈퇴 처리)");
|
||||||
url: url,
|
if (hardDeleteIds.length > 0) messages.push(hardDeleteIds.length + "명 완전삭제(DB 영구 삭제)");
|
||||||
dataType: "json",
|
|
||||||
data: {
|
var confirmMsg = "선택된 사용자: " + messages.join(", ") + "\n진행하시겠습니까?";
|
||||||
cmd: 'DELETE_MULTIPLE',
|
var confirmType = hardDeleteIds.length > 0 ? 'error' : 'warning';
|
||||||
ids: selectedIds.join(',')
|
|
||||||
},
|
showConfirm(confirmMsg, {
|
||||||
success: function (data) {
|
type: confirmType,
|
||||||
if (data.status === "success") {
|
onConfirm: function() {
|
||||||
alert(data.message || "선택된 사용자가 삭제되었습니다.");
|
var confirmAndExecute = function() {
|
||||||
$("#grid").trigger("reloadGrid");
|
var completed = 0;
|
||||||
// 체크박스 초기화
|
var total = (softDeleteIds.length > 0 ? 1 : 0) + (hardDeleteIds.length > 0 ? 1 : 0);
|
||||||
$("#grid").jqGrid('clearGridData', true);
|
var resultMessages = [];
|
||||||
$("#grid").trigger("reloadGrid");
|
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 {
|
} else {
|
||||||
alert(data.message || "삭제 중 오류가 발생했습니다.");
|
confirmAndExecute();
|
||||||
}
|
}
|
||||||
},
|
|
||||||
error: function (e) {
|
|
||||||
alert("오류: " + e.responseText);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -168,12 +230,26 @@
|
|||||||
|
|
||||||
for (var i = 0; i < rows.length; i++) {
|
for (var i = 0; i < rows.length; i++) {
|
||||||
var number = ((page - 1) * rowNum + i) + 1;
|
var number = ((page - 1) * rowNum + i) + 1;
|
||||||
// var reverseNumber = records - ((page - 1) * rowNum + i);
|
|
||||||
$(this).setCell(rows[i], 'rowNum', number);
|
$(this).setCell(rows[i], 'rowNum', number);
|
||||||
}
|
}
|
||||||
for (var i = 0; i < colModel.length; i++) {
|
for (var i = 0; i < colModel.length; i++) {
|
||||||
$(this).setColProp(colModel[i].name, {sortable: false});
|
$(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) {
|
ondblClickRow: function (rowId) {
|
||||||
var rowData = $(this).getRowData(rowId);
|
var rowData = $(this).getRowData(rowId);
|
||||||
@@ -198,7 +274,6 @@
|
|||||||
init();
|
init();
|
||||||
|
|
||||||
$("#btn_search").click(function () {
|
$("#btn_search").click(function () {
|
||||||
//var searchMobileNumber = $("#searchMobileNumber").val().trim();
|
|
||||||
var postData = getSearchForJqgrid("cmd", "LIST");
|
var postData = getSearchForJqgrid("cmd", "LIST");
|
||||||
|
|
||||||
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
|
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
|
||||||
@@ -253,6 +328,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="title"><%= localeMessage.getString("portalUser.title") %>
|
<div class="title"><%= localeMessage.getString("portalUser.title") %>
|
||||||
</div>
|
</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;>
|
<table class="search_condition" cellspacing=0;>
|
||||||
<tbody>
|
<tbody>
|
||||||
@@ -292,21 +372,6 @@
|
|||||||
</th>
|
</th>
|
||||||
<td><input type="text" name="searchMobileNumber" value="${param.searchMobileNumber}"></td>
|
<td><input type="text" name="searchMobileNumber" value="${param.searchMobileNumber}"></td>
|
||||||
</tr>
|
</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>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
@@ -317,4 +382,3 @@
|
|||||||
</div><!-- end right_box -->
|
</div><!-- end right_box -->
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@@ -40,4 +40,10 @@ public class ApprovalService extends AbstractEMSDataSerivce<Approval, String, Ap
|
|||||||
|
|
||||||
return repository.findAll(predicate, pageable);
|
return repository.findAll(predicate, pageable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long countByRequesterId(String userId) {
|
||||||
|
return getJPAQueryFactory().selectFrom(QApproval.approval)
|
||||||
|
.where(QApproval.approval.requester.id.eq(userId))
|
||||||
|
.fetchCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
@@ -43,4 +43,19 @@ public class PortalInquiryService extends AbstractEMSDataSerivce<Inquiry, String
|
|||||||
public void deleteByIds(List<String> ids) {
|
public void deleteByIds(List<String> ids) {
|
||||||
repository.deleteAllById(ids);
|
repository.deleteAllById(ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long countByInquirerId(String userId) {
|
||||||
|
return getJPAQueryFactory().selectFrom(QInquiry.inquiry)
|
||||||
|
.where(QInquiry.inquiry.inquirer.id.eq(userId))
|
||||||
|
.fetchCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteByInquirerId(String userId) {
|
||||||
|
List<Inquiry> inquiries = getJPAQueryFactory().selectFrom(QInquiry.inquiry)
|
||||||
|
.where(QInquiry.inquiry.inquirer.id.eq(userId))
|
||||||
|
.fetch();
|
||||||
|
if (!inquiries.isEmpty()) {
|
||||||
|
repository.deleteAll(inquiries);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+8
-1
@@ -1,5 +1,6 @@
|
|||||||
package com.eactive.eai.rms.data.entity.onl.apim.portalorg;
|
package com.eactive.eai.rms.data.entity.onl.apim.portalorg;
|
||||||
|
|
||||||
|
import com.eactive.apim.portal.apprequest.entity.QAppRequest;
|
||||||
import com.eactive.apim.portal.portalorg.entity.PortalOrg;
|
import com.eactive.apim.portal.portalorg.entity.PortalOrg;
|
||||||
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums;
|
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums;
|
||||||
import com.eactive.apim.portal.portalorg.entity.QPortalOrg;
|
import com.eactive.apim.portal.portalorg.entity.QPortalOrg;
|
||||||
@@ -27,7 +28,7 @@ public class PortalOrgService extends AbstractEMSDataSerivce<PortalOrg, String,
|
|||||||
// 기본 list 조회시엔 REMOVED 상태 아닌 데이터만 조회
|
// 기본 list 조회시엔 REMOVED 상태 아닌 데이터만 조회
|
||||||
if (StringUtils.isNotBlank(portalOrgUISearch.getSearchOrgStatus())){
|
if (StringUtils.isNotBlank(portalOrgUISearch.getSearchOrgStatus())){
|
||||||
predicate.and(qPortalOrg.orgStatus.eq(PortalOrgEnums.OrgStatus.valueOf(portalOrgUISearch.getSearchOrgStatus())));
|
predicate.and(qPortalOrg.orgStatus.eq(PortalOrgEnums.OrgStatus.valueOf(portalOrgUISearch.getSearchOrgStatus())));
|
||||||
} else {
|
} else if (!portalOrgUISearch.isIncludeRemoved()) {
|
||||||
predicate.and(qPortalOrg.orgStatus.ne(PortalOrgEnums.OrgStatus.REMOVED));
|
predicate.and(qPortalOrg.orgStatus.ne(PortalOrgEnums.OrgStatus.REMOVED));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,4 +63,10 @@ public class PortalOrgService extends AbstractEMSDataSerivce<PortalOrg, String,
|
|||||||
repository.findAll(predicate).spliterator(), false)
|
repository.findAll(predicate).spliterator(), false)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long countAppRequestByOrgId(String orgId) {
|
||||||
|
return getJPAQueryFactory().selectFrom(QAppRequest.appRequest)
|
||||||
|
.where(QAppRequest.appRequest.org.id.eq(orgId))
|
||||||
|
.fetchCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+3
-1
@@ -16,5 +16,7 @@ public class PortalOrgUISearch {
|
|||||||
private String searchEndYYYYMMDD;
|
private String searchEndYYYYMMDD;
|
||||||
private String searchStartDate;
|
private String searchStartDate;
|
||||||
private String searchEndDate;
|
private String searchEndDate;
|
||||||
|
|
||||||
|
private boolean includeRemoved;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+14
-1
@@ -4,6 +4,7 @@ import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
|||||||
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
||||||
import com.eactive.apim.portal.portaluser.entity.QPortalUser;
|
import com.eactive.apim.portal.portaluser.entity.QPortalUser;
|
||||||
import com.eactive.apim.portal.portaluser.repository.PortalUserRepository;
|
import com.eactive.apim.portal.portaluser.repository.PortalUserRepository;
|
||||||
|
import com.eactive.apim.portal.template.entity.QMessageRequest;
|
||||||
import com.eactive.eai.rms.data.jpa.AbstractEMSDataSerivce;
|
import com.eactive.eai.rms.data.jpa.AbstractEMSDataSerivce;
|
||||||
import com.querydsl.core.BooleanBuilder;
|
import com.querydsl.core.BooleanBuilder;
|
||||||
import com.querydsl.core.types.dsl.BooleanExpression;
|
import com.querydsl.core.types.dsl.BooleanExpression;
|
||||||
@@ -26,7 +27,7 @@ public class PortalUserService extends AbstractEMSDataSerivce<PortalUser, String
|
|||||||
|
|
||||||
if (StringUtils.isNotBlank(portalUserUISearch.getSearchUserStatus())) {
|
if (StringUtils.isNotBlank(portalUserUISearch.getSearchUserStatus())) {
|
||||||
predicate.and(qPortalUser.userStatus.eq(PortalUserEnums.UserStatus.valueOf(portalUserUISearch.getSearchUserStatus())));
|
predicate.and(qPortalUser.userStatus.eq(PortalUserEnums.UserStatus.valueOf(portalUserUISearch.getSearchUserStatus())));
|
||||||
} else {
|
} else if (!portalUserUISearch.isIncludeRemoved()) {
|
||||||
predicate.and(qPortalUser.userStatus.ne(PortalUserEnums.UserStatus.REMOVED));
|
predicate.and(qPortalUser.userStatus.ne(PortalUserEnums.UserStatus.REMOVED));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,4 +85,16 @@ public class PortalUserService extends AbstractEMSDataSerivce<PortalUser, String
|
|||||||
.orderBy(qPortalUser.createdDate.desc())
|
.orderBy(qPortalUser.createdDate.desc())
|
||||||
.fetchFirst();
|
.fetchFirst();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long countByOrgId(String orgId) {
|
||||||
|
return getJPAQueryFactory().selectFrom(QPortalUser.portalUser)
|
||||||
|
.where(QPortalUser.portalUser.portalOrg.id.eq(orgId))
|
||||||
|
.fetchCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long countMessageRequestByUserId(String userId) {
|
||||||
|
return getJPAQueryFactory().selectFrom(QMessageRequest.messageRequest)
|
||||||
|
.where(QMessageRequest.messageRequest.user.id.eq(userId))
|
||||||
|
.fetchCount();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -21,4 +21,6 @@ public class PortalUserUISearch {
|
|||||||
private String searchStartDate;
|
private String searchStartDate;
|
||||||
private String searchEndDate;
|
private String searchEndDate;
|
||||||
|
|
||||||
|
private boolean includeRemoved;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import com.eactive.eai.rms.onl.apim.masking.MaskingUtils;
|
|||||||
import com.eactive.eai.rms.onl.apim.portalorg.PortalOrgManService;
|
import com.eactive.eai.rms.onl.apim.portalorg.PortalOrgManService;
|
||||||
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserManService;
|
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserManService;
|
||||||
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserUI;
|
import com.eactive.eai.rms.onl.apim.portaluser.PortalUserUI;
|
||||||
|
import com.eactive.eai.rms.common.acl.user.ui.UserUI;
|
||||||
import com.eactive.eai.rms.onl.transaction.apim.ApiInterfaceService;
|
import com.eactive.eai.rms.onl.transaction.apim.ApiInterfaceService;
|
||||||
import com.eactive.eai.rms.onl.transaction.apim.mapping.ApiSpecUIMapper;
|
import com.eactive.eai.rms.onl.transaction.apim.mapping.ApiSpecUIMapper;
|
||||||
import com.eactive.eai.rms.onl.transaction.apim.ui.ApiInterfaceUI;
|
import com.eactive.eai.rms.onl.transaction.apim.ui.ApiInterfaceUI;
|
||||||
@@ -61,29 +62,53 @@ public class PortalApprovalManService extends BaseService {
|
|||||||
|
|
||||||
public Page<PortalApprovalUI> selectList(Pageable pageable, PortalApprovalUISearch portalApprovalUISearch) {
|
public Page<PortalApprovalUI> selectList(Pageable pageable, PortalApprovalUISearch portalApprovalUISearch) {
|
||||||
Page<Approval> approval = approvalService.findAll(pageable, portalApprovalUISearch);
|
Page<Approval> approval = approvalService.findAll(pageable, portalApprovalUISearch);
|
||||||
return approval.map(entity -> getDetailWithMaskOption(entity.getId(), false));
|
return approval.map(entity -> {
|
||||||
|
try {
|
||||||
|
return getDetailWithMaskOption(entity.getId(), false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error("승인 상세 조회 실패 - ID: {}, 오류: {}", entity.getId(), e.getMessage());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 마스킹된 상세 정보 조회
|
* 마스킹된 상세 정보 조회
|
||||||
*/
|
*/
|
||||||
public PortalApprovalUI selectDetail(String id) {
|
public PortalApprovalUI selectDetail(String id) {
|
||||||
return getDetailWithMaskOption(id, false);
|
PortalApprovalUI result = getDetailWithMaskOption(id, false);
|
||||||
|
if (result == null) {
|
||||||
|
throw new IllegalArgumentException("승인 정보를 찾을 수 없습니다. ID: " + id);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 마스킹 해제된 상세 정보 조회
|
* 마스킹 해제된 상세 정보 조회
|
||||||
*/
|
*/
|
||||||
public PortalApprovalUI selectDetailUnmask(String id) {
|
public PortalApprovalUI selectDetailUnmask(String id) {
|
||||||
return getDetailWithMaskOption(id, false);
|
PortalApprovalUI result = getDetailWithMaskOption(id, false);
|
||||||
|
if (result == null) {
|
||||||
|
throw new IllegalArgumentException("승인 정보를 찾을 수 없습니다. ID: " + id);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private PortalApprovalUI getDetailWithMaskOption(String id, boolean isMasked) {
|
private PortalApprovalUI getDetailWithMaskOption(String id, boolean isMasked) {
|
||||||
Approval approval = approvalService.getById(id);
|
Optional<Approval> optApproval = approvalService.findById(id);
|
||||||
|
if (!optApproval.isPresent()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Approval approval = optApproval.get();
|
||||||
|
|
||||||
if (approval.getApprovalType().equals(ApprovalType.USER)) {
|
if (approval.getApprovalType().equals(ApprovalType.USER)) {
|
||||||
PortalUserApprovalUI userApprovalUI = portalUserApprovalUIMapper.toVo(approval);
|
PortalUserApprovalUI userApprovalUI = portalUserApprovalUIMapper.toVo(approval);
|
||||||
|
|
||||||
|
// 삭제된 요청자 처리
|
||||||
|
if (userApprovalUI.getRequester() == null) {
|
||||||
|
userApprovalUI.setRequester(createDeletedUserPlaceholder());
|
||||||
|
}
|
||||||
|
|
||||||
// 요청자 정보 마스킹 처리
|
// 요청자 정보 마스킹 처리
|
||||||
if (userApprovalUI.getRequester() != null && isMasked) {
|
if (userApprovalUI.getRequester() != null && isMasked) {
|
||||||
userApprovalUI.getRequester().setUserName(
|
userApprovalUI.getRequester().setUserName(
|
||||||
@@ -115,12 +140,23 @@ public class PortalApprovalManService extends BaseService {
|
|||||||
}
|
}
|
||||||
userApprovalUI.setPortalUser(userUI);
|
userApprovalUI.setPortalUser(userUI);
|
||||||
});
|
});
|
||||||
userApprovalUI.getApprovers().forEach(approvers -> approvers.getUser().setUserName(MaskingUtils.maskName(approvers.getUser().getUserName())));
|
userApprovalUI.getApprovers().forEach(approver -> {
|
||||||
|
if (approver.getUser() == null) {
|
||||||
|
approver.setUser(createDeletedApproverPlaceholder());
|
||||||
|
} else {
|
||||||
|
approver.getUser().setUserName(MaskingUtils.maskName(approver.getUser().getUserName()));
|
||||||
|
}
|
||||||
|
});
|
||||||
return userApprovalUI;
|
return userApprovalUI;
|
||||||
|
|
||||||
} else if (approval.getApprovalType().equals(ApprovalType.APP)) {
|
} else if (approval.getApprovalType().equals(ApprovalType.APP)) {
|
||||||
PortalAppApprovalUI appApprovalUI = portalAppApprovalUIMapper.toVo(approval);
|
PortalAppApprovalUI appApprovalUI = portalAppApprovalUIMapper.toVo(approval);
|
||||||
|
|
||||||
|
// 삭제된 요청자 처리
|
||||||
|
if (appApprovalUI.getRequester() == null) {
|
||||||
|
appApprovalUI.setRequester(createDeletedUserPlaceholder());
|
||||||
|
}
|
||||||
|
|
||||||
// 요청자 정보 마스킹 처리
|
// 요청자 정보 마스킹 처리
|
||||||
if (appApprovalUI.getRequester() != null && isMasked) {
|
if (appApprovalUI.getRequester() != null && isMasked) {
|
||||||
appApprovalUI.getRequester().setUserName(
|
appApprovalUI.getRequester().setUserName(
|
||||||
@@ -173,9 +209,13 @@ public class PortalApprovalManService extends BaseService {
|
|||||||
appApprovalUI.setApprovalDetail(appRequest.getReason());
|
appApprovalUI.setApprovalDetail(appRequest.getReason());
|
||||||
appApprovalUI.setClientName(appRequest.getClientName());
|
appApprovalUI.setClientName(appRequest.getClientName());
|
||||||
|
|
||||||
appApprovalUI.getApprovers().forEach(approverList ->
|
appApprovalUI.getApprovers().forEach(approver -> {
|
||||||
approverList.getUser().setUserName(MaskingUtils.maskName(approverList.getUser().getUserName()))
|
if (approver.getUser() == null) {
|
||||||
);
|
approver.setUser(createDeletedApproverPlaceholder());
|
||||||
|
} else {
|
||||||
|
approver.getUser().setUserName(MaskingUtils.maskName(approver.getUser().getUserName()));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return appApprovalUI;
|
return appApprovalUI;
|
||||||
@@ -238,6 +278,23 @@ public class PortalApprovalManService extends BaseService {
|
|||||||
// appApprovalUI.setClientName(appRequest.getClientName());
|
// appApprovalUI.setClientName(appRequest.getClientName());
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
private PortalUserUI createDeletedUserPlaceholder() {
|
||||||
|
PortalUserUI placeholder = new PortalUserUI();
|
||||||
|
placeholder.setUserName("삭제된 사용자");
|
||||||
|
placeholder.setLoginId("");
|
||||||
|
placeholder.setEmailAddr("");
|
||||||
|
placeholder.setMobileNumber("");
|
||||||
|
placeholder.setPhoneNumber("");
|
||||||
|
return placeholder;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserUI createDeletedApproverPlaceholder() {
|
||||||
|
UserUI placeholder = new UserUI();
|
||||||
|
placeholder.setUserName("삭제된 사용자");
|
||||||
|
placeholder.setUserId("");
|
||||||
|
return placeholder;
|
||||||
|
}
|
||||||
|
|
||||||
public void approve(String id, String approverId) {
|
public void approve(String id, String approverId) {
|
||||||
Map options = new HashMap<>();
|
Map options = new HashMap<>();
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.eactive.eai.common.util.SystemUtil;
|
||||||
import com.eactive.eai.rms.onl.common.exception.BizException;
|
import com.eactive.eai.rms.onl.common.exception.BizException;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -50,6 +51,7 @@ public class PortalOrgManController extends BaseAnnotationController {
|
|||||||
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=LIST")
|
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=LIST")
|
||||||
public ResponseEntity<GridResponse<PortalOrgUI>> selectList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
public ResponseEntity<GridResponse<PortalOrgUI>> selectList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
||||||
PortalOrgUISearch portalOrgUISearch) {
|
PortalOrgUISearch portalOrgUISearch) {
|
||||||
|
portalOrgUISearch.setIncludeRemoved(!SystemUtil.isProdServer());
|
||||||
Page<PortalOrgUI> page = portalOrgManService.selectList(pageable, portalOrgUISearch);
|
Page<PortalOrgUI> page = portalOrgManService.selectList(pageable, portalOrgUISearch);
|
||||||
return ResponseEntity.ok(new GridResponse<>(page));
|
return ResponseEntity.ok(new GridResponse<>(page));
|
||||||
}
|
}
|
||||||
@@ -69,6 +71,7 @@ public class PortalOrgManController extends BaseAnnotationController {
|
|||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
resultMap.put("approvalStatusRows", approvalStatusList);
|
resultMap.put("approvalStatusRows", approvalStatusList);
|
||||||
resultMap.put("orgStatusRows", orgStatusList);
|
resultMap.put("orgStatusRows", orgStatusList);
|
||||||
|
resultMap.put("isProdServer", SystemUtil.isProdServer());
|
||||||
return ResponseEntity.ok(resultMap);
|
return ResponseEntity.ok(resultMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,6 +104,89 @@ public class PortalOrgManController extends BaseAnnotationController {
|
|||||||
return ResponseEntity.ok().build();
|
return ResponseEntity.ok().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=DELETE_MULTIPLE")
|
||||||
|
public ResponseEntity<Map<String, Object>> deleteMultiple(String ids) {
|
||||||
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
try {
|
||||||
|
if (StringUtils.isBlank(ids)) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "삭제할 법인을 선택해주세요.");
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] idArray = ids.split(",");
|
||||||
|
for (String id : idArray) {
|
||||||
|
if (StringUtils.isNotBlank(id.trim())) {
|
||||||
|
portalOrgManService.removeOrg(id.trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resultMap.put("status", "success");
|
||||||
|
resultMap.put("message", idArray.length + "개의 법인이 삭제되었습니다.");
|
||||||
|
} catch (Exception e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "삭제 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=HARD_DELETE")
|
||||||
|
public ResponseEntity<Map<String, Object>> hardDelete(String id) {
|
||||||
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
try {
|
||||||
|
portalOrgManService.hardDeleteOrg(id);
|
||||||
|
resultMap.put("status", "success");
|
||||||
|
resultMap.put("message", "완전삭제가 완료되었습니다.");
|
||||||
|
} catch (BizException e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", e.getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=HARD_DELETE_MULTIPLE")
|
||||||
|
public ResponseEntity<Map<String, Object>> hardDeleteMultiple(String ids) {
|
||||||
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
try {
|
||||||
|
if (StringUtils.isBlank(ids)) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제할 법인을 선택해주세요.");
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] idArray = ids.split(",");
|
||||||
|
int successCount = 0;
|
||||||
|
List<String> failMessages = new java.util.ArrayList<>();
|
||||||
|
|
||||||
|
for (String id : idArray) {
|
||||||
|
if (StringUtils.isNotBlank(id.trim())) {
|
||||||
|
try {
|
||||||
|
portalOrgManService.hardDeleteOrg(id.trim());
|
||||||
|
successCount++;
|
||||||
|
} catch (BizException e) {
|
||||||
|
failMessages.add(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failMessages.isEmpty()) {
|
||||||
|
resultMap.put("status", "success");
|
||||||
|
resultMap.put("message", successCount + "개의 법인이 완전삭제되었습니다.");
|
||||||
|
} else {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 실패: " + String.join(", ", failMessages)
|
||||||
|
+ (successCount > 0 ? " (" + successCount + "건 성공)" : ""));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=POPUP_LIST")
|
@PostMapping(value = "/onl/apim/portalorg/portalOrgMan.json", params = "cmd=POPUP_LIST")
|
||||||
public ResponseEntity<GridResponse<PortalOrgUI>> selectOrgList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
public ResponseEntity<GridResponse<PortalOrgUI>> selectOrgList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
||||||
PortalOrgUISearch portalOrgUISearch) {
|
PortalOrgUISearch portalOrgUISearch) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.eactive.apim.portal.portalorg.entity.PortalOrg;
|
|||||||
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.ApprovalStatus;
|
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.ApprovalStatus;
|
||||||
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.OrgStatus;
|
import com.eactive.apim.portal.portalorg.entity.PortalOrgEnums.OrgStatus;
|
||||||
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
||||||
|
import com.eactive.eai.common.util.SystemUtil;
|
||||||
import com.eactive.eai.common.util.UUID;
|
import com.eactive.eai.common.util.UUID;
|
||||||
import com.eactive.eai.rms.common.base.BaseService;
|
import com.eactive.eai.rms.common.base.BaseService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.portalorg.PortalOrgService;
|
import com.eactive.eai.rms.data.entity.onl.apim.portalorg.PortalOrgService;
|
||||||
@@ -29,7 +30,9 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -134,6 +137,28 @@ public class PortalOrgManService extends BaseService {
|
|||||||
portalOrgService.save(portalOrg);
|
portalOrgService.save(portalOrg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void hardDeleteOrg(String id) {
|
||||||
|
if (SystemUtil.isProdServer()) {
|
||||||
|
throw new BizException("운영 환경에서는 완전삭제를 수행할 수 없습니다.");
|
||||||
|
}
|
||||||
|
PortalOrg portalOrg = portalOrgService.getById(id);
|
||||||
|
if (portalOrg.getOrgStatus() != OrgStatus.REMOVED) {
|
||||||
|
throw new BizException("삭제(탈퇴) 상태인 법인만 완전삭제할 수 있습니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> dependencies = new ArrayList<>();
|
||||||
|
long userCount = portalUserService.countByOrgId(id);
|
||||||
|
if (userCount > 0) dependencies.add("사용자 " + userCount + "건");
|
||||||
|
long appRequestCount = portalOrgService.countAppRequestByOrgId(id);
|
||||||
|
if (appRequestCount > 0) dependencies.add("앱 신청 " + appRequestCount + "건");
|
||||||
|
|
||||||
|
if (!dependencies.isEmpty()) {
|
||||||
|
throw new BizException("의존 데이터가 존재하여 완전삭제할 수 없습니다: " + String.join(", ", dependencies));
|
||||||
|
}
|
||||||
|
|
||||||
|
portalOrgService.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
public Map<String, Object> selectDetailWithUsers(String id) {
|
public Map<String, Object> selectDetailWithUsers(String id) {
|
||||||
return getDetailWithUsers(id, true);
|
return getDetailWithUsers(id, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.util.*;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
||||||
|
import com.eactive.eai.common.util.SystemUtil;
|
||||||
import com.eactive.eai.rms.onl.common.exception.BizException;
|
import com.eactive.eai.rms.onl.common.exception.BizException;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@@ -43,6 +44,7 @@ public class PortalUserManController extends BaseAnnotationController {
|
|||||||
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=LIST")
|
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=LIST")
|
||||||
public ResponseEntity<GridResponse<PortalUserUI>> selectList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
public ResponseEntity<GridResponse<PortalUserUI>> selectList(@SortDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable,
|
||||||
PortalUserUISearch portalUserUISearch) {
|
PortalUserUISearch portalUserUISearch) {
|
||||||
|
portalUserUISearch.setIncludeRemoved(!SystemUtil.isProdServer());
|
||||||
Page<PortalUserUI> page = portalUserManService.selectList(pageable, portalUserUISearch);
|
Page<PortalUserUI> page = portalUserManService.selectList(pageable, portalUserUISearch);
|
||||||
return ResponseEntity.ok(new GridResponse<>(page));
|
return ResponseEntity.ok(new GridResponse<>(page));
|
||||||
}
|
}
|
||||||
@@ -99,6 +101,7 @@ public class PortalUserManController extends BaseAnnotationController {
|
|||||||
resultMap.put("approvalStatusRows", approvalStatusList);
|
resultMap.put("approvalStatusRows", approvalStatusList);
|
||||||
resultMap.put("userStatusRows", userStatusList);
|
resultMap.put("userStatusRows", userStatusList);
|
||||||
resultMap.put("roleCodeRows", roleCodeList);
|
resultMap.put("roleCodeRows", roleCodeList);
|
||||||
|
resultMap.put("isProdServer", SystemUtil.isProdServer());
|
||||||
return ResponseEntity.ok(resultMap);
|
return ResponseEntity.ok(resultMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,6 +149,63 @@ public class PortalUserManController extends BaseAnnotationController {
|
|||||||
return ResponseEntity.ok(resultMap);
|
return ResponseEntity.ok(resultMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=HARD_DELETE")
|
||||||
|
public ResponseEntity<Map<String, Object>> hardDelete(String id) {
|
||||||
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
try {
|
||||||
|
portalUserManService.hardDeleteUser(id);
|
||||||
|
resultMap.put("status", "success");
|
||||||
|
resultMap.put("message", "완전삭제가 완료되었습니다.");
|
||||||
|
} catch (BizException e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", e.getMessage());
|
||||||
|
} catch (Exception e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=HARD_DELETE_MULTIPLE")
|
||||||
|
public ResponseEntity<Map<String, Object>> hardDeleteMultiple(String ids) {
|
||||||
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
try {
|
||||||
|
if (StringUtils.isBlank(ids)) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제할 사용자를 선택해주세요.");
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] idArray = ids.split(",");
|
||||||
|
int successCount = 0;
|
||||||
|
List<String> failMessages = new ArrayList<>();
|
||||||
|
|
||||||
|
for (String id : idArray) {
|
||||||
|
if (StringUtils.isNotBlank(id.trim())) {
|
||||||
|
try {
|
||||||
|
portalUserManService.hardDeleteUser(id.trim());
|
||||||
|
successCount++;
|
||||||
|
} catch (BizException e) {
|
||||||
|
failMessages.add(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (failMessages.isEmpty()) {
|
||||||
|
resultMap.put("status", "success");
|
||||||
|
resultMap.put("message", successCount + "명의 사용자가 완전삭제되었습니다.");
|
||||||
|
} else {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 실패: " + String.join(", ", failMessages)
|
||||||
|
+ (successCount > 0 ? " (" + successCount + "건 성공)" : ""));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
resultMap.put("status", "fail");
|
||||||
|
resultMap.put("message", "완전삭제 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return ResponseEntity.ok(resultMap);
|
||||||
|
}
|
||||||
|
|
||||||
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=CHECK_ID")
|
@PostMapping(value = "/onl/apim/portaluser/portalUserMan.json", params = "cmd=CHECK_ID")
|
||||||
public ResponseEntity<Object> checkDuplicateId(String loginId) {
|
public ResponseEntity<Object> checkDuplicateId(String loginId) {
|
||||||
String result = portalUserManService.checkDuplicateId(loginId) ? "success" : "";
|
String result = portalUserManService.checkDuplicateId(loginId) ? "success" : "";
|
||||||
|
|||||||
@@ -7,8 +7,11 @@ import com.eactive.apim.portal.portalorg.entity.PortalOrg;
|
|||||||
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
||||||
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
import com.eactive.apim.portal.portaluser.entity.PortalUserEnums;
|
||||||
import com.eactive.apim.portal.portaluser.entity.PortalUserPrivacyAgreement;
|
import com.eactive.apim.portal.portaluser.entity.PortalUserPrivacyAgreement;
|
||||||
|
import com.eactive.eai.common.util.SystemUtil;
|
||||||
import com.eactive.eai.rms.common.base.BaseService;
|
import com.eactive.eai.rms.common.base.BaseService;
|
||||||
import com.eactive.eai.rms.common.spring.LocaleMessage;
|
import com.eactive.eai.rms.common.spring.LocaleMessage;
|
||||||
|
import com.eactive.eai.rms.data.entity.onl.apim.approval.ApprovalService;
|
||||||
|
import com.eactive.eai.rms.data.entity.onl.apim.portalinquiry.PortalInquiryService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.portalorg.PortalOrgService;
|
import com.eactive.eai.rms.data.entity.onl.apim.portalorg.PortalOrgService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.portaluser.PortalUserService;
|
import com.eactive.eai.rms.data.entity.onl.apim.portaluser.PortalUserService;
|
||||||
import com.eactive.eai.rms.data.entity.onl.apim.portaluser.PortalUserUISearch;
|
import com.eactive.eai.rms.data.entity.onl.apim.portaluser.PortalUserUISearch;
|
||||||
@@ -27,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -44,6 +48,8 @@ public class PortalUserManService extends BaseService {
|
|||||||
// private final PasswordEncoder passwordEncoder;
|
// private final PasswordEncoder passwordEncoder;
|
||||||
private final PasswordEncoder kjbSafedbPasswordEncoder;
|
private final PasswordEncoder kjbSafedbPasswordEncoder;
|
||||||
private final PortalUserTermsService portalUserTermsService;
|
private final PortalUserTermsService portalUserTermsService;
|
||||||
|
private final ApprovalService approvalService;
|
||||||
|
private final PortalInquiryService portalInquiryService;
|
||||||
|
|
||||||
|
|
||||||
public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) {
|
public Page<PortalUserUI> selectList(Pageable pageable, PortalUserUISearch portalUserUISearch) {
|
||||||
@@ -191,6 +197,26 @@ public class PortalUserManService extends BaseService {
|
|||||||
return !portalUserService.existsByLoginId(loginId);
|
return !portalUserService.existsByLoginId(loginId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void hardDeleteUser(String id) {
|
||||||
|
if (SystemUtil.isProdServer()) {
|
||||||
|
throw new BizException("운영 환경에서는 완전삭제를 수행할 수 없습니다.");
|
||||||
|
}
|
||||||
|
PortalUser portalUser = portalUserService.getById(id);
|
||||||
|
if (portalUser.getUserStatus() != PortalUserEnums.UserStatus.REMOVED) {
|
||||||
|
throw new BizException("삭제(탈퇴) 상태인 사용자만 완전삭제할 수 있습니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> dependencies = new ArrayList<>();
|
||||||
|
long messageCount = portalUserService.countMessageRequestByUserId(id);
|
||||||
|
if (messageCount > 0) dependencies.add("메시지 " + messageCount + "건");
|
||||||
|
|
||||||
|
if (!dependencies.isEmpty()) {
|
||||||
|
throw new BizException("의존 데이터가 존재하여 완전삭제할 수 없습니다: " + String.join(", ", dependencies));
|
||||||
|
}
|
||||||
|
|
||||||
|
portalUserService.deleteById(id);
|
||||||
|
}
|
||||||
|
|
||||||
public void passwordReset(String id) {
|
public void passwordReset(String id) {
|
||||||
PortalUser portalUser = portalUserService.getById(id);
|
PortalUser portalUser = portalUserService.getById(id);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user