구매리스트 가공 추가, 품의서 생성도 소재, 가공 분리
This commit is contained in:
@@ -461,30 +461,6 @@ function fn_initGrid() {
|
|||||||
title: '지급/사급',
|
title: '지급/사급',
|
||||||
field: 'SUPPLY_TYPE'
|
field: 'SUPPLY_TYPE'
|
||||||
},
|
},
|
||||||
// 17. 소재
|
|
||||||
{
|
|
||||||
headerHozAlign: 'center',
|
|
||||||
hozAlign: 'left',
|
|
||||||
width: 100,
|
|
||||||
title: '소재',
|
|
||||||
field: 'RAW_MATERIAL'
|
|
||||||
},
|
|
||||||
// 18. 사이즈
|
|
||||||
{
|
|
||||||
headerHozAlign: 'center',
|
|
||||||
hozAlign: 'left',
|
|
||||||
width: 100,
|
|
||||||
title: '사이즈',
|
|
||||||
field: 'SIZE'
|
|
||||||
},
|
|
||||||
// 19. 소재품번
|
|
||||||
{
|
|
||||||
headerHozAlign: 'center',
|
|
||||||
hozAlign: 'center',
|
|
||||||
width: 120,
|
|
||||||
title: '소재품번',
|
|
||||||
field: 'RAW_MATERIAL_NO'
|
|
||||||
},
|
|
||||||
// 20. 소재소요량
|
// 20. 소재소요량
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
@@ -529,27 +505,46 @@ function fn_initGrid() {
|
|||||||
return value ? Number(value).toLocaleString() : '0';
|
return value ? Number(value).toLocaleString() : '0';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 24. 가공업체 (수정가능 - Select2 에디터)
|
|
||||||
|
// 17. 소재 -> 소재재질
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'left',
|
||||||
|
width: 100,
|
||||||
|
title: '소재재질',
|
||||||
|
field: 'RAW_MATERIAL'
|
||||||
|
},
|
||||||
|
// 18. 사이즈 -> 규격
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'left',
|
||||||
|
width: 100,
|
||||||
|
title: '규격',
|
||||||
|
field: 'SIZE'
|
||||||
|
},
|
||||||
|
// 19. 소재품번
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'center',
|
||||||
|
width: 120,
|
||||||
|
title: '소재품번',
|
||||||
|
field: 'RAW_MATERIAL_NO'
|
||||||
|
},
|
||||||
|
// 30. 공급업체 (수정가능 - Select2 에디터)
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'left',
|
hozAlign: 'left',
|
||||||
width: 150,
|
width: 150,
|
||||||
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">가공업체</span>',
|
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">공급업체</span>',
|
||||||
field: 'PROCESSING_VENDOR',
|
field: 'VENDOR_PM',
|
||||||
editor: function(cell, onRendered, success, cancel, editorParams) {
|
editor: function(cell, onRendered, success, cancel, editorParams) {
|
||||||
// Select2 에디터
|
// Select2 에디터 (가공업체와 동일한 목록 사용)
|
||||||
return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams);
|
return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams);
|
||||||
},
|
},
|
||||||
formatter: function(cell) {
|
formatter: function(cell) {
|
||||||
var value = cell.getValue();
|
var value = cell.getValue();
|
||||||
|
if(!value) return '';
|
||||||
// 저장된 값이 없으면 기본값 '5001'(RPS) 설정
|
// processingVendorList에서 해당 값의 이름 찾기
|
||||||
if(value === undefined || value === null || value === '') {
|
|
||||||
value = '5001';
|
|
||||||
cell.getRow().update({PROCESSING_VENDOR: value}, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// OBJID로 업체명 조회하여 표시
|
|
||||||
for(var i = 0; i < processingVendorList.length; i++) {
|
for(var i = 0; i < processingVendorList.length; i++) {
|
||||||
if(processingVendorList[i].id == value) {
|
if(processingVendorList[i].id == value) {
|
||||||
return processingVendorList[i].text;
|
return processingVendorList[i].text;
|
||||||
@@ -558,27 +553,41 @@ function fn_initGrid() {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/* // 25. 가공납기 - 주석처리
|
// 31. 단가 (수정가능) -> 소재단가
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'center',
|
hozAlign: 'right',
|
||||||
width: 100,
|
width: 100,
|
||||||
title: '가공납기',
|
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">소재단가</span>',
|
||||||
field: 'PROCESSING_DEADLINE'
|
field: 'UNIT_PRICE',
|
||||||
|
editor: 'number',
|
||||||
|
editable: true,
|
||||||
|
formatter: function(cell) {
|
||||||
|
var value = cell.getValue();
|
||||||
|
return value ? Number(value).toLocaleString() : '0';
|
||||||
|
}
|
||||||
},
|
},
|
||||||
// 26. 연삭납기
|
// 32. 총단가 -> 소재총단가
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'center',
|
hozAlign: 'right',
|
||||||
width: 100,
|
width: 100,
|
||||||
title: '연삭납기',
|
title: '소재총단가',
|
||||||
field: 'GRINDING_DEADLINE'
|
field: 'TOTAL_PRICE',
|
||||||
}, */
|
formatter: function(cell) {
|
||||||
|
var data = cell.getRow().getData();
|
||||||
|
var qty = parseFloat(data.PO_QTY) || 0;
|
||||||
|
var unitPrice = parseFloat(data.UNIT_PRICE) || 0;
|
||||||
|
var totalPrice = qty * unitPrice;
|
||||||
|
return totalPrice > 0 ? totalPrice.toLocaleString() : '0';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
// 27. 사용여부 (수정가능)
|
// 27. 사용여부 (수정가능)
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'center',
|
hozAlign: 'center',
|
||||||
width: 80,
|
width: 90,
|
||||||
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">사용여부</span>',
|
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">사용여부</span>',
|
||||||
field: 'USE_YN',
|
field: 'USE_YN',
|
||||||
editor: 'list',
|
editor: 'list',
|
||||||
@@ -638,21 +647,28 @@ function fn_initGrid() {
|
|||||||
return value ? Number(value).toLocaleString() : '0';
|
return value ? Number(value).toLocaleString() : '0';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 30. 공급업체 (수정가능 - Select2 에디터)
|
|
||||||
|
// 24. 가공업체 (수정가능 - Select2 에디터)
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'left',
|
hozAlign: 'left',
|
||||||
width: 150,
|
width: 150,
|
||||||
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">공급업체</span>',
|
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">가공업체</span>',
|
||||||
field: 'VENDOR_PM',
|
field: 'PROCESSING_VENDOR',
|
||||||
editor: function(cell, onRendered, success, cancel, editorParams) {
|
editor: function(cell, onRendered, success, cancel, editorParams) {
|
||||||
// Select2 에디터 (가공업체와 동일한 목록 사용)
|
// Select2 에디터
|
||||||
return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams);
|
return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams);
|
||||||
},
|
},
|
||||||
formatter: function(cell) {
|
formatter: function(cell) {
|
||||||
var value = cell.getValue();
|
var value = cell.getValue();
|
||||||
if(!value) return '';
|
|
||||||
// processingVendorList에서 해당 값의 이름 찾기
|
// 저장된 값이 없으면 기본값 '5001'(RPS) 설정
|
||||||
|
if(value === undefined || value === null || value === '') {
|
||||||
|
value = '5001';
|
||||||
|
cell.getRow().update({PROCESSING_VENDOR: value}, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// OBJID로 업체명 조회하여 표시
|
||||||
for(var i = 0; i < processingVendorList.length; i++) {
|
for(var i = 0; i < processingVendorList.length; i++) {
|
||||||
if(processingVendorList[i].id == value) {
|
if(processingVendorList[i].id == value) {
|
||||||
return processingVendorList[i].text;
|
return processingVendorList[i].text;
|
||||||
@@ -661,13 +677,13 @@ function fn_initGrid() {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 31. 단가 (수정가능)
|
// 가공단가 (수정가능)
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'right',
|
hozAlign: 'right',
|
||||||
width: 100,
|
width: 100,
|
||||||
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">단가</span>',
|
title: '<span style="background-color: #FFFF00; padding: 2px 5px;">가공단가</span>',
|
||||||
field: 'UNIT_PRICE',
|
field: 'PROCESSING_UNIT_PRICE',
|
||||||
editor: 'number',
|
editor: 'number',
|
||||||
editable: true,
|
editable: true,
|
||||||
formatter: function(cell) {
|
formatter: function(cell) {
|
||||||
@@ -675,28 +691,94 @@ function fn_initGrid() {
|
|||||||
return value ? Number(value).toLocaleString() : '0';
|
return value ? Number(value).toLocaleString() : '0';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 32. 총단가
|
// 가공총단가 (가공단가 × 제작수량)
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'right',
|
hozAlign: 'right',
|
||||||
width: 100,
|
width: 100,
|
||||||
title: '총단가',
|
title: '가공총단가',
|
||||||
field: 'TOTAL_PRICE',
|
field: 'PROCESSING_TOTAL_PRICE',
|
||||||
formatter: function(cell) {
|
formatter: function(cell) {
|
||||||
var data = cell.getRow().getData();
|
var data = cell.getRow().getData();
|
||||||
var qty = parseFloat(data.PO_QTY) || 0;
|
var productionQty = parseFloat(data.PRODUCTION_QTY) || 0;
|
||||||
var unitPrice = parseFloat(data.UNIT_PRICE) || 0;
|
var processingUnitPrice = parseFloat(data.PROCESSING_UNIT_PRICE) || 0;
|
||||||
var totalPrice = qty * unitPrice;
|
var processingTotalPrice = productionQty * processingUnitPrice;
|
||||||
return totalPrice > 0 ? totalPrice.toLocaleString() : '0';
|
return processingTotalPrice > 0 ? processingTotalPrice.toLocaleString() : '0';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// 33. 품의서작성일
|
// 총합계 (소재총단가 + 가공총단가)
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'right',
|
||||||
|
width: 100,
|
||||||
|
title: '총합계',
|
||||||
|
field: 'GRAND_TOTAL_PRICE',
|
||||||
|
formatter: function(cell) {
|
||||||
|
var data = cell.getRow().getData();
|
||||||
|
// 소재총단가: 발주수량 × 소재단가
|
||||||
|
var poQty = parseFloat(data.PO_QTY) || 0;
|
||||||
|
var unitPrice = parseFloat(data.UNIT_PRICE) || 0;
|
||||||
|
var materialTotalPrice = poQty * unitPrice;
|
||||||
|
// 가공총단가: 제작수량 × 가공단가
|
||||||
|
var productionQty = parseFloat(data.PRODUCTION_QTY) || 0;
|
||||||
|
var processingUnitPrice = parseFloat(data.PROCESSING_UNIT_PRICE) || 0;
|
||||||
|
var processingTotalPrice = productionQty * processingUnitPrice;
|
||||||
|
// 총합계
|
||||||
|
var grandTotal = materialTotalPrice + processingTotalPrice;
|
||||||
|
return grandTotal > 0 ? grandTotal.toLocaleString() : '0';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
/* // 25. 가공납기 - 주석처리
|
||||||
{
|
{
|
||||||
headerHozAlign: 'center',
|
headerHozAlign: 'center',
|
||||||
hozAlign: 'center',
|
hozAlign: 'center',
|
||||||
width: 100,
|
width: 100,
|
||||||
title: '품의서작성일',
|
title: '가공납기',
|
||||||
field: 'PROPOSAL_DATE'
|
field: 'PROCESSING_DEADLINE'
|
||||||
|
},
|
||||||
|
// 26. 연삭납기
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'center',
|
||||||
|
width: 100,
|
||||||
|
title: '연삭납기',
|
||||||
|
field: 'GRINDING_DEADLINE'
|
||||||
|
}, */
|
||||||
|
|
||||||
|
|
||||||
|
// 33. 소재 품의서작성일
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'center',
|
||||||
|
width: 110,
|
||||||
|
title: '소재품의서일',
|
||||||
|
field: 'PROPOSAL_DATE',
|
||||||
|
formatter: function(cell) {
|
||||||
|
var value = cell.getValue();
|
||||||
|
if(!value) return '';
|
||||||
|
// YYYY-MM-DD 형식으로 표시
|
||||||
|
if(value.length >= 10) {
|
||||||
|
return value.substring(0, 10);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 34. 가공 품의서작성일
|
||||||
|
{
|
||||||
|
headerHozAlign: 'center',
|
||||||
|
hozAlign: 'center',
|
||||||
|
width: 110,
|
||||||
|
title: '가공품의서일',
|
||||||
|
field: 'PROCESSING_PROPOSAL_DATE',
|
||||||
|
formatter: function(cell) {
|
||||||
|
var value = cell.getValue();
|
||||||
|
if(!value) return '';
|
||||||
|
// YYYY-MM-DD 형식으로 표시
|
||||||
|
if(value.length >= 10) {
|
||||||
|
return value.substring(0, 10);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -719,8 +801,8 @@ function fn_initGrid() {
|
|||||||
var row = cell.getRow();
|
var row = cell.getRow();
|
||||||
var data = row.getData();
|
var data = row.getData();
|
||||||
|
|
||||||
// 발주수량 또는 단가 변경 시 총단가 자동 계산
|
// 발주수량, 소재단가, 가공단가 변경 시 총단가 자동 계산
|
||||||
if(field === 'PO_QTY' || field === 'UNIT_PRICE') {
|
if(field === 'PO_QTY' || field === 'UNIT_PRICE' || field === 'PROCESSING_UNIT_PRICE') {
|
||||||
row.reformat();
|
row.reformat();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -856,11 +938,19 @@ function fn_save() {
|
|||||||
|
|
||||||
// 저장 전 데이터 가공
|
// 저장 전 데이터 가공
|
||||||
gridData.forEach(function(item) {
|
gridData.forEach(function(item) {
|
||||||
// TOTAL_PRICE 계산 (PO_QTY * UNIT_PRICE)
|
// 소재총단가 계산 (PO_QTY * UNIT_PRICE)
|
||||||
var poQty = parseFloat(item.PO_QTY) || 0;
|
var poQty = parseFloat(item.PO_QTY) || 0;
|
||||||
var unitPrice = parseFloat(item.UNIT_PRICE) || 0;
|
var unitPrice = parseFloat(item.UNIT_PRICE) || 0;
|
||||||
item.TOTAL_PRICE = poQty * unitPrice;
|
item.TOTAL_PRICE = poQty * unitPrice;
|
||||||
|
|
||||||
|
// 가공총단가 계산 (PRODUCTION_QTY * PROCESSING_UNIT_PRICE)
|
||||||
|
var productionQty = parseFloat(item.PRODUCTION_QTY) || 0;
|
||||||
|
var processingUnitPrice = parseFloat(item.PROCESSING_UNIT_PRICE) || 0;
|
||||||
|
item.PROCESSING_TOTAL_PRICE = productionQty * processingUnitPrice;
|
||||||
|
|
||||||
|
// 총합계 계산 (소재총단가 + 가공총단가)
|
||||||
|
item.GRAND_TOTAL_PRICE = item.TOTAL_PRICE + item.PROCESSING_TOTAL_PRICE;
|
||||||
|
|
||||||
// 사용여부 변환: 사용/미사용 → Y/N
|
// 사용여부 변환: 사용/미사용 → Y/N
|
||||||
if(item.USE_YN === '사용') {
|
if(item.USE_YN === '사용') {
|
||||||
item.USE_YN = 'Y';
|
item.USE_YN = 'Y';
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ var columns = [
|
|||||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 }
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 }
|
||||||
,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4}
|
,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4}
|
||||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 }
|
,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 }
|
||||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1,
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "견적요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1,
|
||||||
formatter: function(cell, formatterParams, onRendered){
|
formatter: function(cell, formatterParams, onRendered){
|
||||||
// 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨
|
// 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨
|
||||||
var data = cell.getData();
|
var data = cell.getData();
|
||||||
@@ -214,6 +214,24 @@ var columns = [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"HAS_PURCHASE_REQUEST" , widthGrow:1.1,
|
||||||
|
// formatter: function(cell, formatterParams, onRendered){
|
||||||
|
// // 구매요청서 작성 여부: HAS_PURCHASE_REQUEST가 'Y'이면 구매요청서 작성됨
|
||||||
|
// var data = cell.getData();
|
||||||
|
// var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||||
|
// var iconClass = (hasPurchaseRequest == 'Y') ? 'file_icon' : 'file_empty_icon';
|
||||||
|
// return '<a href="#" class="File ' + iconClass + '" style="width:20px; height:20px; display:inline-block;"></a>';
|
||||||
|
// },
|
||||||
|
// cellClick : function(e, cell) {
|
||||||
|
// var data = cell.getData();
|
||||||
|
// var hasPurchaseRequest = fnc_checkNull(data.HAS_PURCHASE_REQUEST);
|
||||||
|
|
||||||
|
// // 구매요청서가 작성된 경우(파란색 아이콘)만 팝업 열기
|
||||||
|
// if(hasPurchaseRequest == 'Y') {
|
||||||
|
// fn_openSalesRequestFormPopUp(data.OBJID);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1,
|
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1,
|
||||||
// 요청인: 구매요청서 작성 시에만 표시
|
// 요청인: 구매요청서 작성 시에만 표시
|
||||||
formatter: function(cell, formatterParams, onRendered){
|
formatter: function(cell, formatterParams, onRendered){
|
||||||
@@ -297,7 +315,7 @@ function fn_openSalesRequestPopUp(objId){
|
|||||||
if(mbomHeaderObjid) {
|
if(mbomHeaderObjid) {
|
||||||
url += "&MBOM_HEADER_OBJID=" + mbomHeaderObjid;
|
url += "&MBOM_HEADER_OBJID=" + mbomHeaderObjid;
|
||||||
}
|
}
|
||||||
window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes");
|
window.open(url,"purchaseListPopUp","width=1800,height=800,scrollbars=yes,resizable=yes");
|
||||||
}
|
}
|
||||||
|
|
||||||
//구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시)
|
//구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시)
|
||||||
@@ -489,9 +507,9 @@ function fn_formPopUp(objId,sales_request_objid){
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 품의서 생성 함수
|
* 품의서 생성 함수
|
||||||
* - 선택된 구매요청서에서 단가가 입력된 품목만 필터링
|
* - 선택된 구매요청서에서 소재단가/가공단가가 입력된 품목만 필터링
|
||||||
* - 이미 품의서가 생성된 품목은 제외
|
* - 이미 품의서가 생성된 품목은 제외
|
||||||
* - 하나의 품의서로 생성
|
* - 소재/가공 각각 별도 품의서 생성
|
||||||
*/
|
*/
|
||||||
function fn_createProposal() {
|
function fn_createProposal() {
|
||||||
// 1. 선택된 행 확인
|
// 1. 선택된 행 확인
|
||||||
@@ -528,79 +546,73 @@ function fn_createProposal() {
|
|||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
if(response.resultFlag === "S") {
|
if(response.resultFlag === "S") {
|
||||||
var targetParts = response.data;
|
var materialParts = response.materialTargetParts || [];
|
||||||
var excludedParts = response.excludedParts || []; // 공급업체 미입력 품목
|
var processingParts = response.processingTargetParts || [];
|
||||||
|
var materialExcluded = response.materialExcludedParts || [];
|
||||||
|
var processingExcluded = response.processingExcludedParts || [];
|
||||||
|
|
||||||
// 3. 대상 품목 확인
|
// 3. 대상 품목 확인
|
||||||
if(!targetParts || targetParts.length == 0) {
|
if(materialParts.length == 0 && processingParts.length == 0) {
|
||||||
|
var excludedHtml = fn_buildExcludedHtml(materialExcluded, processingExcluded);
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '알림',
|
title: '알림',
|
||||||
text: '품의서를 생성할 품목이 없습니다.\n(단가와 공급업체가 모두 입력되고 품의서가 생성되지 않은 품목만 대상)',
|
html: '품의서를 생성할 품목이 없습니다.<br/>(소재단가+공급업체 또는 가공단가+가공업체가 입력되고 품의서가 생성되지 않은 품목만 대상)' + excludedHtml,
|
||||||
icon: 'info'
|
icon: 'info'
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 품의서 생성 확인
|
// 4. 품의서 생성 확인 - 소재/가공 구분 표시
|
||||||
var partCount = targetParts.length;
|
var confirmHtml = '<div style="text-align:left;">';
|
||||||
var partListHtml = targetParts.map(function(part) {
|
|
||||||
|
// 소재 품의서 대상
|
||||||
|
if(materialParts.length > 0) {
|
||||||
|
var materialListHtml = materialParts.map(function(part) {
|
||||||
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
}).join('<br/>');
|
}).join('<br/>');
|
||||||
|
|
||||||
// 공급업체 미입력으로 제외된 품목이 있는 경우 알림 추가
|
confirmHtml += '<div style="margin-bottom:15px; padding:10px; background-color:#e3f2fd; border:1px solid #2196F3; border-radius:4px;">' +
|
||||||
var excludedHtml = '';
|
'<p style="color:#1565C0; font-weight:bold; margin-bottom:5px;">📦 소재 품의서 (' + materialParts.length + '건)</p>' +
|
||||||
if(excludedParts && excludedParts.length > 0) {
|
'<div style="max-height:100px; overflow-y:auto; font-size:11px;">' + materialListHtml + '</div>' +
|
||||||
var excludedListHtml = excludedParts.map(function(part) {
|
|
||||||
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
|
||||||
}).join('<br/>');
|
|
||||||
|
|
||||||
excludedHtml = '<div style="margin-top:15px; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
|
||||||
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 공급업체 미입력으로 제외된 품목 (' + excludedParts.length + '건)</p>' +
|
|
||||||
'<div style="max-height:100px; overflow-y:auto; font-size:11px; color:#856404;">' +
|
|
||||||
excludedListHtml +
|
|
||||||
'</div>' +
|
|
||||||
'</div>';
|
'</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 가공 품의서 대상
|
||||||
|
if(processingParts.length > 0) {
|
||||||
|
var processingListHtml = processingParts.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
confirmHtml += '<div style="margin-bottom:15px; padding:10px; background-color:#fff3e0; border:1px solid #FF9800; border-radius:4px;">' +
|
||||||
|
'<p style="color:#E65100; font-weight:bold; margin-bottom:5px;">⚙️ 가공 품의서 (' + processingParts.length + '건)</p>' +
|
||||||
|
'<div style="max-height:100px; overflow-y:auto; font-size:11px;">' + processingListHtml + '</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 제외된 품목 표시
|
||||||
|
confirmHtml += fn_buildExcludedHtml(materialExcluded, processingExcluded);
|
||||||
|
confirmHtml += '</div>';
|
||||||
|
|
||||||
|
// 생성될 품의서 개수 표시
|
||||||
|
var proposalCount = (materialParts.length > 0 ? 1 : 0) + (processingParts.length > 0 ? 1 : 0);
|
||||||
|
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '품의서 생성',
|
title: '품의서 생성',
|
||||||
html: '<div style="text-align:left;">' +
|
html: '<p style="margin-bottom:10px;"><strong>' + proposalCount + '개</strong>의 품의서가 생성됩니다.</p>' + confirmHtml,
|
||||||
'<p>총 <strong>' + partCount + '건</strong>의 품목으로 품의서를 생성합니다.</p>' +
|
|
||||||
'<div style="max-height:150px; overflow-y:auto; border:1px solid #ddd; padding:10px; margin-top:10px; font-size:12px;">' +
|
|
||||||
partListHtml +
|
|
||||||
'</div>' +
|
|
||||||
excludedHtml +
|
|
||||||
'</div>',
|
|
||||||
icon: 'question',
|
icon: 'question',
|
||||||
showCancelButton: true,
|
showCancelButton: true,
|
||||||
confirmButtonText: '생성',
|
confirmButtonText: '생성',
|
||||||
cancelButtonText: '취소'
|
cancelButtonText: '취소',
|
||||||
|
width: '600px'
|
||||||
}).then((result) => {
|
}).then((result) => {
|
||||||
if (result.isConfirmed) {
|
if (result.isConfirmed) {
|
||||||
fn_executeCreateProposal(salesRequestObjid, targetParts);
|
fn_executeCreateProposal(salesRequestObjid, null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 실패 시에도 공급업체 미입력 품목 정보 표시
|
|
||||||
var excludedParts = response.excludedParts || [];
|
|
||||||
var excludedHtml = '';
|
|
||||||
|
|
||||||
if(excludedParts && excludedParts.length > 0) {
|
|
||||||
var excludedListHtml = excludedParts.map(function(part) {
|
|
||||||
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
|
||||||
}).join('<br/>');
|
|
||||||
|
|
||||||
excludedHtml = '<br/><br/><div style="text-align:left; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
|
||||||
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 공급업체 미입력 품목 (' + excludedParts.length + '건)</p>' +
|
|
||||||
'<div style="max-height:150px; overflow-y:auto; font-size:11px; color:#856404;">' +
|
|
||||||
excludedListHtml +
|
|
||||||
'</div>' +
|
|
||||||
'</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '알림',
|
title: '알림',
|
||||||
html: (response.message || '품목 조회 중 오류가 발생했습니다.') + excludedHtml,
|
html: response.message || '품목 조회 중 오류가 발생했습니다.',
|
||||||
icon: 'info'
|
icon: 'info'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -608,13 +620,44 @@ function fn_createProposal() {
|
|||||||
error: function(xhr, status, error) {
|
error: function(xhr, status, error) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '오류',
|
title: '오류',
|
||||||
text: '서버 통신 중 오류가 발생했습니다.22',
|
text: '서버 통신 중 오류가 발생했습니다.',
|
||||||
icon: 'error'
|
icon: 'error'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 제외된 품목 HTML 생성
|
||||||
|
*/
|
||||||
|
function fn_buildExcludedHtml(materialExcluded, processingExcluded) {
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
if(materialExcluded && materialExcluded.length > 0) {
|
||||||
|
var listHtml = materialExcluded.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
html += '<div style="margin-top:10px; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
||||||
|
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 소재 - 공급업체 미입력 (' + materialExcluded.length + '건)</p>' +
|
||||||
|
'<div style="max-height:80px; overflow-y:auto; font-size:11px; color:#856404;">' + listHtml + '</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if(processingExcluded && processingExcluded.length > 0) {
|
||||||
|
var listHtml = processingExcluded.map(function(part) {
|
||||||
|
return '- ' + fnc_checkNull(part.PART_NO) + ' / ' + fnc_checkNull(part.PART_NAME);
|
||||||
|
}).join('<br/>');
|
||||||
|
|
||||||
|
html += '<div style="margin-top:10px; padding:10px; background-color:#fff3cd; border:1px solid #ffc107; border-radius:4px;">' +
|
||||||
|
'<p style="color:#856404; font-weight:bold; margin-bottom:5px;">⚠️ 가공 - 가공업체 미입력 (' + processingExcluded.length + '건)</p>' +
|
||||||
|
'<div style="max-height:80px; overflow-y:auto; font-size:11px; color:#856404;">' + listHtml + '</div>' +
|
||||||
|
'</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 품의서 생성 실행
|
* 품의서 생성 실행
|
||||||
*/
|
*/
|
||||||
@@ -623,15 +666,16 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
|||||||
url: "/salesMng/createProposalFromPurchaseList.do",
|
url: "/salesMng/createProposalFromPurchaseList.do",
|
||||||
type: "POST",
|
type: "POST",
|
||||||
data: {
|
data: {
|
||||||
SALES_REQUEST_MASTER_OBJID: salesRequestObjid,
|
SALES_REQUEST_MASTER_OBJID: salesRequestObjid
|
||||||
TARGET_PARTS: JSON.stringify(targetParts)
|
|
||||||
},
|
},
|
||||||
dataType: "json",
|
dataType: "json",
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
if(response.resultFlag === "S") {
|
if(response.resultFlag === "S") {
|
||||||
|
// 서버에서 반환한 메시지 사용 (소재/가공 품의서 번호 포함)
|
||||||
|
var message = response.message || '품의서가 생성되었습니다.';
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '생성 완료',
|
title: '생성 완료',
|
||||||
text: '품의서가 생성되었습니다.\n품의서 관리에서 확인하세요.',
|
html: message.replace(/\n/g, '<br/>'),
|
||||||
icon: 'success'
|
icon: 'success'
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
fn_search(); // 목록 새로고침
|
fn_search(); // 목록 새로고침
|
||||||
@@ -639,12 +683,13 @@ function fn_executeCreateProposal(salesRequestObjid, targetParts) {
|
|||||||
} else {
|
} else {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '오류',
|
title: '오류',
|
||||||
text: response.message || '품의서 생성 중 오류가 발생했습니다.',
|
html: (response.message || '품의서 생성 중 오류가 발생했습니다.').replace(/\n/g, '<br/>'),
|
||||||
icon: 'error'
|
icon: 'error'
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: function(xhr, status, error) {
|
error: function(xhr, status, error) {
|
||||||
|
console.error("품의서 생성 오류:", status, error);
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
title: '오류',
|
title: '오류',
|
||||||
text: '서버 통신 중 오류가 발생했습니다.',
|
text: '서버 통신 중 오류가 발생했습니다.',
|
||||||
|
|||||||
@@ -3114,7 +3114,11 @@ UPDATE SET
|
|||||||
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
|
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
|
||||||
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE,
|
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE,
|
||||||
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
|
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
|
||||||
|
COALESCE(SRP.PROCESSING_UNIT_PRICE, 0) AS PROCESSING_UNIT_PRICE,
|
||||||
|
COALESCE(SRP.PROCESSING_TOTAL_PRICE, 0) AS PROCESSING_TOTAL_PRICE,
|
||||||
|
COALESCE(SRP.GRAND_TOTAL_PRICE, 0) AS GRAND_TOTAL_PRICE,
|
||||||
SRP.PROPOSAL_DATE,
|
SRP.PROPOSAL_DATE,
|
||||||
|
SRP.PROCESSING_PROPOSAL_DATE,
|
||||||
'SRP' AS DATA_SOURCE -- 데이터 소스 구분용
|
'SRP' AS DATA_SOURCE -- 데이터 소스 구분용
|
||||||
FROM
|
FROM
|
||||||
SALES_REQUEST_PART SRP
|
SALES_REQUEST_PART SRP
|
||||||
@@ -3173,7 +3177,11 @@ WITH RECURSIVE VIEW_BOM(
|
|||||||
USE_YN,
|
USE_YN,
|
||||||
NET_QTY,
|
NET_QTY,
|
||||||
PO_QTY,
|
PO_QTY,
|
||||||
PROPOSAL_DATE
|
PROPOSAL_DATE,
|
||||||
|
PROCESSING_PROPOSAL_DATE,
|
||||||
|
PROCESSING_UNIT_PRICE,
|
||||||
|
PROCESSING_TOTAL_PRICE,
|
||||||
|
GRAND_TOTAL_PRICE
|
||||||
) AS (
|
) AS (
|
||||||
SELECT
|
SELECT
|
||||||
A.MBOM_HEADER_OBJID,
|
A.MBOM_HEADER_OBJID,
|
||||||
@@ -3221,7 +3229,11 @@ WITH RECURSIVE VIEW_BOM(
|
|||||||
COALESCE(A.USE_YN, 'Y'),
|
COALESCE(A.USE_YN, 'Y'),
|
||||||
COALESCE(A.NET_QTY, 0),
|
COALESCE(A.NET_QTY, 0),
|
||||||
COALESCE(A.PO_QTY, 0),
|
COALESCE(A.PO_QTY, 0),
|
||||||
A.PROPOSAL_DATE
|
A.PROPOSAL_DATE,
|
||||||
|
A.PROCESSING_PROPOSAL_DATE,
|
||||||
|
COALESCE(A.PROCESSING_UNIT_PRICE, 0),
|
||||||
|
COALESCE(A.PROCESSING_TOTAL_PRICE, 0),
|
||||||
|
COALESCE(A.GRAND_TOTAL_PRICE, 0)
|
||||||
FROM
|
FROM
|
||||||
MBOM_DETAIL A
|
MBOM_DETAIL A
|
||||||
INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID
|
INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID
|
||||||
@@ -3281,7 +3293,11 @@ WITH RECURSIVE VIEW_BOM(
|
|||||||
COALESCE(B.USE_YN, 'Y'),
|
COALESCE(B.USE_YN, 'Y'),
|
||||||
COALESCE(B.NET_QTY, 0),
|
COALESCE(B.NET_QTY, 0),
|
||||||
COALESCE(B.PO_QTY, 0),
|
COALESCE(B.PO_QTY, 0),
|
||||||
B.PROPOSAL_DATE
|
B.PROPOSAL_DATE,
|
||||||
|
B.PROCESSING_PROPOSAL_DATE,
|
||||||
|
COALESCE(B.PROCESSING_UNIT_PRICE, 0),
|
||||||
|
COALESCE(B.PROCESSING_TOTAL_PRICE, 0),
|
||||||
|
COALESCE(B.GRAND_TOTAL_PRICE, 0)
|
||||||
FROM
|
FROM
|
||||||
MBOM_DETAIL B
|
MBOM_DETAIL B
|
||||||
JOIN
|
JOIN
|
||||||
@@ -3369,6 +3385,10 @@ SELECT
|
|||||||
V.NET_QTY,
|
V.NET_QTY,
|
||||||
V.PO_QTY,
|
V.PO_QTY,
|
||||||
V.PROPOSAL_DATE,
|
V.PROPOSAL_DATE,
|
||||||
|
V.PROCESSING_PROPOSAL_DATE,
|
||||||
|
V.PROCESSING_UNIT_PRICE,
|
||||||
|
V.PROCESSING_TOTAL_PRICE,
|
||||||
|
V.GRAND_TOTAL_PRICE,
|
||||||
'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용
|
'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용
|
||||||
FROM VIEW_BOM V
|
FROM VIEW_BOM V
|
||||||
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR
|
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR
|
||||||
@@ -3400,6 +3420,9 @@ ORDER BY V.PATH2
|
|||||||
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
|
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
|
||||||
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
EDITER = #{EDITER},
|
EDITER = #{EDITER},
|
||||||
EDIT_DATE = NOW()
|
EDIT_DATE = NOW()
|
||||||
WHERE OBJID::VARCHAR = #{OBJID}
|
WHERE OBJID::VARCHAR = #{OBJID}
|
||||||
@@ -3415,6 +3438,9 @@ ORDER BY V.PATH2
|
|||||||
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
|
PROCESSING_VENDOR = #{PROCESSING_VENDOR},
|
||||||
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
PROCESSING_UNIT_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
PROCESSING_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{PROCESSING_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
|
GRAND_TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{GRAND_TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
|
||||||
WRITER = #{EDITER}
|
WRITER = #{EDITER}
|
||||||
WHERE OBJID::VARCHAR = #{OBJID}
|
WHERE OBJID::VARCHAR = #{OBJID}
|
||||||
</update>
|
</update>
|
||||||
@@ -3477,7 +3503,7 @@ ORDER BY V.PATH2
|
|||||||
|
|
||||||
<!-- ==================== 품의서 관리 ==================== -->
|
<!-- ==================== 품의서 관리 ==================== -->
|
||||||
|
|
||||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) -->
|
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 소재단가 기준 -->
|
||||||
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
SELECT
|
SELECT
|
||||||
MD.OBJID,
|
MD.OBJID,
|
||||||
@@ -3488,27 +3514,62 @@ ORDER BY V.PATH2
|
|||||||
MD.UNIT_PRICE,
|
MD.UNIT_PRICE,
|
||||||
MD.TOTAL_PRICE,
|
MD.TOTAL_PRICE,
|
||||||
MD.VENDOR AS VENDOR_PM,
|
MD.VENDOR AS VENDOR_PM,
|
||||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
|
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
|
||||||
MD.NET_QTY,
|
MD.NET_QTY,
|
||||||
MD.PO_QTY,
|
MD.PO_QTY,
|
||||||
'MBOM' AS DATA_SOURCE
|
MD.PRODUCTION_QTY,
|
||||||
|
'MBOM' AS DATA_SOURCE,
|
||||||
|
'MATERIAL' AS PROPOSAL_TYPE
|
||||||
FROM
|
FROM
|
||||||
MBOM_DETAIL MD
|
MBOM_DETAIL MD
|
||||||
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
WHERE
|
WHERE
|
||||||
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||||
-- 단가가 입력되어 있고
|
-- 소재단가가 입력되어 있고
|
||||||
AND MD.UNIT_PRICE IS NOT NULL
|
AND MD.UNIT_PRICE IS NOT NULL
|
||||||
AND MD.UNIT_PRICE > 0
|
AND MD.UNIT_PRICE > 0
|
||||||
-- 공급업체가 입력되어 있고
|
-- 공급업체가 입력되어 있고
|
||||||
AND MD.VENDOR IS NOT NULL
|
AND MD.VENDOR IS NOT NULL
|
||||||
AND MD.VENDOR != ''
|
AND MD.VENDOR != ''
|
||||||
-- 품의서가 생성되지 않은 품목만
|
-- 소재 품의서가 생성되지 않은 품목만
|
||||||
AND MD.PROPOSAL_DATE IS NULL
|
AND MD.PROPOSAL_DATE IS NULL
|
||||||
ORDER BY MD.REGDATE
|
ORDER BY MD.REGDATE
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (단가O, 공급업체X) -->
|
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공단가 기준 -->
|
||||||
|
<select id="getProposalTargetPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
|
SELECT
|
||||||
|
MD.OBJID,
|
||||||
|
MD.PART_OBJID,
|
||||||
|
PM.PART_NO,
|
||||||
|
PM.PART_NAME,
|
||||||
|
MD.QTY,
|
||||||
|
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
MD.PROCESSING_VENDOR AS VENDOR_PM,
|
||||||
|
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS VENDOR_NAME,
|
||||||
|
MD.NET_QTY,
|
||||||
|
MD.PO_QTY,
|
||||||
|
MD.PRODUCTION_QTY,
|
||||||
|
'MBOM' AS DATA_SOURCE,
|
||||||
|
'PROCESSING' AS PROPOSAL_TYPE
|
||||||
|
FROM
|
||||||
|
MBOM_DETAIL MD
|
||||||
|
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
|
WHERE
|
||||||
|
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||||
|
-- 가공단가가 입력되어 있고
|
||||||
|
AND MD.PROCESSING_UNIT_PRICE IS NOT NULL
|
||||||
|
AND MD.PROCESSING_UNIT_PRICE > 0
|
||||||
|
-- 가공업체가 입력되어 있고
|
||||||
|
AND MD.PROCESSING_VENDOR IS NOT NULL
|
||||||
|
AND MD.PROCESSING_VENDOR != ''
|
||||||
|
-- 가공 품의서가 생성되지 않은 품목만
|
||||||
|
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||||
|
ORDER BY MD.REGDATE
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (소재단가O, 공급업체X) -->
|
||||||
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
SELECT
|
SELECT
|
||||||
MD.OBJID,
|
MD.OBJID,
|
||||||
@@ -3518,23 +3579,51 @@ ORDER BY V.PATH2
|
|||||||
MD.QTY,
|
MD.QTY,
|
||||||
MD.UNIT_PRICE,
|
MD.UNIT_PRICE,
|
||||||
MD.TOTAL_PRICE,
|
MD.TOTAL_PRICE,
|
||||||
'MBOM' AS DATA_SOURCE
|
'MBOM' AS DATA_SOURCE,
|
||||||
|
'MATERIAL' AS PROPOSAL_TYPE
|
||||||
FROM
|
FROM
|
||||||
MBOM_DETAIL MD
|
MBOM_DETAIL MD
|
||||||
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
WHERE
|
WHERE
|
||||||
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||||
-- 단가가 입력되어 있고
|
-- 소재단가가 입력되어 있고
|
||||||
AND MD.UNIT_PRICE IS NOT NULL
|
AND MD.UNIT_PRICE IS NOT NULL
|
||||||
AND MD.UNIT_PRICE > 0
|
AND MD.UNIT_PRICE > 0
|
||||||
-- 공급업체가 미입력
|
-- 공급업체가 미입력
|
||||||
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
|
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
|
||||||
-- 품의서가 생성되지 않은 품목만
|
-- 소재 품의서가 생성되지 않은 품목만
|
||||||
AND MD.PROPOSAL_DATE IS NULL
|
AND MD.PROPOSAL_DATE IS NULL
|
||||||
ORDER BY MD.REGDATE
|
ORDER BY MD.REGDATE
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) -->
|
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (가공단가O, 가공업체X) -->
|
||||||
|
<select id="getProposalExcludedPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
|
SELECT
|
||||||
|
MD.OBJID,
|
||||||
|
MD.PART_OBJID,
|
||||||
|
PM.PART_NO,
|
||||||
|
PM.PART_NAME,
|
||||||
|
MD.QTY,
|
||||||
|
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
'MBOM' AS DATA_SOURCE,
|
||||||
|
'PROCESSING' AS PROPOSAL_TYPE
|
||||||
|
FROM
|
||||||
|
MBOM_DETAIL MD
|
||||||
|
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
|
WHERE
|
||||||
|
MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||||
|
-- 가공단가가 입력되어 있고
|
||||||
|
AND MD.PROCESSING_UNIT_PRICE IS NOT NULL
|
||||||
|
AND MD.PROCESSING_UNIT_PRICE > 0
|
||||||
|
-- 가공업체가 미입력
|
||||||
|
AND (MD.PROCESSING_VENDOR IS NULL OR MD.PROCESSING_VENDOR = '')
|
||||||
|
-- 가공 품의서가 생성되지 않은 품목만
|
||||||
|
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||||
|
ORDER BY MD.REGDATE
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 소재단가 기준 -->
|
||||||
<select id="getProposalTargetPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
<select id="getProposalTargetPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
SELECT
|
SELECT
|
||||||
SRP.OBJID,
|
SRP.OBJID,
|
||||||
@@ -3545,27 +3634,62 @@ ORDER BY V.PATH2
|
|||||||
SRP.UNIT_PRICE,
|
SRP.UNIT_PRICE,
|
||||||
SRP.TOTAL_PRICE,
|
SRP.TOTAL_PRICE,
|
||||||
SRP.VENDOR_PM,
|
SRP.VENDOR_PM,
|
||||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
|
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
|
||||||
SRP.NET_QTY,
|
SRP.NET_QTY,
|
||||||
SRP.PO_QTY,
|
SRP.PO_QTY,
|
||||||
'MANUAL' AS DATA_SOURCE
|
SRP.PRODUCTION_QTY,
|
||||||
|
'MANUAL' AS DATA_SOURCE,
|
||||||
|
'MATERIAL' AS PROPOSAL_TYPE
|
||||||
FROM
|
FROM
|
||||||
SALES_REQUEST_PART SRP
|
SALES_REQUEST_PART SRP
|
||||||
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
WHERE
|
WHERE
|
||||||
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
||||||
-- 단가가 입력되어 있고
|
-- 소재단가가 입력되어 있고
|
||||||
AND SRP.UNIT_PRICE IS NOT NULL
|
AND SRP.UNIT_PRICE IS NOT NULL
|
||||||
AND SRP.UNIT_PRICE > 0
|
AND SRP.UNIT_PRICE > 0
|
||||||
-- 공급업체가 입력되어 있고
|
-- 공급업체가 입력되어 있고
|
||||||
AND SRP.VENDOR_PM IS NOT NULL
|
AND SRP.VENDOR_PM IS NOT NULL
|
||||||
AND SRP.VENDOR_PM != ''
|
AND SRP.VENDOR_PM != ''
|
||||||
-- 품의서가 생성되지 않은 품목만
|
-- 소재 품의서가 생성되지 않은 품목만
|
||||||
AND SRP.PROPOSAL_DATE IS NULL
|
AND SRP.PROPOSAL_DATE IS NULL
|
||||||
ORDER BY SRP.REGDATE
|
ORDER BY SRP.REGDATE
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 품의서 대상 제외 품목 조회 - 수동 작성 (단가O, 공급업체X) -->
|
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공단가 기준 -->
|
||||||
|
<select id="getProposalTargetPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
|
SELECT
|
||||||
|
SRP.OBJID,
|
||||||
|
SRP.PART_OBJID,
|
||||||
|
PM.PART_NO,
|
||||||
|
PM.PART_NAME,
|
||||||
|
SRP.QTY,
|
||||||
|
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
SRP.PROCESSING_VENDOR AS VENDOR_PM,
|
||||||
|
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.PROCESSING_VENDOR) AS VENDOR_NAME,
|
||||||
|
SRP.NET_QTY,
|
||||||
|
SRP.PO_QTY,
|
||||||
|
SRP.PRODUCTION_QTY,
|
||||||
|
'MANUAL' AS DATA_SOURCE,
|
||||||
|
'PROCESSING' AS PROPOSAL_TYPE
|
||||||
|
FROM
|
||||||
|
SALES_REQUEST_PART SRP
|
||||||
|
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
|
WHERE
|
||||||
|
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
||||||
|
-- 가공단가가 입력되어 있고
|
||||||
|
AND SRP.PROCESSING_UNIT_PRICE IS NOT NULL
|
||||||
|
AND SRP.PROCESSING_UNIT_PRICE > 0
|
||||||
|
-- 가공업체가 입력되어 있고
|
||||||
|
AND SRP.PROCESSING_VENDOR IS NOT NULL
|
||||||
|
AND SRP.PROCESSING_VENDOR != ''
|
||||||
|
-- 가공 품의서가 생성되지 않은 품목만
|
||||||
|
AND SRP.PROCESSING_PROPOSAL_DATE IS NULL
|
||||||
|
ORDER BY SRP.REGDATE
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 품의서 대상 제외 품목 조회 - 수동 작성 (소재단가O, 공급업체X) -->
|
||||||
<select id="getProposalExcludedPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
<select id="getProposalExcludedPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
SELECT
|
SELECT
|
||||||
SRP.OBJID,
|
SRP.OBJID,
|
||||||
@@ -3575,22 +3699,50 @@ ORDER BY V.PATH2
|
|||||||
SRP.QTY,
|
SRP.QTY,
|
||||||
SRP.UNIT_PRICE,
|
SRP.UNIT_PRICE,
|
||||||
SRP.TOTAL_PRICE,
|
SRP.TOTAL_PRICE,
|
||||||
'MANUAL' AS DATA_SOURCE
|
'MANUAL' AS DATA_SOURCE,
|
||||||
|
'MATERIAL' AS PROPOSAL_TYPE
|
||||||
FROM
|
FROM
|
||||||
SALES_REQUEST_PART SRP
|
SALES_REQUEST_PART SRP
|
||||||
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
WHERE
|
WHERE
|
||||||
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
||||||
-- 단가가 입력되어 있고
|
-- 소재단가가 입력되어 있고
|
||||||
AND SRP.UNIT_PRICE IS NOT NULL
|
AND SRP.UNIT_PRICE IS NOT NULL
|
||||||
AND SRP.UNIT_PRICE > 0
|
AND SRP.UNIT_PRICE > 0
|
||||||
-- 공급업체가 미입력
|
-- 공급업체가 미입력
|
||||||
AND (SRP.VENDOR_PM IS NULL OR SRP.VENDOR_PM = '')
|
AND (SRP.VENDOR_PM IS NULL OR SRP.VENDOR_PM = '')
|
||||||
-- 품의서가 생성되지 않은 품목만
|
-- 소재 품의서가 생성되지 않은 품목만
|
||||||
AND SRP.PROPOSAL_DATE IS NULL
|
AND SRP.PROPOSAL_DATE IS NULL
|
||||||
ORDER BY SRP.REGDATE
|
ORDER BY SRP.REGDATE
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<!-- 품의서 대상 제외 품목 조회 - 수동 작성 (가공단가O, 가공업체X) -->
|
||||||
|
<select id="getProposalExcludedPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||||
|
SELECT
|
||||||
|
SRP.OBJID,
|
||||||
|
SRP.PART_OBJID,
|
||||||
|
PM.PART_NO,
|
||||||
|
PM.PART_NAME,
|
||||||
|
SRP.QTY,
|
||||||
|
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
'MANUAL' AS DATA_SOURCE,
|
||||||
|
'PROCESSING' AS PROPOSAL_TYPE
|
||||||
|
FROM
|
||||||
|
SALES_REQUEST_PART SRP
|
||||||
|
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
|
||||||
|
WHERE
|
||||||
|
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
|
||||||
|
-- 가공단가가 입력되어 있고
|
||||||
|
AND SRP.PROCESSING_UNIT_PRICE IS NOT NULL
|
||||||
|
AND SRP.PROCESSING_UNIT_PRICE > 0
|
||||||
|
-- 가공업체가 미입력
|
||||||
|
AND (SRP.PROCESSING_VENDOR IS NULL OR SRP.PROCESSING_VENDOR = '')
|
||||||
|
-- 가공 품의서가 생성되지 않은 품목만
|
||||||
|
AND SRP.PROCESSING_PROPOSAL_DATE IS NULL
|
||||||
|
ORDER BY SRP.REGDATE
|
||||||
|
</select>
|
||||||
|
|
||||||
<!-- 품의서 생성 (SALES_REQUEST_MASTER에 INSERT) -->
|
<!-- 품의서 생성 (SALES_REQUEST_MASTER에 INSERT) -->
|
||||||
<insert id="insertProposal" parameterType="map">
|
<insert id="insertProposal" parameterType="map">
|
||||||
INSERT INTO SALES_REQUEST_MASTER (
|
INSERT INTO SALES_REQUEST_MASTER (
|
||||||
@@ -3628,7 +3780,7 @@ ORDER BY V.PATH2
|
|||||||
)
|
)
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) -->
|
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 소재 -->
|
||||||
<insert id="insertProposalPartFromMBom" parameterType="map">
|
<insert id="insertProposalPartFromMBom" parameterType="map">
|
||||||
INSERT INTO SALES_REQUEST_PART (
|
INSERT INTO SALES_REQUEST_PART (
|
||||||
OBJID,
|
OBJID,
|
||||||
@@ -3663,7 +3815,42 @@ ORDER BY V.PATH2
|
|||||||
WHERE OBJID = #{SOURCE_OBJID}
|
WHERE OBJID = #{SOURCE_OBJID}
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) -->
|
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 가공 -->
|
||||||
|
<insert id="insertProposalPartFromMBomProcessing" parameterType="map">
|
||||||
|
INSERT INTO SALES_REQUEST_PART (
|
||||||
|
OBJID,
|
||||||
|
SALES_REQUEST_MASTER_OBJID,
|
||||||
|
PART_OBJID,
|
||||||
|
QTY,
|
||||||
|
UNIT_PRICE,
|
||||||
|
TOTAL_PRICE,
|
||||||
|
VENDOR_PM,
|
||||||
|
NET_QTY,
|
||||||
|
PO_QTY,
|
||||||
|
USE_YN,
|
||||||
|
PROPOSAL_DATE,
|
||||||
|
WRITER,
|
||||||
|
REGDATE
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
#{NEW_OBJID},
|
||||||
|
#{PROPOSAL_MASTER_OBJID},
|
||||||
|
PART_OBJID,
|
||||||
|
PRODUCTION_QTY AS QTY,
|
||||||
|
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
PROCESSING_VENDOR AS VENDOR_PM,
|
||||||
|
NET_QTY,
|
||||||
|
PO_QTY,
|
||||||
|
USE_YN,
|
||||||
|
NOW() AS PROPOSAL_DATE,
|
||||||
|
#{WRITER},
|
||||||
|
NOW()
|
||||||
|
FROM MBOM_DETAIL
|
||||||
|
WHERE OBJID = #{SOURCE_OBJID}
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 소재 -->
|
||||||
<insert id="insertProposalPartFromManual" parameterType="map">
|
<insert id="insertProposalPartFromManual" parameterType="map">
|
||||||
INSERT INTO SALES_REQUEST_PART (
|
INSERT INTO SALES_REQUEST_PART (
|
||||||
OBJID,
|
OBJID,
|
||||||
@@ -3698,7 +3885,42 @@ ORDER BY V.PATH2
|
|||||||
WHERE OBJID = #{SOURCE_OBJID}
|
WHERE OBJID = #{SOURCE_OBJID}
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (수동 작성 - SALES_REQUEST_PART) -->
|
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 가공 -->
|
||||||
|
<insert id="insertProposalPartFromManualProcessing" parameterType="map">
|
||||||
|
INSERT INTO SALES_REQUEST_PART (
|
||||||
|
OBJID,
|
||||||
|
SALES_REQUEST_MASTER_OBJID,
|
||||||
|
PART_OBJID,
|
||||||
|
QTY,
|
||||||
|
UNIT_PRICE,
|
||||||
|
TOTAL_PRICE,
|
||||||
|
VENDOR_PM,
|
||||||
|
NET_QTY,
|
||||||
|
PO_QTY,
|
||||||
|
USE_YN,
|
||||||
|
PROPOSAL_DATE,
|
||||||
|
WRITER,
|
||||||
|
REGDATE
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
#{NEW_OBJID},
|
||||||
|
#{PROPOSAL_MASTER_OBJID},
|
||||||
|
PART_OBJID,
|
||||||
|
PRODUCTION_QTY AS QTY,
|
||||||
|
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||||
|
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||||
|
PROCESSING_VENDOR AS VENDOR_PM,
|
||||||
|
NET_QTY,
|
||||||
|
PO_QTY,
|
||||||
|
USE_YN,
|
||||||
|
NOW() AS PROPOSAL_DATE,
|
||||||
|
#{WRITER},
|
||||||
|
NOW()
|
||||||
|
FROM SALES_REQUEST_PART
|
||||||
|
WHERE OBJID = #{SOURCE_OBJID}
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (수동 작성 - SALES_REQUEST_PART) - 소재 -->
|
||||||
<update id="updateProposalDateForManualParts" parameterType="map">
|
<update id="updateProposalDateForManualParts" parameterType="map">
|
||||||
UPDATE SALES_REQUEST_PART
|
UPDATE SALES_REQUEST_PART
|
||||||
SET PROPOSAL_DATE = NOW()
|
SET PROPOSAL_DATE = NOW()
|
||||||
@@ -3708,7 +3930,17 @@ ORDER BY V.PATH2
|
|||||||
</foreach>
|
</foreach>
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) -->
|
<!-- 품의서 생성 후 PROCESSING_PROPOSAL_DATE 업데이트 (수동 작성 - SALES_REQUEST_PART) - 가공 -->
|
||||||
|
<update id="updateProcessingProposalDateForManualParts" parameterType="map">
|
||||||
|
UPDATE SALES_REQUEST_PART
|
||||||
|
SET PROCESSING_PROPOSAL_DATE = NOW()
|
||||||
|
WHERE OBJID IN
|
||||||
|
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
|
||||||
|
#{objid}
|
||||||
|
</foreach>
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 소재 -->
|
||||||
<update id="updateProposalDateForMBomParts" parameterType="map">
|
<update id="updateProposalDateForMBomParts" parameterType="map">
|
||||||
UPDATE MBOM_DETAIL
|
UPDATE MBOM_DETAIL
|
||||||
SET PROPOSAL_DATE = NOW()
|
SET PROPOSAL_DATE = NOW()
|
||||||
@@ -3718,6 +3950,16 @@ ORDER BY V.PATH2
|
|||||||
</foreach>
|
</foreach>
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
|
<!-- 품의서 생성 후 PROCESSING_PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 가공 -->
|
||||||
|
<update id="updateProcessingProposalDateForMBomParts" parameterType="map">
|
||||||
|
UPDATE MBOM_DETAIL
|
||||||
|
SET PROCESSING_PROPOSAL_DATE = NOW()
|
||||||
|
WHERE OBJID IN
|
||||||
|
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
|
||||||
|
#{objid}
|
||||||
|
</foreach>
|
||||||
|
</update>
|
||||||
|
|
||||||
<!-- 품의서 목록 조회 -->
|
<!-- 품의서 목록 조회 -->
|
||||||
<select id="getProposalMngGridList" parameterType="map" resultType="map">
|
<select id="getProposalMngGridList" parameterType="map" resultType="map">
|
||||||
SELECT
|
SELECT
|
||||||
|
|||||||
@@ -1428,25 +1428,37 @@ public class SalesMngController {
|
|||||||
|
|
||||||
String salesRequestMasterObjid = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID"));
|
String salesRequestMasterObjid = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID"));
|
||||||
|
|
||||||
// Service의 공통 메서드 사용
|
// Service의 공통 메서드 사용 (소재/가공 분리)
|
||||||
Map partsInfo = salesMngService.getProposalTargetPartsWithInfo(sqlSession, salesRequestMasterObjid);
|
Map partsInfo = salesMngService.getProposalTargetPartsWithInfo(sqlSession, salesRequestMasterObjid);
|
||||||
List<Map> targetParts = (List<Map>)partsInfo.get("targetParts");
|
|
||||||
List<Map> excludedParts = (List<Map>)partsInfo.get("excludedParts"); // 공급업체 미입력 품목
|
|
||||||
|
|
||||||
if(targetParts != null && !targetParts.isEmpty()) {
|
// 소재/가공 각각 분리된 데이터
|
||||||
|
List<Map> materialTargetParts = (List<Map>)partsInfo.get("materialTargetParts");
|
||||||
|
List<Map> processingTargetParts = (List<Map>)partsInfo.get("processingTargetParts");
|
||||||
|
List<Map> materialExcludedParts = (List<Map>)partsInfo.get("materialExcludedParts");
|
||||||
|
List<Map> processingExcludedParts = (List<Map>)partsInfo.get("processingExcludedParts");
|
||||||
|
|
||||||
|
// 기존 호환성을 위한 통합 데이터
|
||||||
|
List<Map> targetParts = (List<Map>)partsInfo.get("targetParts");
|
||||||
|
List<Map> excludedParts = (List<Map>)partsInfo.get("excludedParts");
|
||||||
|
|
||||||
|
boolean hasMaterialParts = materialTargetParts != null && !materialTargetParts.isEmpty();
|
||||||
|
boolean hasProcessingParts = processingTargetParts != null && !processingTargetParts.isEmpty();
|
||||||
|
|
||||||
|
if(hasMaterialParts || hasProcessingParts) {
|
||||||
resultMap.put("resultFlag", "S");
|
resultMap.put("resultFlag", "S");
|
||||||
|
// 소재/가공 분리 데이터
|
||||||
|
resultMap.put("materialTargetParts", materialTargetParts);
|
||||||
|
resultMap.put("processingTargetParts", processingTargetParts);
|
||||||
|
resultMap.put("materialExcludedParts", materialExcludedParts);
|
||||||
|
resultMap.put("processingExcludedParts", processingExcludedParts);
|
||||||
|
// 기존 호환성
|
||||||
resultMap.put("data", targetParts);
|
resultMap.put("data", targetParts);
|
||||||
resultMap.put("excludedParts", excludedParts); // 공급업체 미입력 품목도 함께 반환
|
|
||||||
} else {
|
|
||||||
// 대상 품목이 없는 경우, 공급업체 미입력 품목이 있는지 확인
|
|
||||||
if(excludedParts != null && !excludedParts.isEmpty()) {
|
|
||||||
resultMap.put("resultFlag", "F");
|
|
||||||
resultMap.put("message", "품의서 생성 대상 품목이 없습니다.\n(단가와 공급업체가 모두 입력된 품목만 가능)");
|
|
||||||
resultMap.put("excludedParts", excludedParts);
|
resultMap.put("excludedParts", excludedParts);
|
||||||
} else {
|
} else {
|
||||||
resultMap.put("resultFlag", "F");
|
resultMap.put("resultFlag", "F");
|
||||||
resultMap.put("message", "품의서 생성 대상 품목이 없습니다.\n(단가가 입력되고 품의서가 생성되지 않은 품목만 가능)");
|
resultMap.put("message", "품의서 생성 대상 품목이 없습니다.\n(소재단가+공급업체 또는 가공단가+가공업체가 입력되고 품의서가 생성되지 않은 품목만 가능)");
|
||||||
}
|
resultMap.put("materialExcludedParts", materialExcludedParts);
|
||||||
|
resultMap.put("processingExcludedParts", processingExcludedParts);
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|||||||
@@ -1949,10 +1949,10 @@ public class SalesMngService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 품의서 대상 품목 조회 (공통 메서드)
|
* 품의서 대상 품목 조회 (소재/가공 각각 분리)
|
||||||
* @param sqlSession
|
* @param sqlSession
|
||||||
* @param salesRequestMasterObjid
|
* @param salesRequestMasterObjid
|
||||||
* @return Map { targetParts: List<Map>, mbomHeaderObjid: String, purchaseRequestInfo: Map }
|
* @return Map { materialTargetParts, processingTargetParts, materialExcludedParts, processingExcludedParts, mbomHeaderObjid, purchaseRequestInfo }
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public Map getProposalTargetPartsWithInfo(SqlSession sqlSession, String salesRequestMasterObjid) throws Exception {
|
public Map getProposalTargetPartsWithInfo(SqlSession sqlSession, String salesRequestMasterObjid) throws Exception {
|
||||||
@@ -1967,28 +1967,56 @@ public class SalesMngService {
|
|||||||
|
|
||||||
String mbomHeaderObjid = CommonUtils.checkNull(purchaseRequestInfo.get("MBOM_HEADER_OBJID"));
|
String mbomHeaderObjid = CommonUtils.checkNull(purchaseRequestInfo.get("MBOM_HEADER_OBJID"));
|
||||||
|
|
||||||
// 2. 품의서 대상 품목 조회 (M-BOM 기반 여부에 따라 분기)
|
// 2. 품의서 대상 품목 조회 (소재/가공 각각)
|
||||||
List<Map> targetParts = null;
|
List<Map> materialTargetParts = null; // 소재 품의서 대상
|
||||||
List<Map> excludedParts = null; // 공급업체 미입력으로 제외된 품목
|
List<Map> processingTargetParts = null; // 가공 품의서 대상
|
||||||
|
List<Map> materialExcludedParts = null; // 소재 제외 (공급업체 미입력)
|
||||||
|
List<Map> processingExcludedParts = null; // 가공 제외 (가공업체 미입력)
|
||||||
|
|
||||||
if(!mbomHeaderObjid.isEmpty()) {
|
if(!mbomHeaderObjid.isEmpty()) {
|
||||||
// M-BOM 기반 -> MBOM_DETAIL에서 조회
|
// M-BOM 기반 -> MBOM_DETAIL에서 조회
|
||||||
Map mbomParam = new HashMap();
|
Map mbomParam = new HashMap();
|
||||||
mbomParam.put("MBOM_HEADER_OBJID", mbomHeaderObjid);
|
mbomParam.put("MBOM_HEADER_OBJID", mbomHeaderObjid);
|
||||||
targetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromMBom", mbomParam);
|
|
||||||
excludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromMBom", mbomParam);
|
// 소재 품의서 대상
|
||||||
|
materialTargetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromMBom", mbomParam);
|
||||||
|
materialExcludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromMBom", mbomParam);
|
||||||
|
|
||||||
|
// 가공 품의서 대상
|
||||||
|
processingTargetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromMBomProcessing", mbomParam);
|
||||||
|
processingExcludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromMBomProcessing", mbomParam);
|
||||||
} else {
|
} else {
|
||||||
// 수동 작성 -> SALES_REQUEST_PART에서 조회
|
// 수동 작성 -> SALES_REQUEST_PART에서 조회
|
||||||
targetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromManual", paramMap);
|
// 소재 품의서 대상
|
||||||
excludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromManual", paramMap);
|
materialTargetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromManual", paramMap);
|
||||||
|
materialExcludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromManual", paramMap);
|
||||||
|
|
||||||
|
// 가공 품의서 대상
|
||||||
|
processingTargetParts = sqlSession.selectList("salesMng.getProposalTargetPartsFromManualProcessing", paramMap);
|
||||||
|
processingExcludedParts = sqlSession.selectList("salesMng.getProposalExcludedPartsFromManualProcessing", paramMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
targetParts = CommonUtils.keyChangeUpperList(targetParts);
|
materialTargetParts = CommonUtils.keyChangeUpperList(materialTargetParts);
|
||||||
excludedParts = CommonUtils.keyChangeUpperList(excludedParts);
|
processingTargetParts = CommonUtils.keyChangeUpperList(processingTargetParts);
|
||||||
|
materialExcludedParts = CommonUtils.keyChangeUpperList(materialExcludedParts);
|
||||||
|
processingExcludedParts = CommonUtils.keyChangeUpperList(processingExcludedParts);
|
||||||
|
|
||||||
// 3. 결과 반환
|
// 3. 기존 호환성을 위해 targetParts, excludedParts도 유지 (소재+가공 합침)
|
||||||
|
List<Map> targetParts = new ArrayList<Map>();
|
||||||
|
targetParts.addAll(materialTargetParts);
|
||||||
|
targetParts.addAll(processingTargetParts);
|
||||||
|
|
||||||
|
List<Map> excludedParts = new ArrayList<Map>();
|
||||||
|
excludedParts.addAll(materialExcludedParts);
|
||||||
|
excludedParts.addAll(processingExcludedParts);
|
||||||
|
|
||||||
|
// 4. 결과 반환
|
||||||
result.put("targetParts", targetParts);
|
result.put("targetParts", targetParts);
|
||||||
result.put("excludedParts", excludedParts); // 공급업체 미입력 품목
|
result.put("excludedParts", excludedParts);
|
||||||
|
result.put("materialTargetParts", materialTargetParts);
|
||||||
|
result.put("processingTargetParts", processingTargetParts);
|
||||||
|
result.put("materialExcludedParts", materialExcludedParts);
|
||||||
|
result.put("processingExcludedParts", processingExcludedParts);
|
||||||
result.put("mbomHeaderObjid", mbomHeaderObjid);
|
result.put("mbomHeaderObjid", mbomHeaderObjid);
|
||||||
result.put("purchaseRequestInfo", purchaseRequestInfo);
|
result.put("purchaseRequestInfo", purchaseRequestInfo);
|
||||||
|
|
||||||
@@ -1996,7 +2024,7 @@ public class SalesMngService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 품의서 생성
|
* 품의서 생성 (소재/가공 각각 별도 품의서 생성)
|
||||||
* @param request
|
* @param request
|
||||||
* @param paramMap
|
* @param paramMap
|
||||||
* @return
|
* @return
|
||||||
@@ -2021,22 +2049,79 @@ public class SalesMngService {
|
|||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. 품의서 대상 품목 조회 (공통 메서드 사용)
|
// 1. 품의서 대상 품목 조회 (소재/가공 분리)
|
||||||
Map partsInfo = getProposalTargetPartsWithInfo(sqlSession, salesRequestMasterObjid);
|
Map partsInfo = getProposalTargetPartsWithInfo(sqlSession, salesRequestMasterObjid);
|
||||||
List<Map> targetParts = (List<Map>)partsInfo.get("targetParts");
|
List<Map> materialTargetParts = (List<Map>)partsInfo.get("materialTargetParts");
|
||||||
|
List<Map> processingTargetParts = (List<Map>)partsInfo.get("processingTargetParts");
|
||||||
String mbomHeaderObjid = (String)partsInfo.get("mbomHeaderObjid");
|
String mbomHeaderObjid = (String)partsInfo.get("mbomHeaderObjid");
|
||||||
Map purchaseRequestInfo = (Map)partsInfo.get("purchaseRequestInfo");
|
Map purchaseRequestInfo = (Map)partsInfo.get("purchaseRequestInfo");
|
||||||
|
|
||||||
if(targetParts == null || targetParts.isEmpty()) {
|
boolean hasMaterialParts = materialTargetParts != null && !materialTargetParts.isEmpty();
|
||||||
|
boolean hasProcessingParts = processingTargetParts != null && !processingTargetParts.isEmpty();
|
||||||
|
|
||||||
|
if(!hasMaterialParts && !hasProcessingParts) {
|
||||||
resultMap.put("resultFlag", "F");
|
resultMap.put("resultFlag", "F");
|
||||||
resultMap.put("message", "품의서 생성 대상 품목이 없습니다. (단가가 입력되고 품의서가 생성되지 않은 품목만 가능)");
|
resultMap.put("message", "품의서 생성 대상 품목이 없습니다.\n(소재단가+공급업체 또는 가공단가+가공업체가 입력되고 품의서가 생성되지 않은 품목만 가능)");
|
||||||
return resultMap;
|
return resultMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 품의서 번호 생성
|
List<String> createdProposalNos = new ArrayList<String>();
|
||||||
|
|
||||||
|
// 2. 소재 품의서 생성
|
||||||
|
if(hasMaterialParts) {
|
||||||
|
String materialProposalNo = createSingleProposal(sqlSession, userId, purchaseRequestInfo,
|
||||||
|
materialTargetParts, mbomHeaderObjid, "MATERIAL");
|
||||||
|
createdProposalNos.add("소재: " + materialProposalNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 가공 품의서 생성
|
||||||
|
if(hasProcessingParts) {
|
||||||
|
String processingProposalNo = createSingleProposal(sqlSession, userId, purchaseRequestInfo,
|
||||||
|
processingTargetParts, mbomHeaderObjid, "PROCESSING");
|
||||||
|
createdProposalNos.add("가공: " + processingProposalNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
sqlSession.commit();
|
||||||
|
|
||||||
|
// Java 7 호환: String.join 대신 StringBuilder 사용
|
||||||
|
StringBuilder messageBuilder = new StringBuilder("품의서가 생성되었습니다.");
|
||||||
|
for(String proposalNo : createdProposalNos) {
|
||||||
|
messageBuilder.append("\n").append(proposalNo);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultMap.put("resultFlag", "S");
|
||||||
|
resultMap.put("message", messageBuilder.toString());
|
||||||
|
resultMap.put("createdCount", createdProposalNos.size());
|
||||||
|
|
||||||
|
} catch(Exception e) {
|
||||||
|
if(sqlSession != null) sqlSession.rollback();
|
||||||
|
e.printStackTrace();
|
||||||
|
resultMap.put("resultFlag", "F");
|
||||||
|
resultMap.put("message", "품의서 생성 중 오류가 발생했습니다: " + e.getMessage());
|
||||||
|
} finally {
|
||||||
|
if(sqlSession != null) sqlSession.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return resultMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 단일 품의서 생성 (소재 또는 가공)
|
||||||
|
* @param sqlSession
|
||||||
|
* @param userId
|
||||||
|
* @param purchaseRequestInfo
|
||||||
|
* @param targetParts
|
||||||
|
* @param mbomHeaderObjid
|
||||||
|
* @param proposalType MATERIAL(소재) 또는 PROCESSING(가공)
|
||||||
|
* @return 생성된 품의서 번호
|
||||||
|
*/
|
||||||
|
private String createSingleProposal(SqlSession sqlSession, String userId, Map purchaseRequestInfo,
|
||||||
|
List<Map> targetParts, String mbomHeaderObjid, String proposalType) throws Exception {
|
||||||
|
|
||||||
|
// 1. 품의서 번호 생성
|
||||||
String proposalNo = (String)sqlSession.selectOne("salesMng.getNextProposalNo");
|
String proposalNo = (String)sqlSession.selectOne("salesMng.getNextProposalNo");
|
||||||
|
|
||||||
// 3. 품의서 마스터 생성
|
// 2. 품의서 마스터 생성
|
||||||
Map proposalMaster = new HashMap();
|
Map proposalMaster = new HashMap();
|
||||||
proposalMaster.put("OBJID", CommonUtils.createObjId());
|
proposalMaster.put("OBJID", CommonUtils.createObjId());
|
||||||
proposalMaster.put("REQUEST_MNG_NO", proposalNo);
|
proposalMaster.put("REQUEST_MNG_NO", proposalNo);
|
||||||
@@ -2050,10 +2135,11 @@ public class SalesMngService {
|
|||||||
proposalMaster.put("PAID_TYPE", purchaseRequestInfo.get("PAID_TYPE"));
|
proposalMaster.put("PAID_TYPE", purchaseRequestInfo.get("PAID_TYPE"));
|
||||||
proposalMaster.put("REQUEST_USER_ID", userId);
|
proposalMaster.put("REQUEST_USER_ID", userId);
|
||||||
proposalMaster.put("WRITER", userId);
|
proposalMaster.put("WRITER", userId);
|
||||||
|
proposalMaster.put("PROPOSAL_TYPE", proposalType); // 소재/가공 구분
|
||||||
|
|
||||||
sqlSession.insert("salesMng.insertProposal", proposalMaster);
|
sqlSession.insert("salesMng.insertProposal", proposalMaster);
|
||||||
|
|
||||||
// 4. 품의서용 SALES_REQUEST_PART 생성 (대상 품목 복사)
|
// 3. 품의서용 SALES_REQUEST_PART 생성 (대상 품목 복사)
|
||||||
String proposalMasterObjid = (String)proposalMaster.get("OBJID");
|
String proposalMasterObjid = (String)proposalMaster.get("OBJID");
|
||||||
List<String> sourceObjids = new ArrayList<String>();
|
List<String> sourceObjids = new ArrayList<String>();
|
||||||
|
|
||||||
@@ -2066,43 +2152,46 @@ public class SalesMngService {
|
|||||||
partParam.put("PROPOSAL_MASTER_OBJID", proposalMasterObjid);
|
partParam.put("PROPOSAL_MASTER_OBJID", proposalMasterObjid);
|
||||||
partParam.put("SOURCE_OBJID", sourceObjid);
|
partParam.put("SOURCE_OBJID", sourceObjid);
|
||||||
partParam.put("WRITER", userId);
|
partParam.put("WRITER", userId);
|
||||||
|
partParam.put("PROPOSAL_TYPE", proposalType);
|
||||||
|
|
||||||
// M-BOM 기반 여부에 따라 INSERT 쿼리 분기
|
// M-BOM 기반 여부 + 소재/가공 구분에 따라 INSERT 쿼리 분기
|
||||||
if(!mbomHeaderObjid.isEmpty()) {
|
if(!mbomHeaderObjid.isEmpty()) {
|
||||||
// M-BOM 기반 -> MBOM_DETAIL에서 복사
|
// M-BOM 기반
|
||||||
sqlSession.insert("salesMng.insertProposalPartFromMBom", partParam);
|
if("PROCESSING".equals(proposalType)) {
|
||||||
|
sqlSession.insert("salesMng.insertProposalPartFromMBomProcessing", partParam);
|
||||||
|
} else {
|
||||||
|
sqlSession.insert("salesMng.insertProposalPartFromMBom", partParam);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 수동 작성
|
||||||
|
if("PROCESSING".equals(proposalType)) {
|
||||||
|
sqlSession.insert("salesMng.insertProposalPartFromManualProcessing", partParam);
|
||||||
} else {
|
} else {
|
||||||
// 수동 작성 -> SALES_REQUEST_PART에서 복사
|
|
||||||
sqlSession.insert("salesMng.insertProposalPartFromManual", partParam);
|
sqlSession.insert("salesMng.insertProposalPartFromManual", partParam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 5. 원본 데이터의 PROPOSAL_DATE 업데이트
|
// 4. 원본 데이터의 PROPOSAL_DATE 업데이트
|
||||||
Map updateParam = new HashMap();
|
Map updateParam = new HashMap();
|
||||||
updateParam.put("PART_OBJIDS", sourceObjids);
|
updateParam.put("PART_OBJIDS", sourceObjids);
|
||||||
|
|
||||||
// M-BOM 기반 여부에 따라 업데이트 쿼리 분기
|
// M-BOM 기반 여부 + 소재/가공 구분에 따라 업데이트 쿼리 분기
|
||||||
String updateQuery = mbomHeaderObjid.isEmpty()
|
String updateQuery;
|
||||||
? "salesMng.updateProposalDateForManualParts" // 수동 작성
|
if(mbomHeaderObjid.isEmpty()) {
|
||||||
: "salesMng.updateProposalDateForMBomParts"; // M-BOM 기반
|
// 수동 작성
|
||||||
|
updateQuery = "PROCESSING".equals(proposalType)
|
||||||
|
? "salesMng.updateProcessingProposalDateForManualParts"
|
||||||
|
: "salesMng.updateProposalDateForManualParts";
|
||||||
|
} else {
|
||||||
|
// M-BOM 기반
|
||||||
|
updateQuery = "PROCESSING".equals(proposalType)
|
||||||
|
? "salesMng.updateProcessingProposalDateForMBomParts"
|
||||||
|
: "salesMng.updateProposalDateForMBomParts";
|
||||||
|
}
|
||||||
|
|
||||||
sqlSession.update(updateQuery, updateParam);
|
sqlSession.update(updateQuery, updateParam);
|
||||||
sqlSession.commit();
|
|
||||||
|
|
||||||
resultMap.put("resultFlag", "S");
|
return proposalNo;
|
||||||
resultMap.put("message", "품의서가 생성되었습니다. (품의서 번호: " + proposalNo + ")");
|
|
||||||
resultMap.put("PROPOSAL_OBJID", proposalMaster.get("OBJID"));
|
|
||||||
resultMap.put("PROPOSAL_NO", proposalNo);
|
|
||||||
|
|
||||||
} catch(Exception e) {
|
|
||||||
if(sqlSession != null) sqlSession.rollback();
|
|
||||||
e.printStackTrace();
|
|
||||||
resultMap.put("resultFlag", "F");
|
|
||||||
resultMap.put("message", "품의서 생성 중 오류가 발생했습니다: " + e.getMessage());
|
|
||||||
} finally {
|
|
||||||
if(sqlSession != null) sqlSession.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
return resultMap;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user