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 + "\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; +} +