diff --git a/WebContent/jsp/onl/transaction/tracking/trackingManDetail.jsp b/WebContent/jsp/onl/transaction/tracking/trackingManDetail.jsp
index 66bece0..fd30ab9 100644
--- a/WebContent/jsp/onl/transaction/tracking/trackingManDetail.jsp
+++ b/WebContent/jsp/onl/transaction/tracking/trackingManDetail.jsp
@@ -38,6 +38,7 @@
let fullMessageData;
let layoutInfo = [];
let bzwkdatatntInfo;
+ var isPrettyView = false;
var eaiSvcCode = "";
@@ -388,10 +389,6 @@
$('#btn_pretty_body').click(function(){
const syntax = $('#selectBodySyntax').val();
-
- // FLAT view를 위해 생성된 데이터 -> 기존 업무데이터
- bodyCodeEditor.setValue(bzwkdatatntInfo);
-
const value = bodyCodeEditor.getValue();
let prettyValue = value;
if(syntax === 'JSN'){
@@ -431,7 +428,6 @@
$('#btn_pretty_body').css('display', 'block');
bodyCodeEditor.setOption("mode", "application/json");
}else if(syntax === 'XML'){
- $('#btn_pretty_body').css('display', 'block');
$('#btn_pretty_body').css('display', 'block');
bodyCodeEditor.setOption("mode", "application/xml");
}else{
@@ -842,112 +838,141 @@ $(document).ready(function() {
alert('전체 전문 복사되었습니다.')
});
- // FLAT 데이터를 전문정보로 잘라서 JSON / XML VIEW 로 볼 수 있는 버튼
- $('#btn_convert_view').click(function() {
- var type = $('select[id=selectBodySyntax]').val();
-
- if (!fullMessageData || !layoutInfo) {
- alert("데이터가 없습니다.");
+ $('#btn_pretty_print').click(function () {
+
+ var $button = $(this);
+
+ // Pretty View → 원본 복구
+ if (typeof isPrettyView !== 'undefined' && isPrettyView) {
+
+ var originalData = (typeof bzwkdatatntInfo !== 'undefined')
+ ? bzwkdatatntInfo
+ : "";
+
+ if (typeof bodyCodeEditor !== 'undefined') {
+ bodyCodeEditor.setValue(originalData);
+ }
+
+ isPrettyView = false;
+ $button.text("PRETTY_PRINT");
+
return;
}
- parserCommon(fullMessageData, layoutInfo, type);
- });
+ var intrefaceId = ($("input[name=eaiSvcName]").val() || "").trim();
+ var logProcessNo = ($("input[name=logPrcssSerno]").val() || "").trim();
+ var bizData = (typeof bzwkdatatntInfo !== 'undefined')
+ ? bzwkdatatntInfo
+ : "";
- function parserCommon(flatData, layoutInfo, type) {
- var cursor = 0;
- var parsedList = [];
+ var error = false;
- layoutInfo.forEach(function(field) {
- var fieldLen = field.length;
+ var errContent = ($("textarea[name=eaiErrCtnt]").val() || "").trim();
+ if (errContent.length > 0) {
+ error = true;
+ }
- if (fieldLen > 0) {
- var rawValue = flatData.substring(cursor, cursor + fieldLen);
+ if (!intrefaceId || !logProcessNo || !bizData) {
+ alert("필수값이 누락되어 조회가 불가능합니다.");
+ return;
+ }
- parsedList.push({
- engName: field.name,
- korName: field.desc || field.name,
- value: rawValue // trim 금지.
- });
+ $.ajax({
+ type: "POST",
+ url: url,
+ dataType: "json",
+ data: {
+ cmd: "DETAIL_PRETTY_VIEW",
+ intrefaceId: intrefaceId,
+ logProcessNo: logProcessNo,
+ bizData: bizData
+ },
- cursor += fieldLen;
+ success: function (response) {
+
+ var xmlString = response.result;
+
+ if (xmlString) {
+
+ if (typeof bodyCodeEditor !== 'undefined') {
+ bodyCodeEditor.setValue(xmlString);
+ }
+
+ $('#selectBodySyntax')
+ .val('XML')
+ .trigger('change');
+
+ isPrettyView = true;
+ $button.text("업무데이터 보기");
+
+ } else {
+ alert("변환된 데이터 내용이 없습니다.");
+ }
+ },
+
+ error: function (xhr, status, error) {
+
+ console.error("AJAX Error:", xhr);
+
+ var errorMsg = "처리 중 오류가 발생했습니다.";
+
+ if (xhr.responseJSON) {
+
+ var errResponse = xhr.responseJSON;
+
+ if (errResponse.result) {
+ errorMsg = errResponse.result;
+ }
+ else if (errResponse.message) {
+ errorMsg = errResponse.message;
+ }
+
+ }
+ // JSON 파싱 실패 대비
+ else if (xhr.responseText) {
+ errorMsg = xhr.responseText;
+ }
+
+ alert(errorMsg);
}
});
-
- // CodeMirror 에디터에 값 세팅
- var finalString = "";
-
- if (type == "JSN") {
-
- var jsonResult = {};
-
- parsedList.forEach(function(item) {
- jsonResult[item.engName] = {
- "한글명": item.korName,
- "값": item.value
- };
- });
-
- finalString = JSON.stringify(jsonResult, null, 4);
-
- } else if (type == "XML") {
-
- var xmlResult = "\n";
-
- parsedList.forEach(function(item) {
- var cleanTagName = item.korName.replace(/[^a-zA-Z0-9가-힣]/g, "");
- if (!cleanTagName) cleanTagName = item.engName;
-
- xmlResult += "\t<" + cleanTagName + ">" + item.value + "" + cleanTagName + ">\n";
- });
- xmlResult += "";
-
- finalString = xmlResult;
-
- } else {
- finalString = flatData;
- }
-
- bodyCodeEditor.setValue(finalString);
- $('#selectBodySyntax').val(type).trigger('change');
-
-// console.log("변환 완료:", parsedList);
- }
+ });
- /**
- * 문자열의 바이트 수 계산 (한글 2바이트, 영문/숫자 1바이트)
- */
- function getByteLength(str) {
- let byteCount = 0;
- for (let i = 0; i < str.length; i++) {
- const charCode = str.charCodeAt(i);
- byteCount += (charCode >= 0xAC00 && charCode <= 0xD7A3) ? 2 : 1;
- }
- return byteCount;
- }
-
- /**
- * 문자열을 주어진 바이트 수만큼 패딩
- * @param {string} str - 원본 문자열
- * @param {number} targetBytes - 목표 바이트 수
- * @param {string} position - 'left' 또는 'right' (기본: 'right')
- * @param {string} padChar - 패딩 문자 (기본: 공백)
- * @returns {string} - 패딩된 문자열
- */
- function padByteString(str, targetBytes, position = 'right', padChar = ' ') {
- const currentBytes = getByteLength(str);
-
- if (currentBytes >= targetBytes) {
- return str; // 이미 목표 바이트 이상이면 그대로 반환
- }
-
- const paddingBytes = targetBytes - currentBytes;
- const padding = padChar.repeat(paddingBytes);
-
- return position === 'left' ? padding + str : str + padding;
- }
});
+/**
+ * 문자열의 바이트 수 계산 (한글 2바이트, 영문/숫자 1바이트)
+ */
+function getByteLength(str) {
+ let byteCount = 0;
+ for (let i = 0; i < str.length; i++) {
+ const charCode = str.charCodeAt(i);
+ byteCount += (charCode >= 0xAC00 && charCode <= 0xD7A3) ? 2 : 1;
+ }
+ return byteCount;
+}
+
+/**
+ * 문자열을 주어진 바이트 수만큼 패딩
+ * @param {string} str - 원본 문자열
+ * @param {number} targetBytes - 목표 바이트 수
+ * @param {string} position - 'left' 또는 'right' (기본: 'right')
+ * @param {string} padChar - 패딩 문자 (기본: 공백)
+ * @returns {string} - 패딩된 문자열
+ */
+function padByteString(str, targetBytes, position = 'right', padChar = ' ') {
+ const currentBytes = getByteLength(str);
+
+ if (currentBytes >= targetBytes) {
+ return str; // 이미 목표 바이트 이상이면 그대로 반환
+ }
+
+ const paddingBytes = targetBytes - currentBytes;
+ const padding = padChar.repeat(paddingBytes);
+
+ return position === 'left' ? padding + str : str + padding;
+}
+