Merge pull request 'V2025111901' (#80) from V2025111901 into main
Reviewed-on: #80
This commit was merged in pull request #80.
This commit is contained in:
@@ -123,7 +123,7 @@ function fn_partMngHisDetail(objId){
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2>
|
||||
<span>제품관리_설계변경 리스트</span>
|
||||
<span>개발관리_설계변경 리스트</span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="조회" id="btnSearch">
|
||||
|
||||
@@ -484,7 +484,7 @@ String connector = person.getUserId();
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2>
|
||||
<span>제품관리_PART 조회</span>
|
||||
<span>개발관리_PART 조회</span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<!-- <input type="button" value="파일연결" class="plm_btns" id="btnConnectFile"> -->
|
||||
|
||||
@@ -585,7 +585,7 @@ ui-jqgrid tr.jqgrow td {
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2>
|
||||
<span>제품관리_PART 등록</span>
|
||||
<span>개발관리_PART 등록</span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="확정" class="plm_btns" id="btnDeploy">
|
||||
|
||||
@@ -799,7 +799,7 @@ function fn_excelExport(pGridObj,pFileName){
|
||||
<div class=""> <!-- content-box-s -->
|
||||
<div class=plm_menu_name_gdnsi>
|
||||
<h2>
|
||||
<span>제품관리_BOM 조회</span>
|
||||
<span>개발관리_BOM 조회</span>
|
||||
<c:if test="${!empty param.searchType}">
|
||||
<span style="font-size: 14px; color: #666; margin-left: 10px;">
|
||||
(${param.searchType eq 'descending' ? '역전개' : '정전개'})
|
||||
|
||||
@@ -76,6 +76,8 @@ var columns = [
|
||||
{title:'OBJID', field:'OBJID', visible: false},
|
||||
{title:'CONTRACT_OBJID', field:'CONTRACT_OBJID', visible: false},
|
||||
{title:'BOM_REPORT_OBJID', field:'BOM_REPORT_OBJID', visible: false},
|
||||
{title:'MBOM_HEADER_OBJID', field:'MBOM_HEADER_OBJID', visible: false},
|
||||
{title:'PURCHASE_LIST_OBJID', field:'PURCHASE_LIST_OBJID', visible: false},
|
||||
|
||||
// 1. 체크박스
|
||||
{
|
||||
@@ -479,7 +481,7 @@ function fn_checkAssignmentAndOpenMbom(projectObjId) {
|
||||
});
|
||||
}
|
||||
|
||||
// 구매리스트 생성 팝업 열기
|
||||
// 구매리스트 생성
|
||||
function fn_openPurchaseListPopup() {
|
||||
// 체크된 행 가져오기
|
||||
var checkedRows = [];
|
||||
@@ -514,38 +516,82 @@ function fn_openPurchaseListPopup() {
|
||||
|
||||
// 선택된 프로젝트 정보
|
||||
var selectedRow = checkedRows[0];
|
||||
var projectObjId = selectedRow.OBJID;
|
||||
var projectNo = selectedRow.PROJECT_NO;
|
||||
var projectObjId = selectedRow.OBJID; // PROJECT_MGMT.OBJID
|
||||
var projectNo = selectedRow.PROJECT_NO; // 프로젝트 번호 (문자열)
|
||||
var mbomHeaderObjid = selectedRow.MBOM_HEADER_OBJID; // MBOM_HEADER.OBJID
|
||||
var purchaseListObjid = selectedRow.PURCHASE_LIST_OBJID; // 기존 구매리스트 OBJID
|
||||
|
||||
// 구매요청서 마스터 생성 후 팝업 열기
|
||||
$.ajax({
|
||||
url: "/salesMng/createPurchaseListFromMBom.do",
|
||||
method: "POST",
|
||||
data: {
|
||||
PROJECT_MGMT_OBJID: projectObjId,
|
||||
PROJECT_NO: projectNo
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result) {
|
||||
if(result.resultFlag === "S") {
|
||||
var salesRequestMasterObjid = result.SALES_REQUEST_MASTER_OBJID;
|
||||
// 구매리스트 팝업 열기
|
||||
var url = "/salesMng/purchaseListFormPopUp.do?SALES_REQUEST_MASTER_OBJID=" + salesRequestMasterObjid
|
||||
+ "&PROJECT_MGMT_OBJID=" + projectObjId;
|
||||
window.open(url, "purchaseListPopup", "width=1400,height=800,scrollbars=yes,resizable=yes");
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: result.message || '구매리스트 생성 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '서버 통신 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
if(!projectObjId || projectObjId === 'null' || projectObjId === '') {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '프로젝트 OBJID를 찾을 수 없습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if(!mbomHeaderObjid || mbomHeaderObjid === 'null' || mbomHeaderObjid === '') {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: 'M-BOM이 생성되지 않았습니다.\n먼저 M-BOM을 생성해주세요.',
|
||||
icon: 'warning'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 이미 생성된 구매리스트가 있는지 확인
|
||||
if(purchaseListObjid && purchaseListObjid !== 'null' && purchaseListObjid !== '') {
|
||||
Swal.fire({
|
||||
title: '알림',
|
||||
text: '이미 생성된 구매리스트가 있습니다.\n구매리스트관리 화면에서 확인하세요.',
|
||||
icon: 'info'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 생성 확인
|
||||
Swal.fire({
|
||||
title: '구매리스트 생성',
|
||||
text: '구매리스트를 생성하시겠습니까?',
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '예',
|
||||
cancelButtonText: '아니오'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
// 구매요청서 마스터 생성
|
||||
$.ajax({
|
||||
url: "/salesMng/createPurchaseListFromMBom.do",
|
||||
method: "POST",
|
||||
data: {
|
||||
PROJECT_MGMT_OBJID: projectObjId, // PROJECT_MGMT.OBJID 전달
|
||||
PROJECT_NO: projectNo, // 프로젝트 번호 전달
|
||||
MBOM_HEADER_OBJID: mbomHeaderObjid // MBOM_HEADER.OBJID 전달
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result) {
|
||||
if(result.resultFlag === "S") {
|
||||
// 성공 알림
|
||||
Swal.fire({
|
||||
title: '생성 완료',
|
||||
text: '구매리스트가 생성되었습니다.\n구매리스트관리 화면에서 확인하세요.',
|
||||
icon: 'success'
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: result.message || '구매리스트 생성 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '서버 통신 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -45,6 +45,9 @@ var _tabulGrid;
|
||||
// 프로젝트 수주수량 (최상위 프레임에서 가져오기)
|
||||
var projectQuantity = 1; // 기본값
|
||||
|
||||
// 소재 목록 전역 변수
|
||||
var materialList = [];
|
||||
|
||||
$(function(){
|
||||
// 최상위 프레임(mBomPopupHeaderFs.jsp)에서 프로젝트 수주수량 가져오기
|
||||
try {
|
||||
@@ -58,10 +61,37 @@ $(function(){
|
||||
console.log("프로젝트 수주수량 가져오기 실패:", e);
|
||||
}
|
||||
|
||||
// 소재 목록 로드
|
||||
fn_loadMaterialList();
|
||||
|
||||
// Tabulator 초기화
|
||||
fn_initGrid();
|
||||
});
|
||||
|
||||
// 소재 목록 로드
|
||||
function fn_loadMaterialList() {
|
||||
$.ajax({
|
||||
url: '/admin/getMaterialList.do',
|
||||
method: 'POST',
|
||||
async: false,
|
||||
success: function(response) {
|
||||
if(response && response.list) {
|
||||
// 중복 제거하여 소재 코드만 추출
|
||||
var uniqueMaterials = {};
|
||||
response.list.forEach(function(item) {
|
||||
uniqueMaterials[item.MATERIAL_CODE] = true;
|
||||
});
|
||||
materialList = Object.keys(uniqueMaterials);
|
||||
console.log("소재 목록 로드 완료:", materialList);
|
||||
}
|
||||
},
|
||||
error: function() {
|
||||
console.error("소재 목록 로드 실패");
|
||||
materialList = [];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Tabulator 그리드 초기화
|
||||
function fn_initGrid() {
|
||||
var maxLevel = ${empty MAXLEV ? 1 : MAXLEV};
|
||||
@@ -312,26 +342,7 @@ function fn_initGrid() {
|
||||
field: 'RAW_MATERIAL',
|
||||
editor: 'list',
|
||||
editorParams: {
|
||||
values: ['SM45C', 'STS304', 'STS316', 'AL6061', 'AL7075'] // TODO: 실제 소재 목록으로 교체
|
||||
},
|
||||
editable: function(cell) {
|
||||
return cell.getRow().getData().SUPPLY_TYPE === '사급';
|
||||
},
|
||||
formatter: function(cell) {
|
||||
var data = cell.getRow().getData();
|
||||
if(data.SUPPLY_TYPE === '자급') return '-';
|
||||
return cell.getValue() || '';
|
||||
}
|
||||
},
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'left',
|
||||
width: 100,
|
||||
title: '사이즈',
|
||||
field: 'SIZE',
|
||||
editor: 'list',
|
||||
editorParams: {
|
||||
values: ['Φ10', 'Φ20', 'Φ30', '10x10', '20x20'] // TODO: 실제 사이즈 목록으로 교체
|
||||
values: materialList // 로드된 소재 목록 사용
|
||||
},
|
||||
editable: function(cell) {
|
||||
return cell.getRow().getData().SUPPLY_TYPE === '사급';
|
||||
@@ -342,12 +353,77 @@ function fn_initGrid() {
|
||||
return cell.getValue() || '';
|
||||
},
|
||||
cellEdited: function(cell) {
|
||||
// 소재, 사이즈 선택 시 소재품번 자동 생성
|
||||
// 소재 선택 시 사이즈 초기화
|
||||
var row = cell.getRow();
|
||||
row.update({
|
||||
SIZE: '',
|
||||
RAW_MATERIAL_NO: ''
|
||||
});
|
||||
}
|
||||
},
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'left',
|
||||
width: 100,
|
||||
title: '사이즈',
|
||||
field: 'SIZE',
|
||||
editor: 'list',
|
||||
editorParams: function(cell) {
|
||||
// 선택된 소재에 따라 동적으로 사이즈 목록 로드
|
||||
var data = cell.getRow().getData();
|
||||
var materialCode = data.RAW_MATERIAL;
|
||||
|
||||
if(!materialCode) {
|
||||
return {values: []};
|
||||
}
|
||||
|
||||
// 서버에서 해당 소재의 사이즈 목록 가져오기
|
||||
var sizes = [];
|
||||
$.ajax({
|
||||
url: '/admin/getMaterialSizes.do',
|
||||
method: 'POST',
|
||||
data: {materialCode: materialCode},
|
||||
async: false,
|
||||
success: function(response) {
|
||||
if(response && response.list) {
|
||||
sizes = response.list.map(function(item) {
|
||||
return item.SIZE_SPEC;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return {values: sizes};
|
||||
},
|
||||
editable: function(cell) {
|
||||
var data = cell.getRow().getData();
|
||||
return data.SUPPLY_TYPE === '사급' && data.RAW_MATERIAL;
|
||||
},
|
||||
formatter: function(cell) {
|
||||
var data = cell.getRow().getData();
|
||||
if(data.SUPPLY_TYPE === '자급') return '-';
|
||||
return cell.getValue() || '';
|
||||
},
|
||||
cellEdited: function(cell) {
|
||||
// 사이즈 선택 시 소재품번 자동 조회
|
||||
var row = cell.getRow();
|
||||
var data = row.getData();
|
||||
|
||||
if(data.RAW_MATERIAL && data.SIZE) {
|
||||
var materialNo = data.RAW_MATERIAL + '-' + data.SIZE;
|
||||
row.update({RAW_MATERIAL_NO: materialNo});
|
||||
// 서버에서 소재품번 조회
|
||||
$.ajax({
|
||||
url: '/admin/getMaterialPartNo.do',
|
||||
method: 'POST',
|
||||
data: {
|
||||
materialCode: data.RAW_MATERIAL,
|
||||
sizeSpec: data.SIZE
|
||||
},
|
||||
success: function(response) {
|
||||
if(response && response.MATERIAL_PART_NO) {
|
||||
row.update({RAW_MATERIAL_NO: response.MATERIAL_PART_NO});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -471,7 +547,7 @@ function fn_initGrid() {
|
||||
hozAlign: 'left',
|
||||
width: 150,
|
||||
title: '공급업체',
|
||||
field: 'VENDOR',
|
||||
field: 'VENDOR_NAME',
|
||||
editor: false, // 구매쪽에서 입력
|
||||
formatter: function(cell) {
|
||||
return cell.getValue() || '-';
|
||||
@@ -815,7 +891,7 @@ function getMbomTreeData() {
|
||||
shortageQty: toNumber(row.SHORTAGE_QTY),
|
||||
|
||||
// 구매 정보
|
||||
vendor: row.VENDOR,
|
||||
vendor: row.VENDOR_NAME,
|
||||
unitPrice: toNumber(row.UNIT_PRICE),
|
||||
totalPrice: toNumber(row.TOTAL_PRICE),
|
||||
currency: row.CURRENCY,
|
||||
|
||||
@@ -39,6 +39,7 @@ body, html {
|
||||
padding: 15px 20px;
|
||||
background: #f5f5f5;
|
||||
border-bottom: 2px solid #ddd;
|
||||
text-align: right;
|
||||
}
|
||||
.header h3 {
|
||||
margin: 0 0 10px 0;
|
||||
@@ -60,27 +61,22 @@ body, html {
|
||||
padding: 20px;
|
||||
overflow: auto;
|
||||
}
|
||||
.footer {
|
||||
padding: 15px 20px;
|
||||
background: #f5f5f5;
|
||||
border-top: 1px solid #ddd;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header">
|
||||
<input type="button" value="저장" class="plm_btns" onclick="fn_save();" style="margin-right: 5px;">
|
||||
<input type="button" value="닫기" class="plm_btns" onclick="window.close();">
|
||||
<div style="float: right;">
|
||||
<input type="button" value="저장" class="plm_btns" onclick="fn_save();" style="margin-right: 5px;">
|
||||
<input type="button" value="닫기" class="plm_btns" onclick="window.close();" style="margin-right: 5px;">
|
||||
</div>
|
||||
<div style="clear: both;"></div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
<div id="purchaseListTable"></div>
|
||||
</div>
|
||||
|
||||
<div class="footer">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
@@ -163,9 +159,9 @@ function fn_loadInitialData(){
|
||||
var hasMbomHeader = mbomHeaderObjid && mbomHeaderObjid !== "" && mbomHeaderObjid !== "null";
|
||||
var hasMaster = salesRequestMasterObjid && salesRequestMasterObjid !== "" && salesRequestMasterObjid !== "null";
|
||||
|
||||
// M-BOM이 있는지 확인 (MBOM_HEADER_OBJID가 있으면 M-BOM 존재)
|
||||
if(hasProject || hasMbomHeader){
|
||||
logDebug("purchaseListFormPopUp :: loading MBOM first");
|
||||
// M-BOM에서 생성된 경우만 M-BOM 데이터를 로드 (MBOM_HEADER_OBJID가 있어야 함)
|
||||
if(hasMbomHeader){
|
||||
logDebug("purchaseListFormPopUp :: M-BOM에서 생성된 구매리스트 - MBOM 로드");
|
||||
fn_loadFromMBom(function(mbomList){
|
||||
if(hasMaster){
|
||||
// M-BOM 데이터가 있으면 merge, 없으면 SALES_REQUEST_PART만 로드
|
||||
@@ -175,10 +171,10 @@ function fn_loadInitialData(){
|
||||
}
|
||||
});
|
||||
} else if(hasMaster){
|
||||
logDebug("purchaseListFormPopUp :: only saved purchase data available");
|
||||
logDebug("purchaseListFormPopUp :: 수동 작성된 구매리스트 - SALES_REQUEST_PART만 로드");
|
||||
fn_loadPurchaseList(false);
|
||||
} else {
|
||||
logDebug("purchaseListFormPopUp :: no project or master id provided");
|
||||
logDebug("purchaseListFormPopUp :: no data to load");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -190,6 +186,7 @@ function fn_initGrid() {
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'center',
|
||||
width: 40,
|
||||
frozen: true,
|
||||
title: '<input type="checkbox" id="checkAll">',
|
||||
field: 'CHK',
|
||||
formatter: function(cell) {
|
||||
@@ -204,32 +201,35 @@ function fn_initGrid() {
|
||||
width: 50,
|
||||
title: 'No',
|
||||
field: 'ROW_NUM',
|
||||
formatter: "rownum"
|
||||
formatter: "rownum",
|
||||
frozen: true
|
||||
},
|
||||
// 2-1. 구분 (M-BOM / 수동)
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'center',
|
||||
width: 70,
|
||||
title: '구분',
|
||||
field: 'DATA_SOURCE',
|
||||
formatter: function(cell) {
|
||||
var value = cell.getValue();
|
||||
if(value === 'MBOM') {
|
||||
return '<span style="color: #2196F3; font-weight: bold;">M-BOM</span>';
|
||||
} else if(value === 'SRP') {
|
||||
return '<span style="color: #4CAF50; font-weight: bold;">수동</span>';
|
||||
}
|
||||
return value || '';
|
||||
}
|
||||
},
|
||||
// {
|
||||
// headerHozAlign: 'center',
|
||||
// hozAlign: 'center',
|
||||
// width: 70,
|
||||
// title: '구분',
|
||||
// frozen: true,
|
||||
// field: 'DATA_SOURCE',
|
||||
// formatter: function(cell) {
|
||||
// var value = cell.getValue();
|
||||
// if(value === 'MBOM') {
|
||||
// return '<span style="color: #2196F3; font-weight: bold;">M-BOM</span>';
|
||||
// } else if(value === 'SRP') {
|
||||
// return '<span style="color: #4CAF50; font-weight: bold;">수동</span>';
|
||||
// }
|
||||
// return value || '';
|
||||
// }
|
||||
// },
|
||||
// 3. 품번
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'left',
|
||||
widthGrow: 2,
|
||||
title: '품번',
|
||||
field: 'PART_NO'
|
||||
field: 'PART_NO',
|
||||
frozen: true
|
||||
},
|
||||
// 4. 품명
|
||||
{
|
||||
@@ -237,7 +237,8 @@ function fn_initGrid() {
|
||||
hozAlign: 'left',
|
||||
widthGrow: 3,
|
||||
title: '품명',
|
||||
field: 'PART_NAME'
|
||||
field: 'PART_NAME',
|
||||
frozen: true
|
||||
},
|
||||
// 5. 수량
|
||||
{
|
||||
@@ -448,32 +449,40 @@ function fn_initGrid() {
|
||||
field: 'USE_YN',
|
||||
editor: 'list',
|
||||
editorParams: {
|
||||
values: ['Y', 'N']
|
||||
values: ['사용', '미사용']
|
||||
},
|
||||
mutator: function(value, data) {
|
||||
// DB 값 변환: Y/N → 사용/미사용
|
||||
if(value === 'Y' || value === '사용') return '사용';
|
||||
if(value === 'N' || value === '미사용') return '미사용';
|
||||
// 값이 없으면 기본값 '사용'
|
||||
return '사용';
|
||||
}
|
||||
},
|
||||
// 28. 정미수량 (편집 가능) - 소재소요량 × 제작수량, 소수점 올림
|
||||
// 28. 정미수량 (편집 불가) - 소재소요량 × 제작수량
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'right',
|
||||
width: 100,
|
||||
title: '정미수량',
|
||||
field: 'NET_QTY',
|
||||
editor: 'number',
|
||||
mutator: function(value, data) {
|
||||
// 값이 이미 설정되어 있으면 그대로 사용
|
||||
if(value && value > 0) return value;
|
||||
// 소재소요량 × 제작수량, 소수점 올림
|
||||
// 저장된 값이 있으면 우선 사용
|
||||
if(value !== null && value !== undefined && value !== '' && parseFloat(value) > 0) {
|
||||
return parseFloat(value);
|
||||
}
|
||||
// 계산: 소재소요량 × 제작수량 (올림 없음)
|
||||
var requiredQty = parseFloat(data.REQUIRED_QTY) || 0;
|
||||
var productionQty = parseFloat(data.PRODUCTION_QTY) || 0;
|
||||
var calculated = requiredQty * productionQty;
|
||||
return calculated > 0 ? Math.ceil(calculated) : 0;
|
||||
return calculated > 0 ? calculated : 0;
|
||||
},
|
||||
formatter: function(cell) {
|
||||
var value = cell.getValue();
|
||||
return value ? Number(value).toLocaleString() : '0';
|
||||
}
|
||||
},
|
||||
// 29. 발주수량
|
||||
// 29. 발주수량 (편집 가능) - 정미수량 올림
|
||||
{
|
||||
headerHozAlign: 'center',
|
||||
hozAlign: 'right',
|
||||
@@ -481,6 +490,15 @@ function fn_initGrid() {
|
||||
title: '발주수량',
|
||||
field: 'PO_QTY',
|
||||
editor: 'number',
|
||||
mutator: function(value, data) {
|
||||
// 저장된 값이 있으면 우선 사용
|
||||
if(value !== null && value !== undefined && value !== '' && parseFloat(value) > 0) {
|
||||
return parseFloat(value);
|
||||
}
|
||||
// 계산: 정미수량 올림
|
||||
var netQty = parseFloat(data.NET_QTY) || 0;
|
||||
return netQty > 0 ? Math.ceil(netQty) : 0;
|
||||
},
|
||||
formatter: function(cell) {
|
||||
var value = cell.getValue();
|
||||
return value ? Number(value).toLocaleString() : '0';
|
||||
@@ -608,20 +626,21 @@ function fn_loadPurchaseList(mergeMode) {
|
||||
|
||||
// M-BOM에서 구매리스트 생성
|
||||
function fn_loadFromMBom(callback) {
|
||||
// console.log("=== fn_loadFromMBom 호출 ===");
|
||||
// console.log("PROJECT_MGMT_OBJID:", projectMgmtObjid);
|
||||
// console.log("BOM_REPORT_OBJID:", bomReportObjid);
|
||||
// console.log("MBOM_HEADER_OBJID:", mbomHeaderObjid);
|
||||
logDebug("=== fn_loadFromMBom 호출 ===");
|
||||
logDebug("MBOM_HEADER_OBJID:", mbomHeaderObjid);
|
||||
|
||||
// MBOM_HEADER_OBJID가 있으면 우선 사용 (M-BOM 관리 화면과 동일한 방식)
|
||||
var mbomObjIdToUse = mbomHeaderObjid || projectMgmtObjid;
|
||||
// console.log("사용할 MBOM OBJID:", mbomObjIdToUse);
|
||||
// MBOM_HEADER_OBJID가 없으면 M-BOM 데이터를 로드하지 않음
|
||||
if(!mbomHeaderObjid || mbomHeaderObjid === '' || mbomHeaderObjid === 'null') {
|
||||
logDebug("MBOM_HEADER_OBJID가 없어서 M-BOM 로드 안 함");
|
||||
if(callback) callback([]);
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/salesMng/getMBomForPurchaseList.do",
|
||||
method: 'post',
|
||||
data: {
|
||||
PROJECT_MGMT_OBJID: mbomObjIdToUse,
|
||||
PROJECT_MGMT_OBJID: mbomHeaderObjid, // MBOM_HEADER_OBJID를 직접 사용
|
||||
bomReportObjId: bomReportObjid
|
||||
},
|
||||
dataType: 'json',
|
||||
@@ -712,6 +731,12 @@ function fn_save() {
|
||||
if(!item.PROPOSAL_DATE) {
|
||||
item.PROPOSAL_DATE = proposalDate;
|
||||
}
|
||||
// 사용여부 변환: 사용/미사용 → Y/N
|
||||
if(item.USE_YN === '사용') {
|
||||
item.USE_YN = 'Y';
|
||||
} else if(item.USE_YN === '미사용') {
|
||||
item.USE_YN = 'N';
|
||||
}
|
||||
});
|
||||
|
||||
Swal.fire({
|
||||
|
||||
@@ -130,7 +130,7 @@ $(function(){
|
||||
|
||||
<% if(isModify){ %>
|
||||
//수정가능
|
||||
$("#REQUEST_CD,#PROJECT_NO,#CUSTOMER_NAME,#PRODUCT_NAME,#MECHANICAL_TYPE,#PROJECT_NAME,#SETUP,#RELEASE_DATE,#REQUEST_REASONS,#REQUEST_USER_ID,#DELIVERY_REQUEST_DATE,#PURCHASE_TYPE,#PURCHASE_TYPE2,#ORDER_TYPE,#AREA_CD,#CUSTOMER_OBJID,#PAID_TYPE").prop("disabled","");
|
||||
$("#REQUEST_CD,#PROJECT_NO,#CUSTOMER_NAME,#PRODUCT_NAME,#MECHANICAL_TYPE,#PROJECT_NAME,#SETUP,#RELEASE_DATE,#REQUEST_REASONS,#REQUEST_USER_ID,#DELIVERY_REQUEST_DATE,#PURCHASE_TYPE,#ORDER_TYPE,#AREA_CD,#CUSTOMER_OBJID,#PAID_TYPE").prop("disabled","");
|
||||
|
||||
//프로젝트명 변경시 정보 셋팅 (유닛명 제거)
|
||||
$("#PROJECT_NO").change(function(){
|
||||
@@ -176,6 +176,12 @@ $("#REQUEST_CD,#PROJECT_NO,#CUSTOMER_NAME,#PRODUCT_NAME,#MECHANICAL_TYPE,#PROJEC
|
||||
$("#PAID_TYPE").val(row["PAID_TYPE"]).trigger("change");
|
||||
// console.log("유/무상 설정:", row["PAID_TYPE"]);
|
||||
}
|
||||
|
||||
// 주문유형 (CATEGORY_CD from CONTRACT_MGMT)
|
||||
if(fnc_checkNull(row["CATEGORY_CD"]) != ""){
|
||||
$("#ORDER_TYPE").val(row["CATEGORY_CD"]).trigger("change");
|
||||
// console.log("주문유형 설정:", row["CATEGORY_CD"]);
|
||||
}
|
||||
}
|
||||
|
||||
// ★★★ M-BOM 품목 자동 로드 ★★★
|
||||
@@ -651,7 +657,7 @@ function fn_callbackFnc(){
|
||||
<tr>
|
||||
<td class="input_title"><label for="">구매유형<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="PURCHASE_TYPE" id="PURCHASE_TYPE" reqTitle="구매유형" type="select" class="select2" style="width: 100%;">
|
||||
<select name="PURCHASE_TYPE" id="PURCHASE_TYPE" reqTitle="구매유형" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.purchase_type}
|
||||
</select>
|
||||
</td>
|
||||
@@ -661,50 +667,42 @@ function fn_callbackFnc(){
|
||||
<option value="">선택</option> ${code_map.project_no}
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="">제품구분<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="PURCHASE_TYPE2" id="PURCHASE_TYPE2" reqTitle="제품구분" type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.purchase_type}
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="">주문유형<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="ORDER_TYPE" id="ORDER_TYPE" reqTitle="주문유형" type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.order_type}
|
||||
<select name="ORDER_TYPE" id="ORDER_TYPE" reqTitle="주문유형" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.category_cd}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="">제품구분<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="PRODUCT_NAME" id="PRODUCT_NAME" reqTitle="제품구분" type="select" class="select2" style="width: 100%;">
|
||||
<select name="PRODUCT_NAME" id="PRODUCT_NAME" reqTitle="제품구분" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.product_name}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="">국내/해외<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="AREA_CD" id="AREA_CD" reqTitle="국내/해외" type="select" class="select2" style="width: 100%;">
|
||||
<select name="AREA_CD" id="AREA_CD" reqTitle="국내/해외" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.area_cd}
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="">고객사<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<!-- <input type="text" name="CUSTOMER_NAME" id="CUSTOMER_NAME" value="${resultMap.CUSTOMER_NAME}" readonly> -->
|
||||
<select name="CUSTOMER_OBJID" id="CUSTOMER_OBJID" reqTitle="고객사" type="select" class="select2" style="width: 100%;">
|
||||
<select name="CUSTOMER_OBJID" id="CUSTOMER_OBJID" reqTitle="고객사" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.customer_objid}
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="">유/무상<span class="required-mark">*</span></label></td>
|
||||
<td>
|
||||
<select name="PAID_TYPE" id="PAID_TYPE" reqTitle="유/무상" type="select" class="select2" style="width: 100%;">
|
||||
<select name="PAID_TYPE" id="PAID_TYPE" reqTitle="유/무상" required type="select" class="select2" style="width: 100%;">
|
||||
<option value="">선택</option> ${code_map.paid_type}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="">입고요청일</label></td>
|
||||
<td colspan="7">
|
||||
<input type="text" class="date_icon" name="DELIVERY_REQUEST_DATE" id="DELIVERY_REQUEST_DATE" reqTitle="입고요청일" value="${resultMap.DELIVERY_REQUEST_DATE}" required disabled>
|
||||
<td>
|
||||
<input type="text" class="date_icon" name="DELIVERY_REQUEST_DATE" id="DELIVERY_REQUEST_DATE" reqTitle="입고요청일" value="${resultMap.DELIVERY_REQUEST_DATE}" disabled>
|
||||
<input type="hidden" name="REQUEST_USER_ID" id="REQUEST_USER_ID" value="${resultMap.REQUEST_USER_ID}">
|
||||
</td>
|
||||
</tr>
|
||||
@@ -740,7 +738,7 @@ function fn_callbackFnc(){
|
||||
<col width="30px">
|
||||
<col width="200px">
|
||||
<col width="200px">
|
||||
<col width="285px">
|
||||
<col width="100px">
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="plm_thead">
|
||||
@@ -758,7 +756,7 @@ function fn_callbackFnc(){
|
||||
<col width="30px">
|
||||
<col width="200px">
|
||||
<col width="200px">
|
||||
<col width="285px">
|
||||
<col width="100px">
|
||||
</colgroup>
|
||||
<tbody id="partListArea">
|
||||
</tbody>
|
||||
|
||||
@@ -205,13 +205,14 @@ var columns = [
|
||||
{title:'SPC_OBJID' , field:'SPC_OBJID' ,visible: false},
|
||||
{title:'PURCHASE_ORDER_MASTER_OBJID', field:'PURCHASE_ORDER_MASTER_OBJID' ,visible: false},
|
||||
{title:'APPROVAL_OBJID' , field:'APPROVAL_OBJID' ,visible:false},
|
||||
{title:'ROUTE_OBJID' , field:'ROUTE_OBJID' ,visible:false}
|
||||
{title:'ROUTE_OBJID' , field:'ROUTE_OBJID' ,visible:false},
|
||||
{title:'MBOM_HEADER_OBJID' , field:'MBOM_HEADER_OBJID' ,visible:false}
|
||||
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청번호", field :"REQUEST_MNG_NO" , widthGrow:1.3,
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick : function(e, cell) {
|
||||
fn_openSalesRequestPopUp(cell.getData().OBJID);
|
||||
}
|
||||
}
|
||||
}
|
||||
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매유형", field :"PURCHASE_TYPE_NAME" , widthGrow:1.1 }
|
||||
,{headerHozAlign : 'center', hozAlign : 'left' , title : "프로젝트번호", field :"PROJECT_NUMBER" , widthGrow:1.4 }
|
||||
@@ -285,7 +286,17 @@ function fn_salesRequestTargetBOMListPopUp(){
|
||||
|
||||
//구매의뢰 요청 팝업 (요청번호 클릭 시 - 구매리스트 화면)
|
||||
function fn_openSalesRequestPopUp(objId){
|
||||
// 그리드에서 선택된 행의 MBOM_HEADER_OBJID 가져오기
|
||||
var selectedRow = _tabulGrid.searchRows("OBJID", "=", objId);
|
||||
var mbomHeaderObjid = '';
|
||||
if(selectedRow && selectedRow.length > 0) {
|
||||
mbomHeaderObjid = fnc_checkNull(selectedRow[0].getData().MBOM_HEADER_OBJID);
|
||||
}
|
||||
|
||||
var url = "/salesMng/purchaseListFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
|
||||
if(mbomHeaderObjid) {
|
||||
url += "&MBOM_HEADER_OBJID=" + mbomHeaderObjid;
|
||||
}
|
||||
window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
@@ -480,7 +491,7 @@ function fn_formPopUp(objId,sales_request_objid){
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2>
|
||||
<span>구매관리_구매요청서관리</span>
|
||||
<span>구매관리_구매리스트관리</span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
|
||||
@@ -4986,6 +4986,69 @@ public String clientImportFileProc(HttpServletRequest request, HttpSession sessi
|
||||
//return "/ajax/ajaxResult";
|
||||
}
|
||||
|
||||
/**
|
||||
* 소재 목록 조회 (중복 제거된 소재 코드)
|
||||
*/
|
||||
@RequestMapping("/admin/getMaterialList.do")
|
||||
@ResponseBody
|
||||
public Map<String, Object> getMaterialList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
try {
|
||||
List<Map> list = adminService.getMaterialList(paramMap);
|
||||
list = CommonUtils.keyChangeUpperList(list);
|
||||
resultMap.put("list", list);
|
||||
resultMap.put("result", true);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "소재 목록 조회 중 오류가 발생했습니다.");
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 소재의 사이즈 목록 조회
|
||||
*/
|
||||
@RequestMapping("/admin/getMaterialSizes.do")
|
||||
@ResponseBody
|
||||
public Map<String, Object> getMaterialSizes(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
try {
|
||||
List<Map> list = adminService.getMaterialSizes(paramMap);
|
||||
list = CommonUtils.keyChangeUpperList(list);
|
||||
resultMap.put("list", list);
|
||||
resultMap.put("result", true);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "사이즈 목록 조회 중 오류가 발생했습니다.");
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 소재 코드 + 사이즈로 소재품번 조회
|
||||
*/
|
||||
@RequestMapping("/admin/getMaterialPartNo.do")
|
||||
@ResponseBody
|
||||
public Map<String, Object> getMaterialPartNo(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
try {
|
||||
Map result = adminService.getMaterialPartNo(paramMap);
|
||||
if(result != null) {
|
||||
result = CommonUtils.toUpperCaseMapKey(result);
|
||||
resultMap.putAll(result);
|
||||
resultMap.put("result", true);
|
||||
} else {
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "해당 소재품번을 찾을 수 없습니다.");
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", "소재품번 조회 중 오류가 발생했습니다.");
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -9325,5 +9325,45 @@ SELECT
|
||||
) RESULT
|
||||
</select> -->
|
||||
|
||||
<!-- 소재 관리 쿼리 -->
|
||||
<!-- 소재 목록 조회 (전체) -->
|
||||
<select id="getMaterialList" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
MATERIAL_NAME,
|
||||
STATUS
|
||||
FROM MATERIAL_MNG
|
||||
WHERE STATUS = 'ACTIVE'
|
||||
ORDER BY MATERIAL_CODE
|
||||
</select>
|
||||
|
||||
<!-- 특정 소재의 사이즈 목록 조회 -->
|
||||
<select id="getMaterialSizes" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
SIZE_SPEC,
|
||||
MATERIAL_PART_NO
|
||||
FROM MATERIAL_MNG
|
||||
WHERE MATERIAL_CODE = #{materialCode}
|
||||
AND STATUS = 'ACTIVE'
|
||||
ORDER BY SIZE_SPEC
|
||||
</select>
|
||||
|
||||
<!-- 소재 코드 + 사이즈로 소재품번 조회 -->
|
||||
<select id="getMaterialPartNo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
MATERIAL_NAME,
|
||||
SIZE_SPEC,
|
||||
MATERIAL_PART_NO
|
||||
FROM MATERIAL_MNG
|
||||
WHERE MATERIAL_CODE = #{materialCode}
|
||||
AND SIZE_SPEC = #{sizeSpec}
|
||||
AND STATUS = 'ACTIVE'
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
@@ -2944,6 +2944,25 @@
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS EBOM_REGDATE,
|
||||
-- M-BOM HEADER OBJID: 구매리스트 생성 시 필요
|
||||
(SELECT MH.OBJID::VARCHAR
|
||||
FROM MBOM_HEADER MH
|
||||
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
|
||||
AND MH.STATUS = 'Y'
|
||||
ORDER BY MH.REGDATE DESC
|
||||
LIMIT 1) AS MBOM_HEADER_OBJID,
|
||||
-- 구매리스트 OBJID: 이미 생성된 구매리스트가 있는지 확인용
|
||||
(SELECT SRM.OBJID::VARCHAR
|
||||
FROM SALES_REQUEST_MASTER SRM
|
||||
WHERE SRM.MBOM_HEADER_OBJID = (
|
||||
SELECT MH.OBJID::VARCHAR
|
||||
FROM MBOM_HEADER MH
|
||||
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
|
||||
AND MH.STATUS = 'Y'
|
||||
ORDER BY MH.REGDATE DESC
|
||||
LIMIT 1
|
||||
)
|
||||
LIMIT 1) AS PURCHASE_LIST_OBJID,
|
||||
-- M-BOM 상태: 새 MBOM_HEADER 테이블에서 조회
|
||||
COALESCE(
|
||||
(SELECT
|
||||
@@ -4050,6 +4069,7 @@
|
||||
V.STOCK_QTY,
|
||||
V.SHORTAGE_QTY,
|
||||
V.VENDOR,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
|
||||
V.UNIT_PRICE,
|
||||
V.TOTAL_PRICE,
|
||||
V.CURRENCY,
|
||||
|
||||
@@ -667,12 +667,8 @@ VALUES
|
||||
PM.OBJID,
|
||||
(SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
|
||||
) AS PROJECT_MGMT_OBJID,
|
||||
-- M-BOM 조회용: MBOM_HEADER에서 직접 OBJID 가져오기
|
||||
(SELECT MH.OBJID FROM MBOM_HEADER MH
|
||||
WHERE MH.PROJECT_OBJID = COALESCE(PM.OBJID, (SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1))
|
||||
AND MH.STATUS = 'Y'
|
||||
ORDER BY MH.REGDATE DESC LIMIT 1
|
||||
) AS MBOM_HEADER_OBJID,
|
||||
-- M-BOM 조회용: SALES_REQUEST_MASTER에 저장된 MBOM_HEADER_OBJID 사용
|
||||
SRM.MBOM_HEADER_OBJID,
|
||||
COALESCE(
|
||||
PM.BOM_REPORT_OBJID,
|
||||
(SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
|
||||
@@ -966,19 +962,50 @@ VALUES
|
||||
-- 구매요청서 작성 여부 (SALES_REQUEST_PART에 데이터가 있으면 'Y')
|
||||
(SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM SALES_REQUEST_PART WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID) AS HAS_PURCHASE_REQUEST,
|
||||
|
||||
-- 추가된 컬럼들
|
||||
SRM.PURCHASE_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
SRM.ORDER_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME,
|
||||
SRM.PRODUCT_NAME,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PRODUCT_NAME) AS PRODUCT_NAME_FULL,
|
||||
SRM.AREA_CD,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.AREA_CD) AS AREA_CD_NAME,
|
||||
SRM.CUSTOMER_OBJID,
|
||||
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID) AS CUSTOMER_NAME,
|
||||
SRM.PAID_TYPE,
|
||||
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END) AS PAID_TYPE_NAME,
|
||||
-- M-BOM 관련 컬럼
|
||||
SRM.MBOM_HEADER_OBJID,
|
||||
|
||||
-- 추가된 컬럼들
|
||||
SRM.PURCHASE_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
SRM.ORDER_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.ORDER_TYPE) AS ORDER_TYPE_NAME,
|
||||
|
||||
-- 제품구분: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
(SELECT CC.CODE_NAME
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
LEFT JOIN COMM_CODE CC ON CC.CODE_ID = CM.PRODUCT
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = SRM.PRODUCT_NAME)
|
||||
) AS PRODUCT_NAME_FULL,
|
||||
|
||||
SRM.AREA_CD,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.AREA_CD) AS AREA_CD_NAME,
|
||||
|
||||
-- 고객사: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
(SELECT SM.SUPPLY_NAME
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
LEFT JOIN SUPPLY_MNG SM ON SM.OBJID = CM.CUSTOMER_OBJID::NUMERIC
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
|
||||
) AS CUSTOMER_NAME,
|
||||
|
||||
-- 유/무상: 프로젝트 정보 우선, 없으면 SALES_REQUEST_MASTER 값
|
||||
COALESCE(
|
||||
(SELECT CASE
|
||||
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
|
||||
WHEN CM.PAID_TYPE = 'free' THEN '무상'
|
||||
ELSE CM.PAID_TYPE
|
||||
END
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END)
|
||||
) AS PAID_TYPE_NAME,
|
||||
|
||||
-- 품번/품명 ("외 N건" 형태로 표시)
|
||||
(
|
||||
@@ -3191,6 +3218,7 @@ SELECT
|
||||
V.STOCK_QTY,
|
||||
V.SHORTAGE_QTY,
|
||||
V.VENDOR AS VENDOR_PM,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
|
||||
V.UNIT_PRICE,
|
||||
V.TOTAL_PRICE,
|
||||
V.CURRENCY,
|
||||
@@ -3284,19 +3312,19 @@ ORDER BY V.PATH2
|
||||
WHERE OBJID::VARCHAR = #{OBJID}
|
||||
</update>
|
||||
|
||||
<!-- M-BOM에서 구매리스트 생성 시 해당 프로젝트로 이미 생성된 구매요청서가 있는지 확인 -->
|
||||
<!-- 프로젝트로 구매요청서 조회 (수동 작성 포함) -->
|
||||
<select id="getSalesRequestMasterByProjectNo" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
REQUEST_MNG_NO,
|
||||
PROJECT_NO,
|
||||
MBOM_HEADER_OBJID,
|
||||
STATUS
|
||||
FROM
|
||||
SALES_REQUEST_MASTER
|
||||
WHERE
|
||||
PROJECT_NO = #{PROJECT_NO}
|
||||
ORDER BY REGDATE DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 다음 요청번호 생성 (R + YYYYMMDD + - + 3자리 순번) -->
|
||||
@@ -3311,6 +3339,7 @@ ORDER BY V.PATH2
|
||||
OBJID,
|
||||
REQUEST_MNG_NO,
|
||||
PROJECT_NO,
|
||||
MBOM_HEADER_OBJID,
|
||||
REQUEST_USER_ID,
|
||||
STATUS,
|
||||
WRITER,
|
||||
@@ -3319,6 +3348,7 @@ ORDER BY V.PATH2
|
||||
#{OBJID},
|
||||
#{REQUEST_MNG_NO},
|
||||
#{PROJECT_NO},
|
||||
#{MBOM_HEADER_OBJID},
|
||||
#{REQUEST_USER_ID},
|
||||
#{STATUS},
|
||||
#{WRITER},
|
||||
@@ -3326,6 +3356,7 @@ ORDER BY V.PATH2
|
||||
)
|
||||
</insert>
|
||||
|
||||
|
||||
<!-- ==================== 품의서 관리 ==================== -->
|
||||
|
||||
<!-- 품의서 목록 조회 -->
|
||||
@@ -3468,6 +3499,44 @@ ORDER BY V.PATH2
|
||||
SRM.PROJECT_NO,
|
||||
(SELECT PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NUMBER,
|
||||
(SELECT PROJECT_NAME FROM PROJECT_MGMT PM WHERE PM.OBJID = SRM.PROJECT_NO) AS PROJECT_NAME,
|
||||
|
||||
-- 프로젝트의 제품구분, 고객사, 유/무상 정보 (PROJECT_MGMT에서 조회)
|
||||
COALESCE(
|
||||
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT WHERE OBJID = SRM.PROJECT_NO),
|
||||
SRM.PRODUCT_NAME
|
||||
) AS PROJECT_PRODUCT,
|
||||
COALESCE(
|
||||
(SELECT CM.CUSTOMER_OBJID
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.CUSTOMER_OBJID
|
||||
) AS PROJECT_CUSTOMER_OBJID,
|
||||
COALESCE(
|
||||
(SELECT SM.SUPPLY_NAME
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
LEFT JOIN SUPPLY_MNG SM ON SM.OBJID = CM.CUSTOMER_OBJID::NUMERIC
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = SRM.CUSTOMER_OBJID)
|
||||
) AS PROJECT_CUSTOMER_NAME,
|
||||
COALESCE(
|
||||
(SELECT CM.PAID_TYPE
|
||||
FROM PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
|
||||
WHERE PM.OBJID::VARCHAR = SRM.PROJECT_NO),
|
||||
SRM.PAID_TYPE
|
||||
) AS PROJECT_PAID_TYPE,
|
||||
COALESCE(
|
||||
(SELECT CASE
|
||||
WHEN PAID_TYPE = 'paid' THEN '유상'
|
||||
WHEN PAID_TYPE = 'free' THEN '무상'
|
||||
ELSE PAID_TYPE
|
||||
END
|
||||
FROM PROJECT_MGMT
|
||||
WHERE OBJID = SRM.PROJECT_NO),
|
||||
(CASE WHEN SRM.PAID_TYPE = 'paid' THEN '유상' WHEN SRM.PAID_TYPE = 'free' THEN '무상' ELSE SRM.PAID_TYPE END)
|
||||
) AS PROJECT_PAID_TYPE_NAME,
|
||||
SRM.PURCHASE_TYPE,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRM.PURCHASE_TYPE) AS PURCHASE_TYPE_NAME,
|
||||
SRM.ORDER_TYPE,
|
||||
|
||||
@@ -302,8 +302,8 @@ public class SalesMngController {
|
||||
code_map.put("area_cd",commonService.bizMakeOptionList("0001219", (String)resultMap.get("AREA_CD"),"common.getCodeselect"));
|
||||
//고객사
|
||||
code_map.put("customer_objid",commonService.bizMakeOptionList("", (String)resultMap.get("CUSTOMER_OBJID"),"common.getsupplyselect"));
|
||||
//구매유형 (PURCHASE_TYPE) - 0001068 사용
|
||||
code_map.put("purchase_type",commonService.bizMakeOptionList("0001068", (String)resultMap.get("PURCHASE_TYPE"),"common.getCodeselect"));
|
||||
//구매유형 (PURCHASE_TYPE) - 0001814 사용
|
||||
code_map.put("purchase_type",commonService.bizMakeOptionList("0001814", (String)resultMap.get("PURCHASE_TYPE"),"common.getCodeselect"));
|
||||
//주문유형 (ORDER_TYPE) - 0001406 사용
|
||||
code_map.put("order_type",commonService.bizMakeOptionList("0001406", (String)resultMap.get("ORDER_TYPE"),"common.getCodeselect"));
|
||||
//제품구분 (PRODUCT_NAME) - 0000001 사용
|
||||
|
||||
@@ -1864,48 +1864,34 @@ public class SalesMngService {
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
|
||||
String projectMgmtObjid = CommonUtils.checkNull(paramMap.get("PROJECT_MGMT_OBJID"));
|
||||
String projectNo = CommonUtils.checkNull(paramMap.get("PROJECT_NO"));
|
||||
String projectMgmtObjid = CommonUtils.checkNull(paramMap.get("PROJECT_MGMT_OBJID"));
|
||||
String projectNo = CommonUtils.checkNull(paramMap.get("PROJECT_NO"));
|
||||
String mbomHeaderObjid = CommonUtils.checkNull(paramMap.get("MBOM_HEADER_OBJID"));
|
||||
|
||||
// 로그인 사용자 정보
|
||||
HttpSession session = request.getSession();
|
||||
PersonBean personBean = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
|
||||
String userId = personBean.getUserId();
|
||||
|
||||
// 로그인 사용자 정보
|
||||
HttpSession session = request.getSession();
|
||||
PersonBean personBean = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
|
||||
String userId = personBean.getUserId();
|
||||
// 새로 생성
|
||||
String salesRequestMasterObjid = String.valueOf(CommonUtils.createObjId());
|
||||
String requestMngNo = (String) sqlSession.selectOne("salesMng.getNextRequestMngNo");
|
||||
|
||||
// 이미 해당 프로젝트로 생성된 구매요청서가 있는지 확인
|
||||
Map checkParam = new HashMap();
|
||||
checkParam.put("PROJECT_NO", projectMgmtObjid);
|
||||
Map existingMaster = sqlSession.selectOne("salesMng.getSalesRequestMasterByProjectNo", checkParam);
|
||||
Map insertParam = new HashMap();
|
||||
insertParam.put("OBJID", salesRequestMasterObjid);
|
||||
insertParam.put("PROJECT_NO", projectMgmtObjid); // PROJECT_MGMT.OBJID 저장
|
||||
insertParam.put("MBOM_HEADER_OBJID", mbomHeaderObjid); // MBOM_HEADER.OBJID 저장
|
||||
insertParam.put("REQUEST_MNG_NO", requestMngNo);
|
||||
insertParam.put("WRITER", userId);
|
||||
insertParam.put("REQUEST_USER_ID", userId);
|
||||
insertParam.put("STATUS", "create");
|
||||
|
||||
String salesRequestMasterObjid;
|
||||
|
||||
if(existingMaster != null && existingMaster.get("OBJID") != null) {
|
||||
// 이미 있으면 기존 것 사용
|
||||
salesRequestMasterObjid = CommonUtils.checkNull(existingMaster.get("OBJID"));
|
||||
System.out.println("기존 구매요청서 마스터 사용: " + salesRequestMasterObjid);
|
||||
} else {
|
||||
// 없으면 새로 생성
|
||||
salesRequestMasterObjid = String.valueOf(CommonUtils.createObjId());
|
||||
|
||||
// 요청번호 생성 (기존 로직과 동일)
|
||||
String requestMngNo = (String) sqlSession.selectOne("salesMng.getNextRequestMngNo");
|
||||
|
||||
Map insertParam = new HashMap();
|
||||
insertParam.put("OBJID", salesRequestMasterObjid);
|
||||
insertParam.put("PROJECT_NO", projectMgmtObjid); // PROJECT_MGMT.OBJID 저장
|
||||
insertParam.put("REQUEST_MNG_NO", requestMngNo);
|
||||
insertParam.put("WRITER", userId);
|
||||
insertParam.put("REQUEST_USER_ID", userId);
|
||||
insertParam.put("STATUS", "create");
|
||||
|
||||
sqlSession.insert("salesMng.insertSalesRequestMasterFromMBom", insertParam);
|
||||
sqlSession.commit();
|
||||
|
||||
System.out.println("새 구매요청서 마스터 생성: " + salesRequestMasterObjid + ", 요청번호: " + requestMngNo);
|
||||
}
|
||||
sqlSession.insert("salesMng.insertSalesRequestMasterFromMBom", insertParam);
|
||||
sqlSession.commit();
|
||||
|
||||
resultMap.put("resultFlag", "S");
|
||||
resultMap.put("SALES_REQUEST_MASTER_OBJID", salesRequestMasterObjid);
|
||||
resultMap.put("MBOM_HEADER_OBJID", mbomHeaderObjid);
|
||||
resultMap.put("message", "구매리스트가 생성되었습니다.");
|
||||
|
||||
} catch(Exception e) {
|
||||
|
||||
@@ -7263,6 +7263,42 @@ public class AdminService extends BaseService {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 소재 목록 조회
|
||||
*/
|
||||
public List<Map> getMaterialList(Map<String, Object> paramMap) throws Exception {
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
try {
|
||||
return sqlSession.selectList("admin.getMaterialList", paramMap);
|
||||
} finally {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 특정 소재의 사이즈 목록 조회
|
||||
*/
|
||||
public List<Map> getMaterialSizes(Map<String, Object> paramMap) throws Exception {
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
try {
|
||||
return sqlSession.selectList("admin.getMaterialSizes", paramMap);
|
||||
} finally {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 소재 코드 + 사이즈로 소재품번 조회
|
||||
*/
|
||||
public Map getMaterialPartNo(Map<String, Object> paramMap) throws Exception {
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
try {
|
||||
return (Map) sqlSession.selectOne("admin.getMaterialPartNo", paramMap);
|
||||
} finally {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user