Files
wace_plm/WebContent/WEB-INF/view/salesMng/salesMngBOMListPopUp.jsp
chpark da06c4684c Initial commit: WACE PLM with database initialization features
- Add Docker Compose configurations for dev, prod, and standalone environments
- Add database initialization scripts (init-db.sh, init-db-docker.sh)
- Add enhanced start-docker-linux.sh with DB init support
- Add comprehensive database initialization guide
- Support for automatic dbexport.pgsql import on first run
- Include safety checks for production environment
2025-08-29 15:46:08 +09:00

582 lines
22 KiB
Plaintext

<%@ 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"%>
<%@ 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>
<script>
var productTypeCodeList = fnc_getCodeList("<%=Constants.SALES_PRODUCT_TYPE_CODE%>");
var salesPartCodeList = fnc_getCodeList("<%=Constants.SALES_PART_CODE%>");
var paleteCodeList = fnc_getCodeList("<%=Constants.PALETTE_CODE%>");
var sourcingCodeList = fnc_getCodeList("<%=Constants.SOURCING_CODE%>");
var processCodeList = fnc_getCodeList("<%=Constants.PROCESS_CODE%>");
$(document).ready(function(){
$("._table1").scroll(function () {
$("._table2").scrollLeft($("._table1").scrollLeft());
});
$("._table2").scroll(function () {
$("._table1").scrollTop($("._table2").scrollTop());
$("._table1").scrollLeft($("._table2").scrollLeft());
});
$("#btnSave").click(function(){
fn_save();
});
$("#btnClose").click(function(){
opener.fn_search();
self.close();
});
$(".btnToggle").click(function(){
var src = $(this).attr("src");
if(src.indexOf("Plus")>-1){
$(this).attr("src", "/images/btnMinus.png");
}else if(src.indexOf("Minus")>-1){
$(this).attr("src", "/images/btnPlus.png");
}
var choosedTr = $(this).parents(".dataTr:first");
var choosedBRObjId = $(choosedTr).attr("data-BOM_REPORT_OBJID");
var choosedPath = $(choosedTr).attr("data-PATH").replaceAll("{","").replaceAll("}","");
$(".dataTr").each(function(i){
var _lev = $(this).attr("data-LEVEL");
var _BRObjId = $(this).attr("data-BOM_REPORT_OBJID");
var _Path = $(this).attr("data-PATH").replaceAll("{","").replaceAll("}","");
if(_lev == 1 || _BRObjId != choosedBRObjId){
return true;
}
if(_Path.indexOf(choosedPath)>-1){
$(this).toggle();
}
});
});
//level별 색상
$(".dataTr").each(function(i){
var lev = $(this).attr("data-LEVEL");
if(lev == 1){
$(this).css("background-color", "#fde9d9");
}else if(lev == 2){
$(this).css("background-color", "#daeef3");
}else if(lev == 3){
$(this).css("background-color", "#e4dfec");
}else if(lev == 4){
$(this).css("background-color", "#ebf1de");
}else if(lev == 5){
$(this).css("background-color", "#f2f2f2");
}else if(lev == 6){
$(this).css("background-color", "#f2dcdb");
}else if(lev == 7){
$(this).css("background-color", "#eeece1");
}else if(lev == 8){
$(this).css("background-color", "#dce6f1");
}else if(lev == 9){
$(this).css("background-color", "#FFFFEB");
}else if(lev == 10){
$(this).css("background-color", "#ffffff");
}
});
$("input[name='OBJID']").each(function(i){
var targetObjId = $(this).val();
fn_setProductTypeCode(targetObjId, productTypeCodeList);
fn_setPartnerCode(targetObjId);
fn_setUnitPrice(targetObjId);
fn_setSelectAppend(salesPartCodeList,"sales_part_code_"+targetObjId,$("#TEMP_SALES_PART_CODE_"+targetObjId).val());
fn_setSelectAppend(paleteCodeList,"palette_code_"+targetObjId,$("#TEMP_PALETTE_CODE_"+targetObjId).val());
fn_setSelectAppend(sourcingCodeList,"sourcing_code_"+targetObjId,$("#TEMP_SOURCING_CODE_"+targetObjId).val());
fn_setSelectAppend(processCodeList,"process1_code_"+targetObjId,$("#TEMP_PROCESS1_CODE_"+targetObjId).val());
fn_setSelectAppend(processCodeList,"process2_code_"+targetObjId,$("#TEMP_PROCESS2_CODE_"+targetObjId).val());
fn_setSelectAppend(processCodeList,"process3_code_"+targetObjId,$("#TEMP_PROCESS3_CODE_"+targetObjId).val());
fn_setSelectAppend(processCodeList,"process4_code_"+targetObjId,$("#TEMP_PROCESS4_CODE_"+targetObjId).val());
});
});
function fn_setSelectAppend(resultList,selectboxId,selectedVal){
$("#"+selectboxId).empty();
$("#"+selectboxId).append("<option value=''>선택</option>");
if(resultList != null && 0 < resultList.length){
for (var i = 0; i < resultList.length; i++) {
var commonCodeId = resultList[i].CODE_ID;
var commonCodeName = resultList[i].CODE_NAME;
$("#"+selectboxId).append("<option value='"+commonCodeId+"'>"+commonCodeName+"</option>");
}
$("#"+selectboxId).val(selectedVal);
}
}
function fn_setUnitPrice(targetObjId){
$("#unit_price_"+targetObjId).empty();
var unitPrice = "";
var replacepartner_price = $("#partner_price_"+targetObjId).val();
if(replacepartner_price){
replacepartner_price = replacepartner_price.replace(/,/gi,"")
}
var partnerPrice = fnc_checkNull(replacepartner_price);
var qty = fnc_checkNull($("#QTY_"+targetObjId).val());
if("" != partnerPrice && "" != qty){
unitPrice = (partnerPrice * qty);
}
unitPrice = addComma(unitPrice);
$("#unit_price_"+targetObjId).append(unitPrice);
}
function fn_save(){
if(confirm("저장하시겠습니까?")){
$.ajax({
url:"/salesMng/saveSalesMngBOM.do",
type:"POST",
data:$("#form1").serialize(),
dataType:"json",
async:false,
success:function(data){
Swal.fire(data.msg);
if(data.result){
opener.fn_search();
self.close(0);
}
},
error: function(jqxhr, status, error){
}
});
}
}
function fn_setProductTypeCode(targetObjId,resultList){
var productTypeCodeName = "product_type_code_"+targetObjId;
var tempVal = $("#TEMP_PRODUCT_TYPE_CODE_"+targetObjId).val();
$("select[name='"+productTypeCodeName+"']").empty();
$("select[name='"+productTypeCodeName+"']").append("<option value=''>선택</option>");
if(resultList != null && 0 < resultList.length){
for (var i = 0; i < resultList.length; i++) {
var commonCodeId = resultList[i].CODE_ID;
var commonCodeName = resultList[i].CODE_NAME;
$("select[name='"+productTypeCodeName+"']").append("<option value='"+commonCodeId+"'>"+commonCodeName+"</option>");
}
$("select[name='"+productTypeCodeName+"']").val(tempVal);
}
}
//파트에 해당하는 발주특성의 정보를 가져온다.
function fn_getOrderSpecMngList(partObjId){
var resultList = null;
$.ajax({
url:"/salesMng/getOrderSpecMngList.do",
type:"POST",
data:{"PART_OBJID":partObjId},
dataType:"json",
async:false,
success:function(data){
resultList = data
},
error: function(jqxhr, status, error){
}
});
return resultList;
}
function fn_setPartnerCode(targetObjId){
var partObjId = $("#PART_OBJID_"+targetObjId).val();
var partnerList = fn_getOrderSpecMngList(partObjId);
var tempPartnerVal = fnc_checkNull($("#TEMP_PARTNER_OBJID_"+targetObjId).val());
var tempPartnerPrice = fnc_checkNull($("#TEMP_PARTNER_PRICE_"+targetObjId).val());
var tempPartnerRemark = fnc_checkNull($("#TEMP_PARTNER_REMARK_"+targetObjId).val());
$("select[name='partner_objid_"+targetObjId+"']").empty();
$("select[name='partner_objid_"+targetObjId+"']").append("<option value=''>선택</option>");
if(partnerList != null && 0 < partnerList.length){
for (var i = 0; i < partnerList.length; i++){
var partnerObjId = partnerList[i].PARTNER_OBJID;
var partnerName = partnerList[i].PARTNER_NAME;
var partnerPrice = partnerList[i].PARTNER_PRICE;
var partnerRemark = partnerList[i].REMARK;
$("select[name='partner_objid_"+targetObjId+"']").append("<option value='"+partnerObjId+"' data-PARTNER_PRICE='"+partnerPrice+"' data-PARTNER_REMARK='"+partnerRemark+"'>"+partnerName+"</option>");
}
if("" != tempPartnerVal){
$("select[name='partner_objid_"+targetObjId+"']").val(tempPartnerVal);
$("select[name='partner_objid_"+targetObjId+"']").trigger("change");
if("" != tempPartnerPrice){
var commatempPartnerPrice = addComma(tempPartnerPrice);
$("input[name='partner_price_"+targetObjId+"']").val(commatempPartnerPrice);
fn_setUnitPrice(targetObjId);
}
if("" != tempPartnerRemark){
$("input[name='partner_remark_"+targetObjId+"']").val(tempPartnerRemark);
}
}else{
if(0 < partnerList.length){
$("select[name='partner_objid_"+targetObjId+"'] option:eq(1)").prop("selected", true);
$("select[name='partner_objid_"+targetObjId+"']").trigger("change");
}
}
}
}
function fn_search(){
document.form1.actionType.value = "search";
document.form1.action = "/partmgmt/structureDescendingList.do";
document.form1.submit();
}
function fn_excelExport(){
document.form1.actionType.value = "excel";
document.form1.action = "/partmgmt/structureAscendingListPopup.do";
document.form1.submit();
}
function openPartMngPopup(objId){
var hiddenForm = document.hiddenForm;
var url = "/partMng/partMngFormPopUp.do";
if("" != objId){
url = "/partMng/partMngDetailPopUp.do";
}
var target = "partMngPopUp";
window.open(url,target,"width=600, height=700, menubars=no, scrollbars=yes, resizable=yes");
hiddenForm.action = url;
hiddenForm.OBJID.value = objId;
hiddenForm.target = target;
hiddenForm.submit();
}
function fn_setOrderSpecMngInfo(targetObjId){
var selectedPartnerPrice = fnc_checkNull($("select[name='partner_objid_"+targetObjId+"'] option:selected").attr("data-PARTNER_PRICE"));
var commaselectedPartnerPrice = addComma(selectedPartnerPrice);
$("input[name='partner_price_"+targetObjId+"']").val(commaselectedPartnerPrice);
fn_setUnitPrice(targetObjId);
}
function fnc_numberOnly(obj){
$("#"+obj.attr("id")).val(addComma(obj.val().replace(/[^0-9]/g,"")));
//.replace(/[^0-9]/g,""))
}
function addComma(data) {
return data.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
</script>
</head>
<body class="backcolor">
<form name="hiddenForm" id="hiddenForm" method="post">
<input type="hidden" name="PART_OBJID" id="PART_OBJID">
<input type="hidden" name="OBJID" id="OBJID">
</form>
<form name="form1" id="form1" action="" method="post">
<input type="hidden" name="actionType" id="actionType" value="" />
<input type="hidden" name="bom_report_objid" value="${param.bom_report_objid}" />
<div class="min_part_enroll">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name">
<h2>
<span>구매 BOM 상세</span>
</h2>
</div>
<div id="plmSearchZon" style="display:none;">
<table>
<tbody>
<tr>
<td><label for="product_code">기종(모델)명</label></td>
<td>
<select name="product_code" id="product_code" style="" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.product_code}
</select>
</td>
<td><label for="product_mgmt_spec">사양</label></td>
<td>
<select name="product_mgmt_spec" id="product_mgmt_spec" style="" class="select2" autocomplete="off">
<option value="">선택</option>
</select>
</td>
<td><label for="">UPG_NO</label></td>
<td>
<select name="upg_no" id="upg_no" class="select2" style="width:250px;" autocomplete="off"></select>
</td>
<td class="align_r">
<label for="" class="">Part No</label>
</td>
<td>
<input type="text" name="search_partNo" id="search_partNo" value="${param.search_partNo}" class="text_area" maxlength="15"/>
</td>
<td class="align_r">
<label for="" class="">Part Name</label>
</td>
<td>
<input type="text" name="search_partName" id="search_partName" value="${param.search_partName}" class="text_area" style="width:350px;" maxlength="20" placeholder="ex) HEX. BOLT"/>
</td>
</tr>
</tbody>
</table>
</div>
<div class="contents_page_basic_margin">
<div class="in_table_scroll_wrap _table1" style="height:53px;width:99.2%;">
<table class="plm_table" style="height:53px;width:99.4%;">
<colgroup>
<col width="40px" />
<col width="120px" /><!-- 기종 -->
<col width="120px" /><!-- PART -->
<col width="80px" /><!-- 파렛트 -->
<c:forEach var="item" items="${COL_NAME_LIST}" varStatus="status">
<col width="35px" />
</c:forEach>
<col width="49px" /><!-- Revision -->
<col width="120px" /><!-- 품번 -->
<col width="120px" /><!-- 품명 -->
<col width="100px" /><!-- 형상 -->
<col width="100px" /><!-- 재질 -->
<col width="130px" /><!-- 규격 -->
<col width="60px" /><!-- 대당수량 -->
<col width="90px" /><!-- 소싱-->
<col width="90px" /><!-- P1-->
<col width="90px" /><!-- P2-->
<col width="90px" /><!-- P3-->
<col width="90px" /><!-- P4-->
<col width="140px" /><!-- 공급업체 -->
<col width="90px" /><!-- 단가 -->
<col width="110px" /><!-- 설변/추가 -->
<col width="110px" /><!-- 대당금액(대당수량*단가) -->
<col width="200px" /><!-- 비고 -->
</colgroup>
<thead>
<tr class="plm_thead">
<td rowspan="2"></td>
<td rowspan="2">기종</td>
<td rowspan="2">PART</td>
<td rowspan="2">파렛트</td>
<td colspan="${fn:length(COL_NAME_LIST)}">Level</td>
<td rowspan="2">R</td>
<td rowspan="2">품번</td>
<td rowspan="2">품명</td>
<td rowspan="2">형상</td>
<td rowspan="2">재질</td>
<td rowspan="2">규격</td>
<td rowspan="2">대당수량</td>
<td rowspan="2">소싱</td>
<td rowspan="2">P1</td>
<td rowspan="2">P2</td>
<td rowspan="2">P3</td>
<td rowspan="2">P4</td>
<td rowspan="2">업체명</td>
<td rowspan="2">단가</td>
<td rowspan="2">설변/추가</td>
<td rowspan="2">대당금액</br>(대당수량*단가)</td>
<td rowspan="2">비고</td>
</tr>
<tr class="plm_thead">
<c:forEach var="item" items="${COL_NAME_LIST}" varStatus="status">
<td>${item.COL_HEADER_VAL}</td>
</c:forEach>
</tr>
</thead>
</table>
</div>
<div class="in_table_scroll_wrap _table2" style="height:580px; width:100%;">
<table class="plm_table">
<colgroup>
<col width="40px" />
<col width="120px" /><!-- 기종 -->
<col width="120px" /><!-- PART -->
<col width="80px" /><!-- 파렛트 -->
<c:forEach var="item" items="${COL_NAME_LIST}" varStatus="status">
<col width="35px" />
</c:forEach>
<col width="49px" /><!-- Revision -->
<col width="120px" /><!-- 품번 -->
<col width="120px" /><!-- 품명 -->
<col width="100px" /><!-- 형상 -->
<col width="100px" /><!-- 재질 -->
<col width="130px" /><!-- 규격 -->
<col width="60px" /><!-- 대당수량 -->
<col width="90px" /><!-- 소싱-->
<col width="90px" /><!-- P1-->
<col width="90px" /><!-- P2-->
<col width="90px" /><!-- P3-->
<col width="90px" /><!-- P4-->
<col width="140px" /><!-- 공급업체 -->
<col width="90px" /><!-- 단가 -->
<col width="110px" /><!-- 설변/추가 -->
<col width="110px" /><!-- 대당금액(대당수량*단가) -->
<col width="200px" /><!-- 비고 -->
</colgroup>
<tbody>
<c:choose>
<c:when test="${empty LIST}">
<tr>
<td colspan="${fn:length(COL_NAME_LIST)+13}" align="center">조회된 정보가 없습니다.</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach var="item" items="${LIST}" varStatus="status">
<input type="hidden" name="OBJID" value="${item.OBJID}">
<input type="hidden" name="PART_OBJID_${item.OBJID}" id="PART_OBJID_${item.OBJID}" value="${item.PART_OBJID}">
<input type="hidden" name="SALES_BOM_OBJID_${item.OBJID}" id="SALES_BOM_OBJID_${item.OBJID}" value="${item.SALES_BOM_OBJID}">
<input type="hidden" name="QTY_${item.OBJID}" id="QTY_${item.OBJID}" value="${item.QTY}">
<input type="hidden" name="TEMP_PRODUCT_TYPE_CODE_${item.OBJID}" id="TEMP_PRODUCT_TYPE_CODE_${item.OBJID}" value="${item.PRODUCT_TYPE_CODE}">
<input type="hidden" name="TEMP_PARTNER_OBJID_${item.OBJID}" id="TEMP_PARTNER_OBJID_${item.OBJID}" value="${item.PARTNER_OBJID}">
<input type="hidden" name="TEMP_PARTNER_PRICE_${item.OBJID}" id="TEMP_PARTNER_PRICE_${item.OBJID}" value="${item.PARTNER_PRICE}">
<input type="hidden" name="TEMP_PARTNER_REMARK_${item.OBJID}" id="TEMP_PARTNER_REMARK_${item.OBJID}" value="${item.PARTNER_REMARK}">
<input type="hidden" name="TEMP_SALES_PART_CODE_${item.OBJID}" id="TEMP_SALES_PART_CODE_${item.OBJID}" value="${item.SALES_PART_CODE}">
<input type="hidden" name="TEMP_PALETTE_CODE_${item.OBJID}" id="TEMP_PALETTE_CODE_${item.OBJID}" value="${item.PALETTE_CODE}">
<input type="hidden" name="TEMP_SOURCING_CODE_${item.OBJID}" id="TEMP_SOURCING_CODE_${item.OBJID}" value="${item.SOURCING_CODE}">
<input type="hidden" name="TEMP_PROCESS1_CODE_${item.OBJID}" id="TEMP_PROCESS1_CODE_${item.OBJID}" value="${item.PROCESS1_CODE}">
<input type="hidden" name="TEMP_PROCESS2_CODE_${item.OBJID}" id="TEMP_PROCESS2_CODE_${item.OBJID}" value="${item.PROCESS2_CODE}">
<input type="hidden" name="TEMP_PROCESS3_CODE_${item.OBJID}" id="TEMP_PROCESS3_CODE_${item.OBJID}" value="${item.PROCESS3_CODE}">
<input type="hidden" name="TEMP_PROCESS4_CODE_${item.OBJID}" id="TEMP_PROCESS4_CODE_${item.OBJID}" value="${item.PROCESS4_CODE}">
<tr class="dataTr" data-LEVEL="${item.LEV}" data-BOM_REPORT_OBJID="${item.BOM_REPORT_OBJID}" data-PATH="${item.PATH}">
<td>
<c:if test="${item.LEV eq '1' and item.LEAF eq '0'}">
<img src="/images/btnMinus.png" width="13px" height="13px" class="btnToggle" style="${item.LEV eq '1' and item.LEAF eq '0'?'cursor:pointer;':''}">
</c:if>
</td>
<td title="${item.PRODUCT_CODE}" class="align_l">${item.PRODUCT_CODE}</td>
<td class="align_l">
<select name="sales_part_code_${item.OBJID}" id="sales_part_code_${item.OBJID}"></select>
</td>
<td class="align_l">
<select name="palette_code_${item.OBJID}" id="palette_code_${item.OBJID}"></select>
</td>
<c:forEach var="colListItem" items="${COL_NAME_LIST}" varStatus="status">
<c:set var="colName" value="${colListItem.COL_NAME}" />
<c:set var="colVal" value="${colListItem.COL_VAL}" />
<td title="${item[colName]}">${item[colVal]}</td>
</c:forEach>
<td title="${item.REVISION}" class="align_c">${item.REVISION}</td>
<td title="${item.PART_NO}" class="align_l"><a href="#" onclick="openPartMngPopup('${item.PART_OBJID}');">${item.PART_NO}</a></td>
<td style="text-align: left !important;" title="${item.PART_NAME}">
<a href="#" class="btnPartDetail" data-PART_OBJID="${item.PART_OBJID}">${item.PART_NAME}</a>
</td>
<td title="" class="align_c">
<c:if test="${!empty item.SAVED_FILE_NAME and !empty item.REAL_FILE_NAME and !empty item.FILE_PATH}">
<img src="#" height='85px' width='100%' onclick="fnc_openImagePopUp(this.src)" data-SRC="/common/viewImage.do?realFileName=${item.REAL_FILE_NAME}&savedFileName=${item.SAVED_FILE_NAME}&attDir=${item.FILE_PATH}" />
</c:if>
</td>
<td title="${item.MATERIAL}" class="align_c">${item.MATERIAL}</td>
<td title="${item.SPEC}" class="align_l">${item.SPEC}</td>
<td title="${item.QTY}" class="align_c">${item.QTY}</td>
<td class="align_l">
<select name="sourcing_code_${item.OBJID}" id="sourcing_code_${item.OBJID}"></select>
</td>
<td class="align_l">
<select name="process1_code_${item.OBJID}" id="process1_code_${item.OBJID}"></select>
</td>
<td class="align_l">
<select name="process2_code_${item.OBJID}" id="process2_code_${item.OBJID}"></select>
</td>
<td class="align_l">
<select name="process3_code_${item.OBJID}" id="process3_code_${item.OBJID}"></select>
</td>
<td class="align_l">
<select name="process4_code_${item.OBJID}" id="process4_code_${item.OBJID}"></select>
</td>
<td class="align_l" >
<select name="partner_objid_${item.OBJID}" onchange="fn_setOrderSpecMngInfo('${item.OBJID}');"></select>
</td>
<td class="align_l">
<input type="text" name="partner_price_${item.OBJID}" id="partner_price_${item.OBJID}" value="<fmt:formatNumber value="${item.PARTNER_PRICE}" pattern="#,###" />" onKeyup='javascript:fnc_numberOnly($(this))' onchange="fn_setUnitPrice('${item.OBJID}');">
</td>
<td title="${empty item.EO_DATE ? item.DESIGN_DATE : item.EO_DATE}" class="align_c">${empty item.EO_DATE ? item.DESIGN_DATE : item.EO_DATE}</td>
<td class="align_l" id="unit_price_${item.OBJID}"></td>
<td class="align_l">
<input type="text" name="partner_remark_${item.OBJID}" id="partner_remark_${item.OBJID}" value="${item.REMARK}">
</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
</div>
</div>
<div class="btn_wrap">
<div class="plm_btn_wrap_center">
<input type="button" value="저장" id="btnSave" class="plm_btns">
<input type="button" value="닫기" id="btnClose" class="plm_btns">
</div>
</div>
</div>
</div>
</form>
</body>
<style>
.container::-webkit-scrollbar-thumb {background: linear-gradient(to bottom, #f5d78e, #f5d78e) !important;}
.container::-webkit-scrollbar-track {background-color: white !important;}
.container::-webkit-scrollbar-button { display: none !important;}
</style>
</html>