IIM 연동이력 조회 화면

This commit is contained in:
eastargh
2026-08-21 15:05:18 +09:00
parent 97d6489bf7
commit 79653a2887
8 changed files with 530 additions and 0 deletions
@@ -0,0 +1,153 @@
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ page import="java.io.*" %>
<%@ 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" %>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
%>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<jsp:include page="/jsp/common/include/css.jsp"/>
<jsp:include page="/jsp/common/include/script.jsp"/>
<script language="javascript">
var url = '<c:url value="/onl/admin/rule/layoutSyncHistoryMan.json" />';
var url_view = '<c:url value="/onl/admin/rule/layoutSyncHistoryMan.view" />';
function formatPrcssRslt(cellvalue, options, rowObject) {
if (cellvalue === 'S') return '<span style="color:#1a73e8;font-weight:bold;">성공</span>';
if (cellvalue === 'F') return '<span style="color:#d93025;font-weight:bold;">실패</span>';
return cellvalue || '';
}
function init() {
$("#startDatepicker").datepicker().inputmask("yyyy-mm-dd", {'autoUnmask': true});
$("#endDatepicker").datepicker().inputmask("yyyy-mm-dd", {'autoUnmask': true});
var today = getToday();
$("input[name=searchStartYYYYMMDD]").val(today.substring(0, 6) + "01");
$("input[name=searchEndYYYYMMDD]").val(today);
$("input[name=searchStartDate]").val(today.substring(0, 6) + "01");
$("input[name=searchEndDate]").val(today);
// 뒤로가기 등으로 이전 검색조건 파라미터가 있으면 기본값을 덮어씀
putSelectFromParam();
buildGrid();
}
function buildGrid() {
$('#grid').jqGrid({
datatype: "json",
mtype: 'POST',
url: url,
postData: getSearchForJqgrid("cmd", "LIST"),
colNames: ['No', 'Service Name', 'Command', '레이아웃명', '연동시간', '결과'],
colModel: [
{name: 'seqno', align: 'center', width: 80, sortable: false},
{name: 'serviceName', align: 'center', width: 120, sortable: false},
{name: 'command', align: 'center', width: 90, sortable: false},
{name: 'loutName', align: 'left', width: 300, sortable: false},
{name: 'recvAmndHms', align: 'center', width: 140, sortable: false},
{name: 'prcssRslt', align: 'center', width: 70, sortable: false, formatter: formatPrcssRslt}
],
jsonReader: {repeatitems: false},
pager: $('#pager'),
page: '${param.page}',
rowNum: '${rmsDefaultRowNum}',
autoheight: true,
height: $("#container").height(),
autowidth: true,
viewrecords: true,
rowList: eval('[${rmsDefaultRowList}]'),
ondblClickRow: function (rowId) {
var rowData = $(this).getRowData(rowId);
var seqno = rowData['seqno'];
var url2 = url_view + '?cmd=DETAIL';
url2 += '&page=' + $(this).getGridParam("page");
url2 += '&returnUrl=' + getReturnUrl();
url2 += '&menuId=' + '${param.menuId}';
url2 += '&seqno=' + seqno;
url2 += '&' + getSearchUrl();
goNav(url2);
},
loadError: function (jqXHR, textStatus, errorThrown) {
var location = '<%=request.getContextPath()%>/';
comloadError(jqXHR, textStatus, errorThrown, location);
}
});
resizeJqGridWidth('grid', 'content_middle', '1000');
}
$(document).ready(function () {
init();
$("#btn_search").click(function () {
var start = $("input[name=searchStartYYYYMMDD]").val().replace(/-/gi, "");
var end = $("input[name=searchEndYYYYMMDD]").val().replace(/-/gi, "");
if (start && end && start > end) {
alert("조회기간 종료일은 시작일보다 커야합니다.");
$("input[name=searchEndYYYYMMDD]").focus();
return false;
}
$("input[name=searchStartDate]").val(start);
$("input[name=searchEndDate]").val(end);
var postData = getSearchForJqgrid("cmd", "LIST");
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
});
$("input[name^=search]").keydown(function (key) {
if (key.keyCode == 13) {
$("#btn_search").click();
}
});
buttonControl();
});
</script>
</head>
<body>
<div class="right_box">
<div class="content_top">
<ul class="path"><li><a href="#">${rmsMenuPath}</a></li></ul>
</div><!-- end content_top -->
<div class="content_middle" id="content_middle">
<div class="search_wrap">
<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">레이아웃 연동 이력<span class="tooltip">통합인터페이스와 연동된 전문 레이아웃 이력을 조회합니다.</span></div>
<form id="ajaxForm" onsubmit="return false;">
<table class="search_condition" cellspacing=0;>
<colgroup>
<col style="width:120px;"><col style="width:260px;">
<col style="width:120px;"><col style="width:*;">
</colgroup>
<tbody>
<tr>
<th>레이아웃명</th>
<td><input type="text" name="searchLoutName" autocomplete="off" style="width:95%;"></td>
<th>연동시간</th>
<td>
<input type="text" name="searchStartYYYYMMDD" id="startDatepicker" readonly="readonly" value="" size="10" style="width:100px; border:1px solid #ebebec;">
~
<input type="text" name="searchEndYYYYMMDD" value="" id="endDatepicker" size="10" readonly="readonly" style="width:100px; border:1px solid #ebebec;">
<input type="hidden" name="searchStartDate" value="">
<input type="hidden" name="searchEndDate" value="">
</td>
</tr>
</tbody>
</table>
</form>
<table id="grid"></table>
<div id="pager"></div>
</div><!-- end content_middle -->
</div><!-- end right_box -->
</body>
</html>
@@ -0,0 +1,141 @@
<%@ page language="java" contentType="text/html; charset=utf-8" %>
<%@ page import="java.io.*" %>
<%@ 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" %>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
%>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<jsp:include page="/jsp/common/include/css.jsp"/>
<jsp:include page="/jsp/common/include/script.jsp"/>
<style>
.succ-y { color:#1a73e8; font-weight:bold; }
.succ-n { color:#d93025; font-weight:bold; }
.pre-wrap { white-space:pre-wrap; word-break:break-all; height:500px; overflow: auto; line-height:1.5; }
.recvdata-toolbar { text-align:right; margin-top: 5px; margin-bottom:6px; }
</style>
<script language="javascript">
var url = '<c:url value="/onl/admin/rule/layoutSyncHistoryMan.json" />';
var key = '${param.seqno}';
var rawRecvData = '';
var isRecvDataPretty = false;
function detail() {
if (!key) return;
$.ajax({
type: "POST", url: url, dataType: "json",
data: {cmd: 'DETAIL', seqno: key},
success: function (data) {
$('#seqno').text(data.seqno != null ? data.seqno : '');
$('#serviceName').text(data.serviceName || '');
$('#command').text(data.command || '');
$('#loutName').text(data.loutName || '');
$('#recvAmndHms').text(data.recvAmndHms || '');
$('#prcssRsltCmnt').text(data.prcssRsltCmnt || '');
rawRecvData = data.recvData || '';
isRecvDataPretty = false;
$('#recvData').text(rawRecvData);
if (data.prcssRslt === 'S') {
$('#prcssRslt').html('<span class="succ-y">성공</span>');
} else if (data.prcssRslt === 'F') {
$('#prcssRslt').html('<span class="succ-n">실패</span>');
} else {
$('#prcssRslt').text(data.prcssRslt || '');
}
},
error: function (e) { alert(e.responseText); }
});
}
// JSON 지수표기(예: 1e+21) 값이 vkbeautify 처리 중 깨지지 않도록 문자열로 감쌌다가 되돌린다.
function preserveExponential(jsonString) {
var protectedJson = jsonString.replace(/:\s*([+-]?\d+\.?\d*e[+-]?\d+)/gi, ': "$1"');
var prettyJson = vkbeautify.json(protectedJson);
prettyJson = prettyJson.replace(/:\s*"([+-]?\d+\.?\d*e[+-]?\d+)"/gi, ': $1');
return prettyJson;
}
$(document).ready(function () {
var returnUrl = getReturnUrlForReturn();
buttonControl();
detail();
$('#btn_previous').click(function () { goNav(returnUrl); });
$('#btn_pretty_recvdata').click(function () {
if (!rawRecvData) return;
if (isRecvDataPretty) {
$('#recvData').text(rawRecvData);
isRecvDataPretty = false;
return;
}
try {
$('#recvData').text(preserveExponential(rawRecvData));
isRecvDataPretty = true;
} catch (e) {
alert('JSON 형식이 아니거나 정렬할 수 없습니다.');
}
});
});
</script>
</head>
<body>
<div class="right_box">
<div class="content_top">
<ul class="path"><li><a href="#">${rmsMenuPath}</a></li></ul>
</div>
<div class="content_middle">
<div class="search_wrap">
<button type="button" class="cssbtn" id="btn_previous" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> <%= localeMessage.getString("button.previous") %></button>
</div>
<div class="title" id="title">레이아웃 연동 이력 상세</div>
<table class="table_row" cellspacing="0">
<colgroup>
<col style="width:12%"/><col style="width:38%"/>
<col style="width:12%"/><col style="width:38%"/>
</colgroup>
<tr>
<th>No</th>
<td colspan="3"><span id="seqno"></span></td>
</tr>
<tr>
<th>Service Name</th>
<td><span id="serviceName"></span></td>
<th>Command</th>
<td><span id="command"></span></td>
</tr>
<tr>
<th>레이아웃명</th>
<td><span id="loutName"></span></td>
<th>연동시간</th>
<td><span id="recvAmndHms"></span></td>
</tr>
<tr>
<th>결과</th>
<td><span id="prcssRslt"></span></td>
<th>결과메세지</th>
<td><span id="prcssRsltCmnt"></span></td>
</tr>
<tr>
<th>수신데이타</th>
<td colspan="3">
<div class="recvdata-toolbar">
<button type="button" class="cssbtn" id="btn_pretty_recvdata"><i class="material-icons">format_align_left</i> 정렬</button>
</div>
<div id="recvData" class="pre-wrap"></div>
</td>
</tr>
</table>
</div>
</div>
</body>
</html>
@@ -0,0 +1,76 @@
package com.eactive.eai.rms.data.entity.onl.layoutsync.history;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import org.hibernate.annotations.Comment;
import com.eactive.eai.data.converter.LocalDateTimeToStringConverter16;
import com.eactive.eai.data.entity.AbstractEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
@Entity
@Table(name = "tseaitr10")
@org.hibernate.annotations.Table(appliesTo = "tseaitr10", comment = "레이아웃 연동 이력")
public class LayoutSyncHistoryEntity extends AbstractEntity<Long> implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@EqualsAndHashCode.Include
@Column(nullable = false)
@Comment("일련번호")
private Long seqno;
@Column(length = 36)
@Comment("연동로그처리일련번호")
private String logprcssseqno;
@Column(length = 100)
@Comment("서비스명")
private String servicename;
@Column(length = 20)
@Comment("커맨드")
private String command;
@Column(length = 50)
@Comment("레이아웃 명")
private String loutname;
@Lob
@Comment("수신 데이터")
private String recvdata;
@Column(length = 16)
@Comment("연동 시각")
@Convert(converter = LocalDateTimeToStringConverter16.class)
private LocalDateTime recvamndhms;
@Column(length = 1)
@Comment("처리 결과")
private String prcssrslt;
@Column(length = 4000)
@Comment("처리 결과 메세지")
private String prcssrsltcmnt;
@Override
public @NonNull Long getId() {
return seqno;
}
}
@@ -0,0 +1,7 @@
package com.eactive.eai.rms.data.entity.onl.layoutsync.history;
import com.eactive.eai.data.jpa.BaseRepository;
interface LayoutSyncHistoryRepository extends BaseRepository<LayoutSyncHistoryEntity, Long> {
}
@@ -0,0 +1,77 @@
package com.eactive.eai.rms.data.entity.onl.layoutsync.history;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.eactive.eai.data.jpa.AbstractDataService;
import com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui.LayoutSyncHistoryUI;
import com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui.LayoutSyncHistoryUISearch;
import com.querydsl.jpa.impl.JPAQuery;
@Service
@Transactional
public class LayoutSyncHistoryService extends AbstractDataService<LayoutSyncHistoryEntity, Long, LayoutSyncHistoryRepository> {
private static final DateTimeFormatter FMT_YYYYMMDD = DateTimeFormatter.ofPattern("yyyyMMdd");
private static final DateTimeFormatter FMT_DATETIME = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public Page<LayoutSyncHistoryUI> selectList(Pageable pageable, LayoutSyncHistoryUISearch search) {
QLayoutSyncHistoryEntity q = QLayoutSyncHistoryEntity.layoutSyncHistoryEntity;
JPAQuery<?> query = getJPAQueryFactory().from(q);
if (StringUtils.isNotBlank(search.getSearchLoutName())) {
query.where(q.loutname.containsIgnoreCase(search.getSearchLoutName()));
}
if (StringUtils.isNotBlank(search.getSearchStartDate())) {
query.where(q.recvamndhms.goe(parseYYYYMMDD(search.getSearchStartDate()).atStartOfDay()));
}
if (StringUtils.isNotBlank(search.getSearchEndDate())) {
query.where(q.recvamndhms.loe(parseYYYYMMDD(search.getSearchEndDate()).atTime(23, 59, 59)));
}
long totalCount = query.select(q.count()).fetchOne();
if (pageable.isPaged()) {
query.limit(pageable.getPageSize()).offset(pageable.getOffset());
}
List<LayoutSyncHistoryEntity> entities = query.select(q)
.orderBy(q.recvamndhms.desc(), q.seqno.desc())
.fetch();
List<LayoutSyncHistoryUI> rows = entities.stream().map(this::convertToUI).collect(Collectors.toList());
return new PageImpl<>(rows, pageable, totalCount);
}
public LayoutSyncHistoryUI selectDetail(Long seqno) {
return convertToUI(getById(seqno));
}
private static LocalDate parseYYYYMMDD(String yyyyMMdd) {
return LocalDate.parse(yyyyMMdd, FMT_YYYYMMDD);
}
private LayoutSyncHistoryUI convertToUI(LayoutSyncHistoryEntity e) {
LayoutSyncHistoryUI ui = new LayoutSyncHistoryUI();
ui.setSeqno(e.getSeqno());
ui.setServiceName(e.getServicename());
ui.setCommand(e.getCommand());
ui.setLoutName(e.getLoutname());
ui.setRecvAmndHms(e.getRecvamndhms() == null ? "" : e.getRecvamndhms().format(FMT_DATETIME));
ui.setPrcssRslt(e.getPrcssrslt());
ui.setPrcssRsltCmnt(e.getPrcssrsltcmnt());
ui.setRecvData(e.getRecvdata());
return ui;
}
}
@@ -0,0 +1,45 @@
package com.eactive.eai.rms.onl.manage.rule.layoutsync.history;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.eactive.eai.rms.common.base.OnlBaseAnnotationController;
import com.eactive.eai.rms.common.vo.GridResponse;
import com.eactive.eai.rms.data.entity.onl.layoutsync.history.LayoutSyncHistoryService;
import com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui.LayoutSyncHistoryUI;
import com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui.LayoutSyncHistoryUISearch;
@Controller
public class LayoutSyncHistoryController extends OnlBaseAnnotationController {
@Autowired
private LayoutSyncHistoryService service;
@GetMapping(value = "/onl/admin/rule/layoutSyncHistoryMan.view")
public void view() {
// 목록 view
}
@GetMapping(value = "/onl/admin/rule/layoutSyncHistoryMan.view", params = "cmd=DETAIL")
public String detailView() {
return "/onl/admin/rule/layoutSyncHistoryManDetail";
}
@PostMapping(value = "/onl/admin/rule/layoutSyncHistoryMan.json", params = "cmd=LIST")
public ResponseEntity<GridResponse<LayoutSyncHistoryUI>> selectList(Pageable pageable,
LayoutSyncHistoryUISearch search) {
Page<LayoutSyncHistoryUI> page = service.selectList(pageable, search);
return ResponseEntity.ok(new GridResponse<>(page));
}
@PostMapping(value = "/onl/admin/rule/layoutSyncHistoryMan.json", params = "cmd=DETAIL")
public ResponseEntity<LayoutSyncHistoryUI> selectDetail(Long seqno) {
return ResponseEntity.ok(service.selectDetail(seqno));
}
}
@@ -0,0 +1,17 @@
package com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui;
import lombok.Data;
@Data
public class LayoutSyncHistoryUI {
private Long seqno;
private String serviceName;
private String command;
private String loutName;
private String recvAmndHms;
private String prcssRslt;
private String prcssRsltCmnt;
private String recvData;
}
@@ -0,0 +1,14 @@
package com.eactive.eai.rms.onl.manage.rule.layoutsync.history.ui;
import lombok.Data;
@Data
public class LayoutSyncHistoryUISearch {
private String searchLoutName;
/* 연동시간 기간 검색 (yyyyMMdd, 8자리) */
private String searchStartDate;
private String searchEndDate;
}