Merge pull request 'V20251023001' (#28) from V20251023001 into main
Reviewed-on: #28
This commit was merged in pull request #28.
This commit is contained in:
@@ -2928,7 +2928,7 @@
|
||||
FROM CONTRACT_ITEM CI
|
||||
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
|
||||
AND CI.PART_OBJID = PM.PART_OBJID
|
||||
AND CI.STATUS = 'ACTIVE'),
|
||||
AND CI.STATUS = 'ACTIVE' LIMIT 1),
|
||||
PM.DUE_DATE,
|
||||
CM.req_del_date
|
||||
) AS REQ_DEL_DATE,
|
||||
@@ -2938,19 +2938,31 @@
|
||||
FROM CONTRACT_ITEM CI
|
||||
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
|
||||
AND CI.PART_OBJID = PM.PART_OBJID
|
||||
AND CI.STATUS = 'ACTIVE'),
|
||||
AND CI.STATUS = 'ACTIVE' LIMIT 1),
|
||||
''
|
||||
) AS CUSTOMER_REQUEST,
|
||||
PBR.OBJID AS BOM_REPORT_OBJID,
|
||||
COALESCE(PBR.STATUS, '') AS EBOM_STATUS,
|
||||
COALESCE(TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD'), '') AS EBOM_REGDATE,
|
||||
-- E-BOM 정보: PM.PART_OBJID가 E-BOM OBJID를 직접 가리킴
|
||||
PM.PART_OBJID AS BOM_REPORT_OBJID,
|
||||
COALESCE(
|
||||
(SELECT PBR.STATUS
|
||||
FROM PART_BOM_REPORT PBR
|
||||
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS EBOM_STATUS,
|
||||
COALESCE(
|
||||
(SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
|
||||
FROM PART_BOM_REPORT PBR
|
||||
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS EBOM_REGDATE,
|
||||
COALESCE(PM.MBOM_STATUS, '') AS MBOM_STATUS,
|
||||
'1.0' AS MBOM_VERSION,
|
||||
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS MBOM_REGDATE
|
||||
FROM
|
||||
PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
LEFT JOIN PART_BOM_REPORT PBR ON PM.CONTRACT_OBJID = PBR.CONTRACT_OBJID::VARCHAR
|
||||
WHERE 1=1
|
||||
AND PM.PROJECT_NO IS NOT NULL
|
||||
AND PM.PROJECT_NO != ''
|
||||
@@ -2964,4 +2976,31 @@
|
||||
</if>
|
||||
ORDER BY PM.REGDATE DESC
|
||||
</select>
|
||||
|
||||
<!-- E-BOM을 PROJECT_MGMT에 할당 -->
|
||||
<update id="assignEbomToProject" parameterType="map">
|
||||
UPDATE PROJECT_MGMT
|
||||
SET
|
||||
PART_OBJID = #{bomReportObjid}
|
||||
WHERE OBJID = #{projectMgmtObjid}
|
||||
</update>
|
||||
|
||||
<!-- E-BOM 정보 조회 -->
|
||||
<select id="getEbomInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
T.OBJID,
|
||||
T.PRODUCT_CD,
|
||||
CODE_NAME(T.PRODUCT_CD) as PRODUCT_NAME,
|
||||
T.PART_NO,
|
||||
T.PART_NAME,
|
||||
T.STATUS,
|
||||
T.REVISION,
|
||||
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
|
||||
UI.USER_NAME AS WRITER_NAME,
|
||||
UI.DEPT_NAME
|
||||
FROM
|
||||
PART_BOM_REPORT T
|
||||
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
|
||||
WHERE T.OBJID::VARCHAR = #{objid}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -146,7 +146,7 @@ String connector = person.getUserId();
|
||||
openPartMngPopup(objid);
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', /* width : '270', */ title : '품명', field : 'PART_NAME' },
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '180', title : '품명', field : 'PART_NAME' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '50', title : '수량', field : 'BOM_QTY' }, //Q_QTY QTY QTY_P
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '60', title : '3D', field : 'CU01_CNT',
|
||||
formatter:fnc_subInfoValueFormatter,
|
||||
|
||||
@@ -138,7 +138,7 @@ ui-jqgrid tr.jqgrow td {
|
||||
openPartMngPopup(objid);
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', /*width : '270',*/ title : '품명', field : 'PART_NAME' ,frozen:true},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '180', title : '품명', field : 'PART_NAME' ,frozen:true},
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '70', title : '수량', field : 'Q_QTY' },
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '60', title : '3D', field : 'CU01_CNT',
|
||||
formatter:fnc_subInfoValueFormatter,
|
||||
|
||||
@@ -157,27 +157,27 @@ var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '270', title : '유닛명', field : 'UNIT_NAME' },*/
|
||||
|
||||
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '200', title : '제품구분', field : 'PRODUCT_NAME' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', title : '제품구분', field : 'PRODUCT_CD' ,hidden: true},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '300', title : '품번', field : 'PART_NO' },
|
||||
{headerHozAlign : 'center', hozAlign : 'left', /* width : '300',*/ title : '품명', field : 'PART_NAME' },
|
||||
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '200', title : 'E-BOM', field : 'BOM_CNT',
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick:function(e, cell){
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
//var bomReportObjId = fnc_checkNull(cell.getData().BOM_REPORMECHANICAL_TYPET_OBJID);
|
||||
fn_openSetStructure(objId);
|
||||
}
|
||||
},
|
||||
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '등록자', field : 'DEPT_USER_NAME' },
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '200', title : '등록일', field : 'REG_DATE' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '배포일', field : 'DEPLOY_DATE' },
|
||||
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '200', title : 'Version', field : 'REVISION' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'left', /* width : '200', */ title : '배포사유', field : 'NOTE' },
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '200', title : '상태', field : 'STATUS' }
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '160', title : '제품구분', field : 'PRODUCT_NAME' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', title : '제품구분', field : 'PRODUCT_CD' ,hidden: true},
|
||||
{headerHozAlign : 'center', hozAlign : 'left', width : '210', title : '품번', field : 'PART_NO' },
|
||||
{headerHozAlign : 'center', hozAlign : 'left', title : '품명', field : 'PART_NAME' },
|
||||
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '150', title : 'E-BOM', field : 'BOM_CNT',
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick:function(e, cell){
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
//var bomReportObjId = fnc_checkNull(cell.getData().BOM_REPORMECHANICAL_TYPET_OBJID);
|
||||
fn_openSetStructure(objId);
|
||||
}
|
||||
},
|
||||
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '등록자', field : 'DEPT_USER_NAME' },
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '130', title : '등록일', field : 'REG_DATE' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '배포일', field : 'DEPLOY_DATE' },
|
||||
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '110', title : 'Version', field : 'REVISION' },
|
||||
// {headerHozAlign : 'center', hozAlign : 'left', /* width : '200', */ title : '배포사유', field : 'NOTE' },
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '110', title : '상태', field : 'STATUS' }
|
||||
];
|
||||
|
||||
// 중복 요청 방지를 위한 로딩 플래그
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ page import="com.pms.common.utils.*"%>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ page import="java.util.*" %>
|
||||
<%@include file= "/init.jsp" %>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<style>
|
||||
.ebom-select-container {
|
||||
padding: 10px;
|
||||
}
|
||||
.header-section {
|
||||
background: #f5f5f5;
|
||||
padding: 15px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #ddd;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
.header-section h3 {
|
||||
margin: 0;
|
||||
color: #333;
|
||||
}
|
||||
.current-ebom-section {
|
||||
background: #f9f9f9;
|
||||
padding: 20px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.current-ebom-section h4 {
|
||||
margin: 0 0 15px 0;
|
||||
color: #333;
|
||||
font-size: 16px;
|
||||
}
|
||||
.ebom-info-table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
background: white;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.ebom-info-table th {
|
||||
background: #f5f5f5;
|
||||
padding: 10px;
|
||||
text-align: left;
|
||||
border: 1px solid #ddd;
|
||||
width: 150px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.ebom-info-table td {
|
||||
padding: 10px;
|
||||
border: 1px solid #ddd;
|
||||
}
|
||||
.ebom-list-section {
|
||||
margin-bottom: 10px;
|
||||
height: 400px !important;
|
||||
}
|
||||
.ebom-list-section .plm_tab_div {
|
||||
height: 200px !important;
|
||||
}
|
||||
.ebom-list-section #mainGrid {
|
||||
height: 200px !important;
|
||||
}
|
||||
.ebom-preview-section {
|
||||
padding: 10px;
|
||||
background: #fafafa;
|
||||
}
|
||||
.ebom-preview-section h4 {
|
||||
margin: 0 0 10px 0;
|
||||
color: #555;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// 현재 할당된 E-BOM이 있는지 여부
|
||||
var hasCurrentEbom = ${not empty currentEbom};
|
||||
var currentEbomObjid = "${not empty currentEbom ? currentEbom.OBJID : ''}";
|
||||
|
||||
$(document).ready(function(){
|
||||
$('.select2').select2();
|
||||
|
||||
// 날짜 선택기 초기화
|
||||
fnc_datepick("search_fromDate", "search_toDate");
|
||||
|
||||
// Enter 키로 검색
|
||||
$("input").keyup(function(e) {
|
||||
if (e.keyCode == 13) {
|
||||
fn_searchEbomList();
|
||||
}
|
||||
});
|
||||
|
||||
// 조회 버튼
|
||||
$("#btnSearch").click(function(){
|
||||
fn_searchEbomList();
|
||||
});
|
||||
|
||||
// 변경 버튼
|
||||
$("#btnChange").click(function(){
|
||||
fn_showEbomList();
|
||||
});
|
||||
|
||||
// 초기 상태 설정
|
||||
if(hasCurrentEbom) {
|
||||
// 할당된 E-BOM이 있으면 상세보기만 표시
|
||||
fn_showCurrentEbom();
|
||||
} else {
|
||||
// 할당된 E-BOM이 없으면 목록 표시
|
||||
fn_showEbomList();
|
||||
}
|
||||
});
|
||||
|
||||
// 현재 할당된 E-BOM 표시
|
||||
function fn_showCurrentEbom() {
|
||||
$("#currentEbomSection").show();
|
||||
$("#ebomListSection").hide();
|
||||
|
||||
// 현재 E-BOM 미리보기 로드
|
||||
$("#ebomPreviewFrame").attr("src", "/partMng/structurePopupLeft.do?readonly=readonly&objId=" + currentEbomObjid);
|
||||
}
|
||||
|
||||
// E-BOM 목록 표시 (변경 모드)
|
||||
function fn_showEbomList() {
|
||||
$("#currentEbomSection").hide();
|
||||
$("#ebomListSection").show();
|
||||
|
||||
// 목록 조회
|
||||
fn_searchEbomList();
|
||||
}
|
||||
|
||||
// 그리드 컬럼 정의
|
||||
var columns = [
|
||||
{headerHozAlign: 'center', hozAlign: 'center', width: 160, title: '제품구분', field: 'PRODUCT_NAME'},
|
||||
{headerHozAlign: 'center', hozAlign: 'left', width: 210, title: '품번', field: 'PART_NO'},
|
||||
{headerHozAlign: 'center', hozAlign: 'left', title: '품명', field: 'PART_NAME'},
|
||||
{headerHozAlign: 'center', hozAlign: 'center', width: 130, title: '등록일', field: 'REG_DATE'},
|
||||
{headerHozAlign: 'center', hozAlign: 'center', width: 110, title: 'Version', field: 'REVISION'},
|
||||
{headerHozAlign: 'center', hozAlign: 'center', width: 110, title: '상태', field: 'STATUS'}
|
||||
];
|
||||
|
||||
// E-BOM List 조회 (상태='Y'만)
|
||||
function fn_searchEbomList() {
|
||||
// 상태='Y' 조건 추가
|
||||
$("#status").val("Y");
|
||||
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/partMng/searchStructureGridList.do", columns, true);
|
||||
|
||||
// 행 클릭 이벤트 - 단일 선택만 가능
|
||||
if(_tabulGrid) {
|
||||
_tabulGrid.on("rowClick", function(e, row){
|
||||
// 이전 선택 해제
|
||||
_tabulGrid.deselectRow();
|
||||
// 현재 행 선택
|
||||
_tabulGrid.selectRow(row);
|
||||
|
||||
var data = row.getData();
|
||||
fn_selectEbom(data.OBJID, data.PART_NO, data.PART_NAME);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// E-BOM 선택 시 미리보기
|
||||
function fn_selectEbom(bomReportObjid, partNo, partName) {
|
||||
$("#selectedBomObjid").val(bomReportObjid);
|
||||
$("#selectedPartNo").text(partNo);
|
||||
$("#selectedPartName").text(partName);
|
||||
|
||||
// 하단 iframe에 E-BOM 상세 로드
|
||||
$("#ebomPreviewFrame").attr("src", "/partMng/structurePopupLeft.do?readonly=readonly&objId=" + bomReportObjid);
|
||||
|
||||
// 선택 표시
|
||||
$("#selectedInfo").show();
|
||||
}
|
||||
|
||||
// E-BOM 할당
|
||||
function fn_assignEbom() {
|
||||
var bomReportObjid = $("#selectedBomObjid").val();
|
||||
var projectMgmtObjid = "${param.projectMgmtObjid}";
|
||||
|
||||
if(!bomReportObjid) {
|
||||
alert("E-BOM을 선택해주세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
var confirmMsg = hasCurrentEbom
|
||||
? "선택한 E-BOM으로 변경하시겠습니까?"
|
||||
: "선택한 E-BOM을 할당하시겠습니까?";
|
||||
|
||||
if(confirm(confirmMsg)) {
|
||||
$.ajax({
|
||||
url: "/productionplanning/assignEbomToMbom.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
projectMgmtObjid: projectMgmtObjid,
|
||||
bomReportObjid: bomReportObjid
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result) {
|
||||
if(result.success) {
|
||||
var successMsg = hasCurrentEbom
|
||||
? "E-BOM이 변경되었습니다."
|
||||
: "E-BOM이 할당되었습니다.";
|
||||
alert(successMsg);
|
||||
if(window.opener && window.opener.fn_search) {
|
||||
window.opener.fn_search(); // 부모 창 새로고침
|
||||
}
|
||||
window.close();
|
||||
} else {
|
||||
alert(result.message || "할당에 실패했습니다.");
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
alert("오류가 발생했습니다: " + error);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<form name="form1" id="form1" method="post">
|
||||
<input type="hidden" name="status" id="status" value="Y">
|
||||
<input type="hidden" id="selectedBomObjid">
|
||||
|
||||
<div class="ebom-select-container">
|
||||
<!-- 상단: 정보 및 버튼 -->
|
||||
<div class="header-section">
|
||||
<h3>E-BOM ${not empty currentEbom ? '상세 및 변경' : '선택'} - 품번: ${param.partNo} / 품명: ${param.partName}</h3>
|
||||
<div>
|
||||
<c:if test="${not empty currentEbom}">
|
||||
<input type="button" value="E-BOM 변경" class="plm_btns" id="btnChange" style="background-color: #FF9800; color: white;">
|
||||
</c:if>
|
||||
<input type="button" value="닫기" class="plm_btns" onclick="window.close()">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 현재 할당된 E-BOM 정보 (할당된 경우만 표시) -->
|
||||
<c:if test="${not empty currentEbom}">
|
||||
<div id="currentEbomSection" class="current-ebom-section">
|
||||
<h4>📋 현재 할당된 E-BOM 정보</h4>
|
||||
<table class="ebom-info-table">
|
||||
<tr>
|
||||
<th>제품구분</th>
|
||||
<td>${currentEbom.PRODUCT_NAME}</td>
|
||||
<th>품번</th>
|
||||
<td>${currentEbom.PART_NO}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>품명</th>
|
||||
<td>${currentEbom.PART_NAME}</td>
|
||||
<th>Version</th>
|
||||
<td>${currentEbom.REVISION}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>등록일</th>
|
||||
<td>${currentEbom.REG_DATE}</td>
|
||||
<th>작성자</th>
|
||||
<td>${currentEbom.DEPT_NAME} / ${currentEbom.WRITER_NAME}</td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="text-align: center;">
|
||||
<p style="color: #666; margin: 10px 0;">다른 E-BOM으로 변경하려면 "E-BOM 변경" 버튼을 클릭하세요.</p>
|
||||
</div>
|
||||
</div>
|
||||
</c:if>
|
||||
|
||||
<!-- 중간: E-BOM List (처음에는 숨김 또는 표시) -->
|
||||
<div id="ebomListSection" class="ebom-list-section" style="display:none;">
|
||||
<div class="content-box">
|
||||
<div class="content-box-s">
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2><span>E-BOM List (상태: Y)</span></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
<input type="button" value="E-BOM 할당" class="plm_btns" onclick="fn_assignEbom()" style="background-color: #4CAF50; color: white;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="plmSearchZon">
|
||||
<table>
|
||||
<tr>
|
||||
<td><label for="product_cd">제품구분</label></td>
|
||||
<td>
|
||||
<select name="product_cd" id="product_cd" style="width:170px" class="select2" autocomplete="off">
|
||||
<option value="">선택</option>
|
||||
${code_map.product_cd}
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td class="label"><label for="">품번</label></td>
|
||||
<td><input type="text" name="SEARCH_PART_NO" id="SEARCH_PART_NO"></td>
|
||||
|
||||
<td class="label"><label for="">품명</label></td>
|
||||
<td><input type="text" name="SEARCH_PART_NAME" id="SEARCH_PART_NAME"></td>
|
||||
|
||||
<td class="align_r"><label>등록일</label></td>
|
||||
<td>
|
||||
<input type="text" name="search_fromDate" id="search_fromDate" style="width:90px;" autocomplete="off">~
|
||||
<input type="text" name="search_toDate" id="search_toDate" style="width:90px;" autocomplete="off">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 하단: 미리보기 -->
|
||||
<div class="ebom-preview-section">
|
||||
<h4>E-BOM 미리보기 (읽기 전용)</h4>
|
||||
<div style="width:100%; height:700px; border:1px solid #ddd; overflow: auto; background: white;">
|
||||
<iframe id="ebomPreviewFrame" style="width:100%; height:100%; border:none; pointer-events: none;"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -200,12 +200,13 @@ var columns = [
|
||||
field: 'EBOM_STATUS',
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell) {
|
||||
var objid = fnc_checkNull(cell.getData().BOM_REPORT_OBJID);
|
||||
if(objid) {
|
||||
fn_openEBomPopup(objid);
|
||||
} else {
|
||||
alert("E-BOM 정보가 없습니다.");
|
||||
}
|
||||
var bomReportObjid = fnc_checkNull(cell.getData().BOM_REPORT_OBJID);
|
||||
var projectMgmtObjid = fnc_checkNull(cell.getData().OBJID);
|
||||
var partNo = fnc_checkNull(cell.getData().PART_NO);
|
||||
var partName = fnc_checkNull(cell.getData().PART_NAME);
|
||||
|
||||
// E-BOM이 있든 없든 선택 팝업 열기 (할당된 경우 상세 + 변경 가능)
|
||||
fn_openEBomSelectPopup(projectMgmtObjid, partNo, partName, bomReportObjid);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -264,6 +265,22 @@ function fn_openEBomPopup(bomReportObjId) {
|
||||
fn_centerPopup(popup_width, popup_height, url, 'ebomPopup');
|
||||
}
|
||||
|
||||
// E-BOM 선택 팝업
|
||||
function fn_openEBomSelectPopup(projectMgmtObjid, partNo, partName, bomReportObjid) {
|
||||
var popup_width = 1200;
|
||||
var popup_height = 900;
|
||||
var url = "/productionplanning/mBomEbomSelectPopup.do?projectMgmtObjid=" + projectMgmtObjid
|
||||
+ "&partNo=" + encodeURIComponent(partNo)
|
||||
+ "&partName=" + encodeURIComponent(partName);
|
||||
|
||||
// 이미 할당된 E-BOM이 있으면 bomReportObjid 추가
|
||||
if(bomReportObjid) {
|
||||
url += "&bomReportObjid=" + bomReportObjid;
|
||||
}
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, url, 'ebomSelectPopup');
|
||||
}
|
||||
|
||||
// M-BOM 팝업
|
||||
function fn_openMBomPopup(objId) {
|
||||
var popup_width = 1800;
|
||||
|
||||
@@ -904,4 +904,70 @@ public class ProductionPlanningController extends BaseService {
|
||||
commonService.selectListPagingNew("productionplanning.mBomMgmtGridList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* M-BOM E-BOM 선택 팝업
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/productionplanning/mBomEbomSelectPopup.do")
|
||||
public String mBomEbomSelectPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
try {
|
||||
// 필요한 코드 맵 설정 (structureList.jsp 참고)
|
||||
Map<String, Object> codeMap = new HashMap<>();
|
||||
// 제품구분 코드 - structureList와 동일하게 설정
|
||||
codeMap.put("product_cd", commonService.bizMakeOptionList("0000001", CommonUtils.nullToEmpty((String)paramMap.get("product_cd")), "common.getCodeselect"));
|
||||
request.setAttribute("code_map", codeMap);
|
||||
|
||||
// 현재 할당된 E-BOM 정보 조회
|
||||
String bomReportObjid = CommonUtils.checkNull(paramMap.get("bomReportObjid"));
|
||||
if(!"".equals(bomReportObjid)) {
|
||||
// E-BOM 정보 조회
|
||||
Map<String, Object> ebomInfo = productionPlanningService.getEbomInfo(bomReportObjid);
|
||||
request.setAttribute("currentEbom", ebomInfo);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return "/productionplanning/mBomEbomSelectPopup";
|
||||
}
|
||||
|
||||
/**
|
||||
* E-BOM을 M-BOM(PROJECT_MGMT)에 할당
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/productionplanning/assignEbomToMbom.do")
|
||||
public Map<String, Object> assignEbomToMbom(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
try {
|
||||
String projectMgmtObjid = CommonUtils.checkNull(paramMap.get("projectMgmtObjid"));
|
||||
String bomReportObjid = CommonUtils.checkNull(paramMap.get("bomReportObjid"));
|
||||
|
||||
if(projectMgmtObjid.isEmpty() || bomReportObjid.isEmpty()) {
|
||||
resultMap.put("success", false);
|
||||
resultMap.put("message", "필수 파라미터가 누락되었습니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// PROJECT_MGMT 테이블의 PART_OBJID 업데이트
|
||||
int updateResult = productionPlanningService.assignEbomToProject(projectMgmtObjid, bomReportObjid);
|
||||
|
||||
if(updateResult > 0) {
|
||||
resultMap.put("success", true);
|
||||
resultMap.put("message", "E-BOM이 할당되었습니다.");
|
||||
} else {
|
||||
resultMap.put("success", false);
|
||||
resultMap.put("message", "할당에 실패했습니다.");
|
||||
}
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
resultMap.put("success", false);
|
||||
resultMap.put("message", "오류가 발생했습니다: " + e.getMessage());
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2928,7 +2928,7 @@
|
||||
FROM CONTRACT_ITEM CI
|
||||
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
|
||||
AND CI.PART_OBJID = PM.PART_OBJID
|
||||
AND CI.STATUS = 'ACTIVE'),
|
||||
AND CI.STATUS = 'ACTIVE' LIMIT 1),
|
||||
PM.DUE_DATE,
|
||||
CM.req_del_date
|
||||
) AS REQ_DEL_DATE,
|
||||
@@ -2938,19 +2938,31 @@
|
||||
FROM CONTRACT_ITEM CI
|
||||
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
|
||||
AND CI.PART_OBJID = PM.PART_OBJID
|
||||
AND CI.STATUS = 'ACTIVE'),
|
||||
AND CI.STATUS = 'ACTIVE' LIMIT 1),
|
||||
''
|
||||
) AS CUSTOMER_REQUEST,
|
||||
PBR.OBJID AS BOM_REPORT_OBJID,
|
||||
COALESCE(PBR.STATUS, '') AS EBOM_STATUS,
|
||||
COALESCE(TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD'), '') AS EBOM_REGDATE,
|
||||
-- E-BOM 정보: PM.PART_OBJID가 E-BOM OBJID를 직접 가리킴
|
||||
PM.PART_OBJID AS BOM_REPORT_OBJID,
|
||||
COALESCE(
|
||||
(SELECT PBR.STATUS
|
||||
FROM PART_BOM_REPORT PBR
|
||||
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS EBOM_STATUS,
|
||||
COALESCE(
|
||||
(SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
|
||||
FROM PART_BOM_REPORT PBR
|
||||
WHERE PBR.OBJID::VARCHAR = PM.PART_OBJID
|
||||
LIMIT 1),
|
||||
''
|
||||
) AS EBOM_REGDATE,
|
||||
COALESCE(PM.MBOM_STATUS, '') AS MBOM_STATUS,
|
||||
'1.0' AS MBOM_VERSION,
|
||||
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS MBOM_REGDATE
|
||||
FROM
|
||||
PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
LEFT JOIN PART_BOM_REPORT PBR ON PM.CONTRACT_OBJID = PBR.CONTRACT_OBJID::VARCHAR
|
||||
WHERE 1=1
|
||||
AND PM.PROJECT_NO IS NOT NULL
|
||||
AND PM.PROJECT_NO != ''
|
||||
@@ -2964,4 +2976,31 @@
|
||||
</if>
|
||||
ORDER BY PM.REGDATE DESC
|
||||
</select>
|
||||
|
||||
<!-- E-BOM을 PROJECT_MGMT에 할당 -->
|
||||
<update id="assignEbomToProject" parameterType="map">
|
||||
UPDATE PROJECT_MGMT
|
||||
SET
|
||||
PART_OBJID = #{bomReportObjid}
|
||||
WHERE OBJID = #{projectMgmtObjid}
|
||||
</update>
|
||||
|
||||
<!-- E-BOM 정보 조회 -->
|
||||
<select id="getEbomInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
T.OBJID,
|
||||
T.PRODUCT_CD,
|
||||
CODE_NAME(T.PRODUCT_CD) as PRODUCT_NAME,
|
||||
T.PART_NO,
|
||||
T.PART_NAME,
|
||||
T.STATUS,
|
||||
T.REVISION,
|
||||
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
|
||||
UI.USER_NAME AS WRITER_NAME,
|
||||
UI.DEPT_NAME
|
||||
FROM
|
||||
PART_BOM_REPORT T
|
||||
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
|
||||
WHERE T.OBJID::VARCHAR = #{objid}
|
||||
</select>
|
||||
</mapper>
|
||||
|
||||
@@ -692,4 +692,61 @@ public class ProductionPlanningService {
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* E-BOM을 PROJECT_MGMT에 할당
|
||||
* @param projectMgmtObjid
|
||||
* @param bomReportObjid
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
public int assignEbomToProject(String projectMgmtObjid, String bomReportObjid) throws Exception {
|
||||
SqlSession sqlSession = null;
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
Map<String, Object> paramMap = new HashMap<>();
|
||||
paramMap.put("projectMgmtObjid", projectMgmtObjid);
|
||||
paramMap.put("bomReportObjid", bomReportObjid);
|
||||
|
||||
int result = sqlSession.update("productionplanning.assignEbomToProject", paramMap);
|
||||
sqlSession.commit();
|
||||
|
||||
return result;
|
||||
} catch(Exception e) {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.rollback();
|
||||
}
|
||||
throw e;
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* E-BOM 정보 조회
|
||||
* @param bomReportObjid
|
||||
* @return
|
||||
*/
|
||||
public Map<String, Object> getEbomInfo(String bomReportObjid) {
|
||||
Map<String, Object> resultMap = new HashMap<>();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
Map<String, Object> paramMap = new HashMap<>();
|
||||
paramMap.put("objid", bomReportObjid);
|
||||
resultMap = sqlSession.selectOne("productionplanning.getEbomInfo", paramMap);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user