mbom 위치 이동 시 하위 파트까지 같이 옮겨지도록(저장전에도 확인 가능하게 바로 반영되도록), 파트 추가 시 수량 변경가능하도록!
This commit is contained in:
@@ -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 품번을 변경된 최상위 제품의 품번으로 설정
|
||||
|
||||
@@ -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,
|
||||
|
||||
// 생산 정보
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user