mbom 위치 이동 시 하위 파트까지 같이 옮겨지도록(저장전에도 확인 가능하게 바로 반영되도록), 파트 추가 시 수량 변경가능하도록!

This commit is contained in:
2026-03-04 15:27:12 +09:00
parent 2962bf49cf
commit a520c33e85
3 changed files with 70 additions and 10 deletions

View File

@@ -292,6 +292,7 @@ function fn_loadMbomTemplate() {
if(leftFrame && leftFrame._tabulGrid) {
leftFrame._tabulGrid.setData(templateDetails);
if(leftFrame.fn_syncLastValidData) leftFrame.fn_syncLastValidData();
console.log("템플릿 데이터 로드 완료");
} else {
console.error("왼쪽 프레임 또는 그리드를 찾을 수 없습니다.");
@@ -1031,6 +1032,7 @@ function buildSubTreeFlatList(subTree, parentObjid, baseLevel) {
REVISION: item.REVISION || item.revision || '',
SUPPLY_TYPE: '사급',
STATUS: 'ACTIVE',
_IS_ADDED: true,
_IS_SUB_PART: true
});
}
@@ -1140,7 +1142,8 @@ function fn_mbomAddPart() {
SPEC: rowData.SPEC,
REVISION: rowData.REVISION,
SUPPLY_TYPE: '사급',
STATUS: 'ACTIVE'
STATUS: 'ACTIVE',
_IS_ADDED: true
};
newParts.push(newPart);
@@ -1158,6 +1161,13 @@ function fn_mbomAddPart() {
}
}
// 수준(LEVEL_X) 필드 설정
for(var i = 0; i < newParts.length; i++) {
if(leftFrame && leftFrame.fn_setLevelFields) {
leftFrame.fn_setLevelFields(newParts[i]);
}
}
// 왼쪽 프레임의 Tabulator에 추가
if(leftFrame && leftFrame._tabulGrid) {
if(parentObjid) {
@@ -1180,6 +1190,11 @@ function fn_mbomAddPart() {
}
}
// 드래그 이동용 데이터 동기화
if(leftFrame && leftFrame.fn_syncLastValidData) {
leftFrame.fn_syncLastValidData();
}
var message = rightSelectedRows.length + '개 파트가 추가되었습니다.';
if(subPartCount > 0) {
message += '\n(반제품 하위 ' + subPartCount + '개 품목 포함)';
@@ -1253,6 +1268,7 @@ function fn_mbomDeletePart() {
// 선택한 행 + 하위 품목 일괄 삭제
allData.splice(foundIndex, deleteCount);
leftFrame._tabulGrid.setData(allData);
if(leftFrame.fn_syncLastValidData) leftFrame.fn_syncLastValidData();
var message = '파트가 삭제되었습니다.';
if(deleteCount > 1) {
@@ -1463,6 +1479,7 @@ function fn_changeTopProduct() {
// 왼쪽 트리에 새 데이터 설정
if(leftFrame && leftFrame._tabulGrid) {
leftFrame._tabulGrid.setData(newTreeData);
if(leftFrame.fn_syncLastValidData) leftFrame.fn_syncLastValidData();
}
// M-BOM 품번을 변경된 최상위 제품의 품번으로 설정

View File

@@ -78,6 +78,7 @@ body {
</style>
<script>
var _tabulGrid;
var _lastValidData = [];
var selectedRowData = null; // 선택된 행 데이터
// 프로젝트 수주수량 (최상위 프레임에서 가져오기)
var projectQuantity = 1; // 기본값
@@ -247,9 +248,19 @@ function createSelect2Editor(options) {
};
}
// 수준(LEVEL_X) 필드 생성 (파트 추가 시 사용)
var _maxLevel = ${empty MAXLEV ? 1 : MAXLEV};
function fn_setLevelFields(item) {
var level = parseInt(item.LEVEL) || 1;
for(var i = 1; i <= _maxLevel; i++) {
item['LEVEL_' + i] = (i === level) ? '*' : '';
}
return item;
}
// Tabulator 그리드 초기화
function fn_initGrid() {
var maxLevel = ${empty MAXLEV ? 1 : MAXLEV};
var maxLevel = _maxLevel;
// 컬럼 정의
var columns = [];
@@ -328,6 +339,17 @@ function fn_initGrid() {
width: 50,
title: '수량',
field: 'QTY_TEMP',
editor: 'number',
editorParams: { min: 0, step: 1, selectContents: true },
editable: function(cell) { var d = cell.getRow().getData(); return d._IS_ADDED === true && d._IS_SUB_PART !== true; },
formatter: function(cell) {
var d = cell.getRow().getData();
if(d._IS_ADDED === true && d._IS_SUB_PART !== true) {
cell.getElement().style.backgroundColor = '#FFF9C4';
cell.getElement().style.border = '1px solid #F9A825';
}
return cell.getValue();
},
visible: true
},
{
@@ -336,6 +358,17 @@ function fn_initGrid() {
width: 80,
title: '항목 수량',
field: 'ITEM_QTY',
editor: 'number',
editorParams: { min: 0, step: 1, selectContents: true },
editable: function(cell) { var d = cell.getRow().getData(); return d._IS_ADDED === true && d._IS_SUB_PART !== true; },
formatter: function(cell) {
var d = cell.getRow().getData();
if(d._IS_ADDED === true && d._IS_SUB_PART !== true) {
cell.getElement().style.backgroundColor = '#FFF9C4';
cell.getElement().style.border = '1px solid #F9A825';
}
return cell.getValue();
},
visible: true
},
/* 주석처리: Rev, 규격, 제품구분, 상태 컬럼
@@ -1036,7 +1069,7 @@ function fn_initGrid() {
});
// 초기 유효 데이터 저장
var _lastValidData = bomTreeData.slice();
_lastValidData = bomTreeData.slice();
// 드래그 이동 후 같은 부모 내 이동만 허용, 하위 품목도 함께 이동
_tabulGrid.on("rowMoved", function(row) {
@@ -1167,6 +1200,13 @@ function fn_initGrid() {
});
}
// 외부(mBomHeaderPopup)에서 파트 추가/삭제 후 호출하여 드래그 이동용 데이터 동기화
function fn_syncLastValidData() {
if(_tabulGrid) {
_lastValidData = _tabulGrid.getData().slice();
}
}
// 필터 적용 함수
function fn_applyFilter() {
var partNo = $("#filterPartNo").val().trim();
@@ -1297,7 +1337,8 @@ function getMbomTreeData() {
partName: row.PART_NAME,
// 수량 정보
qty: toNumber(row.QTY_TEMP || row.QTY || row.ITEM_QTY),
qty: toNumber(row.QTY_TEMP || row.QTY),
itemQty: toNumber(row.ITEM_QTY),
unit: row.UNIT,
// 생산 정보

View File

@@ -3870,8 +3870,8 @@
<insert id="insertMbomDetail" parameterType="map">
INSERT INTO MBOM_DETAIL (
OBJID, MBOM_HEADER_OBJID, PARENT_OBJID, CHILD_OBJID, SEQ, LEVEL,
PART_OBJID, PART_NO, PART_NAME, QTY, UNIT,
SUPPLY_TYPE, MAKE_OR_BUY,
PART_OBJID, PART_NO, PART_NAME, QTY, ITEM_QTY, UNIT,
SUPPLY_TYPE, MAKE_OR_BUY,
RAW_MATERIAL_PART_NO, RAW_MATERIAL_SPEC, RAW_MATERIAL, RAW_MATERIAL_SIZE,
PROCESSING_VENDOR, PROCESSING_DEADLINE, GRINDING_DEADLINE,
REQUIRED_QTY, ORDER_QTY, PRODUCTION_QTY, STOCK_QTY, SHORTAGE_QTY,
@@ -3883,8 +3883,8 @@
STATUS, WRITER, REGDATE, EDITER, EDIT_DATE, REMARK
) VALUES (
#{objid}, #{mbomHeaderObjid}, #{parentObjid}, #{childObjid}, #{seq}, #{level},
#{partObjid}, #{partNo}, #{partName}, #{qty}, #{unit},
#{supplyType}, #{makeOrBuy},
#{partObjid}, #{partNo}, #{partName}, #{qty}, #{itemQty}, #{unit},
#{supplyType}, #{makeOrBuy},
#{rawMaterialPartNo}, #{rawMaterialSpec}, #{rawMaterial}, #{rawMaterialSize},
#{processingVendor}, #{processingDeadline}, #{grindingDeadline},
#{requiredQty}, #{orderQty}, #{productionQty}, #{stockQty}, #{shortageQty},
@@ -3931,6 +3931,7 @@
PART_NO = NULLIF(#{partNo}, ''),
PART_NAME = NULLIF(#{partName}, ''),
QTY = NULLIF(#{qty}::TEXT, '')::NUMERIC,
ITEM_QTY = NULLIF(#{itemQty}::TEXT, '')::NUMERIC,
UNIT = NULLIF(#{unit}, ''),
SUPPLY_TYPE = NULLIF(#{supplyType}, ''),
MAKE_OR_BUY = NULLIF(#{makeOrBuy}, ''),
@@ -4055,6 +4056,7 @@
MD.PART_NO,
MD.PART_NAME,
MD.QTY,
MD.ITEM_QTY,
MD.UNIT,
MD.SUPPLY_TYPE,
MD.MAKE_OR_BUY,
@@ -4148,7 +4150,7 @@
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.ITEM_QTY,
A.QTY,
A.REGDATE,
A.SEQ,
@@ -4201,7 +4203,7 @@
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.ITEM_QTY,
B.QTY,
B.REGDATE,
B.SEQ,