강제 반려 기능 추가
- 삭제된 승인자 있는 승인 요청 강제 반려 로직 추가 - JSP/JS: 강제 반려 버튼 추가 및 승인 상태별 표시 로직 구현
This commit is contained in:
@@ -101,6 +101,32 @@
|
||||
}
|
||||
});
|
||||
|
||||
$("#btn_app_force_reject").click(function () {
|
||||
if (!confirm("승인자 목록에 삭제된 사용자가 있어 승인 진행이 불가능한 건입니다.\n강제 반려하시겠습니까?")) {
|
||||
return;
|
||||
}
|
||||
var rejectReason = prompt("강제 반려 사유를 입력해 주세요");
|
||||
if (rejectReason != null) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: {cmd: "FORCE_REJECT", id: key, rejectReason: rejectReason},
|
||||
success: function (args) {
|
||||
alert("강제 반려되었습니다.");
|
||||
if (window.dialogArguments && window.dialogArguments.self) {
|
||||
window.dialogArguments.self.location.reload();
|
||||
} else if (window.opener) {
|
||||
window.opener.location.reload();
|
||||
}
|
||||
window.close();
|
||||
},
|
||||
error: function (e) {
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn_app_redeploy').click(function () {
|
||||
if (confirm("재배포 하시겠습니까?")) {
|
||||
$.ajax({
|
||||
@@ -178,10 +204,11 @@
|
||||
$("#createdDate").text(data.createdDate).inputmask("9999-99-99 99:99:99.999", {'autoUnmask': true});
|
||||
$("#expectEndDate").val(data.expectEndDate);
|
||||
|
||||
if (data.approvers.some(approver =>
|
||||
var isCurrentApprover = data.approvers.some(approver =>
|
||||
approver.approverStatus === 'CURRENT' &&
|
||||
approver.user.USERID === loginUser
|
||||
)) {
|
||||
approver.user && approver.user.USERID === loginUser
|
||||
);
|
||||
if (isCurrentApprover) {
|
||||
document.getElementById("btn_app_approve").style.display = "";
|
||||
document.getElementById("btn_app_reject").style.display = "";
|
||||
} else {
|
||||
@@ -189,6 +216,14 @@
|
||||
document.getElementById("btn_app_reject").style.display = "none";
|
||||
}
|
||||
|
||||
// 삭제된 승인자(USERID 없음)로 진행 불가한 건: 요청됨/진행중 상태면 승인자가 아니어도 강제 반려 허용
|
||||
var hasDeletedApprover = data.approvers.some(approver =>
|
||||
!approver.user || !approver.user.USERID
|
||||
);
|
||||
var isProgressStatus = data.approvalStatus.code === 'REQUESTED' || data.approvalStatus.code === 'PROCESSING';
|
||||
document.getElementById("btn_app_force_reject").style.display =
|
||||
(hasDeletedApprover && isProgressStatus && !isCurrentApprover) ? "" : "none";
|
||||
|
||||
if (data.approvalStatus.code === 'FAILED') {
|
||||
document.getElementById("btn_app_redeploy").style.display = "";
|
||||
}
|
||||
@@ -345,6 +380,9 @@
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_app_reject" level="W"><i
|
||||
class="material-icons">close</i>반려
|
||||
</button>
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_app_force_reject" level="W"><i
|
||||
class="material-icons">block</i>강제 반려
|
||||
</button>
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_app_redeploy" level="W"><i
|
||||
class="material-icons">close</i>재처리
|
||||
</button>
|
||||
|
||||
@@ -150,6 +150,32 @@
|
||||
}
|
||||
});
|
||||
|
||||
$("#btn_user_force_reject").click(function() {
|
||||
if (!confirm("승인자 목록에 삭제된 사용자가 있어 승인 진행이 불가능한 건입니다.\n강제 반려하시겠습니까?")) {
|
||||
return;
|
||||
}
|
||||
var rejectReason = prompt("강제 반려 사유를 입력해 주세요");
|
||||
if (rejectReason != null) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: {cmd: "FORCE_REJECT", id: key, rejectReason: rejectReason},
|
||||
success: function(args) {
|
||||
alert("강제 반려되었습니다.");
|
||||
if (window.dialogArguments && window.dialogArguments.self) {
|
||||
window.dialogArguments.self.location.reload();
|
||||
} else if (window.opener) {
|
||||
window.opener.location.reload();
|
||||
}
|
||||
window.close();
|
||||
},
|
||||
error: function(e) {
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('#btn_user_redeploy').click(function() {
|
||||
if (confirm("재배포 하시겠습니까?")) {
|
||||
$.ajax({
|
||||
@@ -222,10 +248,11 @@
|
||||
$("#mobileNumber").text(portalUser.mobileNumber);
|
||||
$("#userStatusDescription").text(portalUser.userStatusDescription);
|
||||
$("#roleCodeDescription").text(portalUser.roleCodeDescription);
|
||||
if (data.approvers.some(approver =>
|
||||
var isCurrentApprover = data.approvers.some(approver =>
|
||||
approver.approverStatus === 'CURRENT' &&
|
||||
approver.user.USERID === loginUser
|
||||
)) {
|
||||
approver.user && approver.user.USERID === loginUser
|
||||
);
|
||||
if (isCurrentApprover) {
|
||||
document.getElementById("btn_user_approve").style.display = "";
|
||||
document.getElementById("btn_user_reject").style.display = "";
|
||||
} else {
|
||||
@@ -233,6 +260,14 @@
|
||||
document.getElementById("btn_user_reject").style.display = "none";
|
||||
}
|
||||
|
||||
// 삭제된 승인자(USERID 없음)로 진행 불가한 건: 요청됨/진행중 상태면 승인자가 아니어도 강제 반려 허용
|
||||
var hasDeletedApprover = data.approvers.some(approver =>
|
||||
!approver.user || !approver.user.USERID
|
||||
);
|
||||
var isProgressStatus = data.approvalStatus.code === 'REQUESTED' || data.approvalStatus.code === 'PROCESSING';
|
||||
document.getElementById("btn_user_force_reject").style.display =
|
||||
(hasDeletedApprover && isProgressStatus && !isCurrentApprover) ? "" : "none";
|
||||
|
||||
if (data.approvalStatus.description === '배포실패'){
|
||||
document.getElementById("btn_user_redeploy").style.display = "";
|
||||
}
|
||||
@@ -486,6 +521,7 @@
|
||||
<div class="popup_button">
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_user_approve" level="W"><i class="material-icons">check</i>승인</button>
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_user_reject" level="W"><i class="material-icons">close</i>반려</button>
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_user_force_reject" level="W"><i class="material-icons">block</i>강제 반려</button>
|
||||
<button type="button" class="cssbtn" style="display: none;" id="btn_user_redeploy" level="W"><i class="material-icons">close</i>재처리</button>
|
||||
<button type="button" class="cssbtn" id="btn_close" level="R"><i class="material-icons">cancel</i> <%= localeMessage.getString("button.close") %>
|
||||
</button>
|
||||
|
||||
@@ -41,7 +41,7 @@ public class DjbProperty {
|
||||
description = "API 접근 허용 IP 목록 (콤마(,)로 구분된 IP들, 예: 192.168.0.1, 192.168.1.*,127.*.*.*",
|
||||
defaultValue = "10.15.106.*, 10.14.8.*, 10.15.8.*, 192.168.240.*, 127.0.0.1, 192.168.132.*, 192.168.131.*"
|
||||
)
|
||||
private String apiAllowIpList = "10.15.106.*, 10.14.8.*, 10.15.8.*, 192.168.240.*, 127.0.0.1, 192.168.132.*, 192.168.131.*";
|
||||
private String dapiAllowIpList = "10.15.106.*, 10.14.8.*, 10.15.8.*, 192.168.240.*, 127.0.0.1, 192.168.132.*, 192.168.131.*";
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -77,6 +77,15 @@ public class PortalApprovalManController extends BaseAnnotationController {
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
@PostMapping(value = "/onl/apim/approval/portalApprovalMan.json", params = "cmd=FORCE_REJECT")
|
||||
public ResponseEntity<Void> forceReject(String id, String rejectReason) {
|
||||
if (StringUtils.isBlank(rejectReason)) {
|
||||
throw new BizException("강제 반려 사유를 입력해 주세요.");
|
||||
}
|
||||
portalApprovalManService.forceReject(id, SessionManager.getLoginVo().getUserId(), rejectReason);
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
@PostMapping(value = "/onl/apim/approval/portalApprovalMan.json", params = "cmd=REDEPLOY")
|
||||
public ResponseEntity<Void> redeploy(String id) {
|
||||
portalApprovalManService.redeploy(id);
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.eactive.apim.portal.apprequest.entity.AppRequest;
|
||||
import com.eactive.apim.portal.apprequest.repository.AppRequestRepository;
|
||||
import com.eactive.apim.portal.approval.entity.Approval;
|
||||
import com.eactive.apim.portal.approval.entity.ApprovalType;
|
||||
import com.eactive.apim.portal.approval.entity.ApproverStatus;
|
||||
import com.eactive.apim.portal.approval.statemachine.*;
|
||||
import com.eactive.apim.portal.portalproperty.service.PortalPropertyService;
|
||||
import com.eactive.apim.portal.portaluser.entity.PortalUser;
|
||||
@@ -41,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
|
||||
@Service
|
||||
@@ -342,6 +344,51 @@ public class PortalApprovalManService extends BaseService {
|
||||
sendEvent(id, ApprovalEvent.DENY, options);
|
||||
}
|
||||
|
||||
/**
|
||||
* 강제 반려: 승인자 목록에 삭제된 사용자가 있어 승인 진행이 불가능한 건을
|
||||
* 승인자가 아닌 관리자도 반려 처리할 수 있다. (요청됨/진행중 상태에서만 허용)
|
||||
*/
|
||||
public void forceReject(String id, String adminUserId, String rejectReason) {
|
||||
Approval approval = approvalService.findById(id)
|
||||
.orElseThrow(() -> new IllegalArgumentException("승인 정보를 찾을 수 없습니다. ID: " + id));
|
||||
|
||||
ApprovalState currentStatus = approval.getApprovalStatus();
|
||||
if (!(currentStatus instanceof RequestedState) && !(currentStatus instanceof ProcessingState)) {
|
||||
throw new BizException("요청됨/진행중 상태의 승인 요청만 강제 반려할 수 있습니다.");
|
||||
}
|
||||
boolean hasDeletedApprover = approval.getApprovers().stream()
|
||||
.anyMatch(approver -> approver.getUser() == null);
|
||||
if (!hasDeletedApprover) {
|
||||
throw new BizException("승인자 목록에 삭제된 사용자가 있는 경우에만 강제 반려할 수 있습니다.");
|
||||
}
|
||||
|
||||
approval.getApprovers().forEach(approver -> {
|
||||
if (approver.getUser() == null
|
||||
&& (ApproverStatus.CURRENT.equals(approver.getApproverStatus())
|
||||
|| ApproverStatus.PENDING.equals(approver.getApproverStatus()))) {
|
||||
approver.setApproverStatus(ApproverStatus.DENIED);
|
||||
approver.setApprovedDate(LocalDateTime.now());
|
||||
approver.setApprovalMessage("[관리자 강제 반려: " + adminUserId + "] " + rejectReason);
|
||||
}
|
||||
});
|
||||
approval.setApprovalStatus(new DeniedState());
|
||||
|
||||
Map<String, Object> options = new HashMap<>();
|
||||
options.put(ApprovalConstants.APPROVER, adminUserId);
|
||||
options.put((String) ApprovalConstants.MESSAGE, rejectReason);
|
||||
options.put("authorizer", portalApprovalAuthorizer);
|
||||
if (approval.getApprovalType().equals(ApprovalType.APP)) {
|
||||
options.put("listener", portalAppApprovalListener);
|
||||
} else if (approval.getApprovalType().equals(ApprovalType.USER)) {
|
||||
options.put("listener", portalUserApprovalListener);
|
||||
}
|
||||
// DENY 이벤트는 authorizer 검증에 걸리므로 상태를 직접 DENIED 로 만든 뒤 END 로 롤백만 수행
|
||||
approvalStateMachine.transition(approval, ApprovalEvent.END, options);
|
||||
|
||||
approvalService.save(approval);
|
||||
logger.info("Approval {} force-rejected by admin {} (deleted approver present)", id, adminUserId);
|
||||
}
|
||||
|
||||
public void update(String id, String expectEndDate) {
|
||||
Approval approval = approvalService.findById(id)
|
||||
.orElseThrow(() -> new IllegalArgumentException("승인 정보를 찾을 수 없습니다. ID: " + id));
|
||||
|
||||
Reference in New Issue
Block a user