Files
wace_plm/WebContent/WEB-INF/view/productionplanning/mBomHistoryDetailPopup.jsp

295 lines
7.8 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%> - M-BOM 변경 이력 상세</title>
<style>
body, html {
margin: 0;
padding: 0;
font-family: Arial, sans-serif;
}
.history-container {
padding: 20px;
}
h2 {
text-align: center;
color: #333;
margin-bottom: 20px;
}
.history-header {
background-color: #333;
color: white;
padding: 10px 15px;
margin-bottom: 20px;
border-radius: 4px;
}
.history-header span {
margin-right: 20px;
}
table {
width: 100%;
border-collapse: collapse;
margin-bottom: 20px;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #4CAF50;
color: white;
font-weight: bold;
}
.section-title {
background-color: #5bc0de;
color: white;
font-weight: bold;
text-align: center;
}
.change-add {
background-color: #e7f4e7;
}
.change-delete {
background-color: #ffe7e7;
}
.change-modify {
background-color: #fff4e6;
}
.before-value {
color: #999;
text-decoration: line-through;
}
.after-value {
color: #d9534f;
font-weight: bold;
}
.btn-close {
display: block;
width: 100px;
margin: 20px auto;
padding: 10px 20px;
background-color: #6c757d;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.btn-close:hover {
background-color: #5a6268;
}
</style>
</head>
<body>
<div class="history-container">
<h2>M-BOM 변경 이력 상세</h2>
<div class="history-header">
<span><strong>변경유형:</strong> ${historyInfo.CHANGE_TYPE}</span>
<span><strong>변경일:</strong> ${historyInfo.CHANGE_DATE}</span>
<span><strong>작성자:</strong> ${historyInfo.CHANGE_USER_NAME}</span>
<span><strong>프로젝트:</strong> ${historyInfo.PROJECT_NO}</span>
</div>
<div id="historyContent">
<!-- JavaScript로 동적 생성 -->
</div>
<button class="btn-close" onclick="window.close();">닫기</button>
</div>
<script>
// 가공업체 목록 (OBJID -> 업체명 변환용)
var vendorMap = {};
// 가공업체 목록 로드
function loadVendorList() {
$.ajax({
url: '/common/getClientMngList.do',
method: 'POST',
async: false,
dataType: 'json',
success: function(data) {
if(data && data.length > 0) {
data.forEach(function(item) {
vendorMap[item.CODE_ID] = item.NAME;
});
}
}
});
}
// OBJID를 업체명으로 변환
function getVendorName(objid) {
if(!objid) return '';
return vendorMap[objid] || objid;
}
// 필드명 한글 변환
function getFieldNameKorean(field) {
var fieldMap = {
"QTY": "수량",
"SUPPLY_TYPE": "자급/사급",
"RAW_MATERIAL": "소재",
"RAW_MATERIAL_SIZE": "사이즈",
"RAW_MATERIAL_PART_NO": "소재품번",
"PROCESSING_VENDOR": "가공업체",
"PROCESSING_DEADLINE": "가공납기",
"GRINDING_DEADLINE": "연삭납기",
"REQUIRED_QTY": "소재소요량",
"ORDER_QTY": "소재발주수량",
"PRODUCTION_QTY": "제작수량",
"REMARK": "비고"
};
return fieldMap[field] || field;
}
$(function(){
// 가공업체 목록 로드
loadVendorList();
// 이력 데이터 파싱 및 표시
var changeType = '${historyInfo.CHANGE_TYPE}';
var beforeDataStr = '${historyInfo.BEFORE_DATA_ESCAPED}';
var afterDataStr = '${historyInfo.AFTER_DATA_ESCAPED}';
try {
var beforeData = beforeDataStr ? JSON.parse(beforeDataStr) : null;
var afterData = afterDataStr ? JSON.parse(afterDataStr) : null;
var html = "";
if(changeType === "CREATE") {
// 생성 이력
html = generateCreateHistoryTable(afterData);
} else if(changeType === "UPDATE") {
// 수정 이력
html = generateUpdateHistoryTable(beforeData, afterData);
}
$("#historyContent").html(html);
} catch(e) {
console.error("JSON 파싱 오류:", e);
$("#historyContent").html("<p style='color: red;'>데이터 파싱 오류가 발생했습니다.</p>");
}
});
// 생성 이력 테이블 생성
function generateCreateHistoryTable(afterData) {
var html = "<table>";
html += "<tr class='section-title'><td colspan='4'>생성된 M-BOM 정보</td></tr>";
html += "<tr><th>항목</th><th>값</th><th>항목</th><th>값</th></tr>";
// 헤더 정보
html += "<tr>";
html += "<td>M-BOM 품번</td><td>" + (afterData.mbomNo || afterData.MBOM_NO || "") + "</td>";
html += "<td>품번</td><td>" + (afterData.partNo || afterData.PART_NO || "") + "</td>";
html += "</tr>";
html += "<tr>";
html += "<td>품명</td><td>" + (afterData.partName || afterData.PART_NAME || "") + "</td>";
html += "<td>기준 BOM 유형</td><td>" + (afterData.sourceBomType || afterData.SOURCE_BOM_TYPE || "") + "</td>";
html += "</tr>";
// BOM 상세 항목
var mbomData = afterData.mbomData || [];
if(mbomData.length > 0) {
html += "<tr class='section-title'><td colspan='4'>생성된 BOM 항목 (" + mbomData.length + "개)</td></tr>";
html += "<tr class='change-add'><th>품번</th><th>품명</th><th>수량</th><th>레벨</th></tr>";
for(var i = 0; i < mbomData.length; i++) {
var item = mbomData[i];
html += "<tr class='change-add'>";
html += "<td>" + (item.partNo || "") + "</td>";
html += "<td>" + (item.partName || "") + "</td>";
html += "<td>" + (item.qty || "") + "</td>";
html += "<td>" + (item.level || "") + "</td>";
html += "</tr>";
}
}
html += "</table>";
return html;
}
// 수정 이력 테이블 생성
function generateUpdateHistoryTable(beforeData, afterData) {
var html = "";
// beforeData는 변경된 항목 배열
var changedItems = beforeData;
if(!Array.isArray(changedItems) || changedItems.length === 0) {
return "<p>변경 사항이 없습니다.</p>";
}
html += "<table>";
html += "<tr class='section-title'><td colspan='4'>변경된 항목 (" + changedItems.length + "개)</td></tr>";
html += "<tr><th>변경유형</th><th>품번</th><th>품명</th><th>변경 내용</th></tr>";
for(var i = 0; i < changedItems.length; i++) {
var item = changedItems[i];
var changeType = item.changeType;
if(changeType === "ADD") {
// 추가된 항목
var afterDataItem = item.afterData || {};
html += "<tr class='change-add'>";
html += "<td>추가</td>";
html += "<td>" + (afterDataItem.partNo || "") + "</td>";
html += "<td>" + (afterDataItem.partName || "") + "</td>";
html += "<td>새 항목 추가</td>";
html += "</tr>";
} else if(changeType === "DELETE") {
// 삭제된 항목
var beforeDataItem = item.beforeData || {};
html += "<tr class='change-delete'>";
html += "<td>삭제</td>";
html += "<td>" + (beforeDataItem.PART_NO || "") + "</td>";
html += "<td>" + (beforeDataItem.PART_NAME || "") + "</td>";
html += "<td>항목 삭제</td>";
html += "</tr>";
} else if(changeType === "MODIFY") {
// 수정된 항목
html += "<tr class='change-modify'>";
html += "<td>수정</td>";
html += "<td>" + (item.partNo || "") + "</td>";
html += "<td>" + (item.partName || "") + "</td>";
html += "<td>";
var fieldChanges = item.fieldChanges || [];
for(var j = 0; j < fieldChanges.length; j++) {
var fc = fieldChanges[j];
var fieldNameKr = getFieldNameKorean(fc.field);
// 가공업체 필드는 OBJID를 업체명으로 변환
var beforeVal = fc.before;
var afterVal = fc.after;
if(fc.field === 'PROCESSING_VENDOR' || fc.field === 'processingVendor') {
beforeVal = beforeVal ? getVendorName(beforeVal) : null;
afterVal = afterVal ? getVendorName(afterVal) : null;
}
html += "<strong>" + fieldNameKr + ":</strong> ";
html += "<span class='before-value'>" + (beforeVal || "(없음)") + "</span> → ";
html += "<span class='after-value'>" + (afterVal || "(없음)") + "</span>";
if(j < fieldChanges.length - 1) html += "<br>";
}
html += "</td>";
html += "</tr>";
}
}
html += "</table>";
return html;
}
</script>
</body>
</html>