diff --git a/Dockerfile.dev b/Dockerfile.dev
index 4a02db3..03e8b29 100644
--- a/Dockerfile.dev
+++ b/Dockerfile.dev
@@ -1,4 +1,4 @@
-FROM dockerhub.wace.me/tomcat:7.0.94-jre8-alpine.arm64 AS Development
+FROM dockerhub.wace.me/tomcat:7.0.94-jre7-alpine.arm64 AS Development
# Remove default webapps
RUN rm -rf /usr/local/tomcat/webapps/*
diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/productionplanning.xml b/WebContent/WEB-INF/classes/com/pms/mapper/productionplanning.xml
index ade66d9..5555df3 100644
--- a/WebContent/WEB-INF/classes/com/pms/mapper/productionplanning.xml
+++ b/WebContent/WEB-INF/classes/com/pms/mapper/productionplanning.xml
@@ -2945,8 +2945,23 @@
''
) AS EBOM_REGDATE,
COALESCE(PM.MBOM_STATUS, '') AS MBOM_STATUS,
+ COALESCE(
+ (SELECT PBR.PART_NO
+ FROM PART_BOM_REPORT PBR
+ WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
+ AND PM.MBOM_STATUS = 'Y'
+ LIMIT 1),
+ ''
+ ) AS MBOM_PART_NO,
'1.0' AS MBOM_VERSION,
- TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS MBOM_REGDATE
+ COALESCE(
+ (SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
+ FROM PART_BOM_REPORT PBR
+ WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
+ AND PM.MBOM_STATUS = 'Y'
+ LIMIT 1),
+ TO_CHAR(PM.REGDATE, 'YYYY-MM-DD')
+ ) AS MBOM_REGDATE
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
@@ -3009,6 +3024,14 @@
PM.BOM_REPORT_OBJID,
PM.PART_NO,
PM.PART_NAME,
+ COALESCE(
+ (SELECT PBR.PART_NO
+ FROM PART_BOM_REPORT PBR
+ WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
+ AND PM.MBOM_STATUS = 'Y'
+ LIMIT 1),
+ ''
+ ) AS MBOM_PART_NO,
CM.CATEGORY_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.CATEGORY_CD LIMIT 1),
@@ -3032,7 +3055,14 @@
CM.PAID_TYPE,
CM.REQ_DEL_DATE,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
- TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS MBOM_REGDATE
+ COALESCE(
+ (SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
+ FROM PART_BOM_REPORT PBR
+ WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
+ AND PM.MBOM_STATUS = 'Y'
+ LIMIT 1),
+ TO_CHAR(PM.REGDATE, 'YYYY-MM-DD')
+ ) AS MBOM_REGDATE
FROM
PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
@@ -3092,71 +3122,209 @@
+
+
+
+
+
+
+
+
+
@@ -3229,6 +3397,7 @@
/* productionplanning.saveMbomFromEbom - E-BOM을 M-BOM으로 복사 */
/* 1. 새로운 PART_BOM_REPORT 생성 (M-BOM용) */
+ /* M-BOM 품번을 PART_NO에 저장 (규칙: M-{품번}-YYMMDD-01) */
WITH new_bom_report AS (
INSERT INTO PART_BOM_REPORT (
OBJID,
@@ -3239,7 +3408,7 @@
STATUS
) VALUES (
(SELECT (FLOOR(RANDOM() * 1000000000) + 1000000000)::INTEGER),
- #{PART_NO},
+ #{MBOM_PART_NO},
#{PART_NAME},
#{USER_ID},
NOW(),
diff --git a/WebContent/WEB-INF/view/partMng/structureBomCopyFormPopup.jsp b/WebContent/WEB-INF/view/partMng/structureBomCopyFormPopup.jsp
index 7438365..9958000 100644
--- a/WebContent/WEB-INF/view/partMng/structureBomCopyFormPopup.jsp
+++ b/WebContent/WEB-INF/view/partMng/structureBomCopyFormPopup.jsp
@@ -134,12 +134,29 @@ var selectedBomType = null; // 'EBOM' 또는 'MBOM'
var bomGridData = []; // BOM 그리드 데이터
$(function(){
- // 페이지 로드 시 프로젝트 정보가 있으면 품번/품명 자동 입력
+ // 페이지 로드 시 URL 파라미터 또는 프로젝트 정보에서 품번/품명 자동 입력
+ var urlPartNo = "${param.partNo}";
+ var urlPartName = "${param.partName}";
+ var productCode = "${projectInfo.PRODUCT}";
+
+ if(urlPartNo && urlPartNo !== "") {
+ console.log("URL 파라미터에서 품번/품명 설정 중...");
+ $("#COPY_PART_NO").val(decodeURIComponent(urlPartNo));
+ $("#COPY_PART_NAME").val(decodeURIComponent(urlPartName));
+ }
+ else {
console.log("projectInfo가 있습니다. 품번/품명 설정 중...");
$("#COPY_PART_NO").val("${projectInfo.PART_NO}");
$("#COPY_PART_NAME").val("${projectInfo.PART_NAME}");
- // E-BOM 품번은 사용자가 직접 입력하도록 비워둠 (M-BOM 품번과 다를 수 있음)
+ }
+
+ // Machine이 아닌 경우, 동일 품번의 기존 M-BOM 확인 및 자동 로드
+ var isMachine = productCode && (productCode === '0001807' || productCode.toUpperCase().indexOf('MACHINE') >= 0);
+ if(!isMachine && "${projectInfo.PART_NO}" !== "") {
+ console.log("Machine이 아닌 제품입니다. 기존 M-BOM 확인 중...");
+ fn_checkExistingMbom("${projectInfo.PART_NO}");
+ }
// 담기 버튼 - 선택한 BOM을 복사 대상으로 설정
@@ -175,9 +192,9 @@ $(function(){
var ebomPartNo = $("#EBOM_PART_NO").val().trim();
if(!ebomPartNo) {
Swal.fire('E-BOM 품번을 입력해주세요.');
- return;
- }
-
+ return;
+ }
+
// E-BOM 조회 후 미리보기 로드
fn_loadBomPreview(ebomPartNo, 'EBOM');
});
@@ -187,9 +204,9 @@ $(function(){
var mbomPartNo = $("#MBOM_PART_NO").val().trim();
if(!mbomPartNo) {
Swal.fire('M-BOM 품번을 입력해주세요.');
- return;
- }
-
+ return;
+ }
+
// M-BOM 조회 후 미리보기 로드
fn_loadBomPreview(mbomPartNo, 'MBOM');
});
@@ -213,6 +230,45 @@ $(function(){
fn_initGrid([], 3);
});
+// 기존 M-BOM 확인 (Machine 이외 제품용)
+function fn_checkExistingMbom(partNo) {
+ $.ajax({
+ url: "/productionplanning/getLatestMbomByPartNo.do",
+ type: "POST",
+ data: { partNo: partNo },
+ dataType: "json",
+ success: function(response) {
+ console.log("getLatestMbomByPartNo 응답:", response);
+
+ if(response && response.MBOM_PART_NO) {
+ // 기존 M-BOM이 있는 경우 사용자에게 알림
+ Swal.fire({
+ title: '기존 M-BOM 발견',
+ html: '동일 품번(' + partNo + ')의 M-BOM이 이미 존재합니다.
' +
+ 'M-BOM 품번: ' + response.MBOM_PART_NO + '
' +
+ '저장일: ' + response.SAVE_DATE + '
' +
+ '기존 M-BOM을 자동으로 불러오시겠습니까?',
+ icon: 'question',
+ showCancelButton: true,
+ confirmButtonText: '자동 불러오기',
+ cancelButtonText: '새로 생성'
+ }).then((result) => {
+ if(result.isConfirmed) {
+ // M-BOM 자동 로드
+ $("#MBOM_PART_NO").val(response.MBOM_PART_NO);
+ fn_loadBomPreview(response.MBOM_PART_NO, 'MBOM');
+ }
+ });
+ } else {
+ console.log("기존 M-BOM이 없습니다.");
+ }
+ },
+ error: function(xhr, status, error) {
+ console.error("getLatestMbomByPartNo 에러:", xhr, status, error);
+ }
+ });
+}
+
// BOM 미리보기 로드
function fn_loadBomPreview(partNo, bomType) {
console.log("fn_loadBomPreview 호출:", partNo, bomType);
@@ -248,8 +304,8 @@ function fn_loadBomPreview(partNo, bomType) {
// BOM 트리 데이터 로드
function fn_loadBomTree(bomObjId) {
console.log("fn_loadBomTree 호출:", bomObjId);
-
- $.ajax({
+
+ $.ajax({
url: "/partMng/getStructureTreeJson.do",
type: "POST",
data: {
@@ -505,6 +561,15 @@ function fn_saveBomCopy() {
}
});
+ // 제품구분 가져오기
+ var productCode = "${projectInfo.PRODUCT}";
+
+ // 기존 M-BOM 품번 가져오기 (M-BOM 선택 시 사용)
+ var existingMbomPartNo = "";
+ if(selectedBomType === 'MBOM') {
+ existingMbomPartNo = $("#MBOM_PART_NO").val().trim();
+ }
+
$.ajax({
url: "/partMng/saveBomCopy.do",
type: "POST",
@@ -514,6 +579,8 @@ function fn_saveBomCopy() {
sourceBomType: selectedBomType,
targetPartNo: copyPartNo,
targetPartName: copyPartName,
+ productCode: productCode, // 제품구분 추가
+ existingMbomPartNo: existingMbomPartNo, // 기존 M-BOM 품번 추가
bomData: bomGridData
}),
contentType: "application/json",
@@ -526,9 +593,19 @@ function fn_saveBomCopy() {
text: 'M-BOM이 성공적으로 생성되었습니다.',
icon: 'success'
}).then(() => {
- // 부모 창(M-BOM 관리) 새로고침하여 아이콘 업데이트
+ // 부모 창(M-BOM 관리)의 검색 함수만 호출하여 그리드 업데이트
if(window.opener && !window.opener.closed) {
- window.opener.location.reload();
+ // 부모 창의 검색 조건 유지하면서 그리드만 새로고침
+ if(typeof window.opener.fn_search === 'function') {
+ window.opener.fn_search();
+ }
+ // M-BOM 품번과 저장일을 부모 창 검색 조건에 설정
+ // if(response.mbomPartNo) {
+ // window.opener.$("#search_mbom_part_no").val(response.mbomPartNo);
+ // }
+ // if(response.saveDate) {
+ // window.opener.$("#search_save_date").val(response.saveDate);
+ // }
}
window.close();
});
@@ -568,13 +645,37 @@ function fn_excel() {
-
diff --git a/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp b/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp
index f9a1c99..4c5934f 100644
--- a/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp
+++ b/WebContent/WEB-INF/view/partMng/structurePopupCenter.jsp
@@ -422,14 +422,16 @@ function fn_changeRelatePartInfo(objId,rightObjId,leftObjId,leftPartNoQty,leftPa
}
-
+
-
diff --git a/WebContent/WEB-INF/view/productionplanning/mBomPopupFs.jsp b/WebContent/WEB-INF/view/productionplanning/mBomPopupFs.jsp
index b1d7136..b15b1f6 100644
--- a/WebContent/WEB-INF/view/productionplanning/mBomPopupFs.jsp
+++ b/WebContent/WEB-INF/view/productionplanning/mBomPopupFs.jsp
@@ -1,5 +1,5 @@
<%String objId = com.pms.common.utils.CommonUtils.checkNull(request.getParameter("objId"));%>
-