- 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
469 lines
16 KiB
Plaintext
469 lines
16 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" %>
|
|
<%
|
|
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
|
|
String userId = CommonUtils.checkNull(person.getUserId());
|
|
%>
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<title><%=Constants.SYSTEM_NAME%></title>
|
|
</head>
|
|
<script>
|
|
$(function() {
|
|
$(document).ready(function() {
|
|
$("#btnClose").click(function(){
|
|
self.close(0);
|
|
});
|
|
$("#btnSave").click(function(){
|
|
fn_save();
|
|
});
|
|
|
|
//fn_getPurchaseOrderTargetPartList();
|
|
fnc_datepickForName();
|
|
|
|
$("input[numberOnly='']")
|
|
.each(function(){
|
|
$(this).css({'text-align':'right'})
|
|
})
|
|
.on("keyup", function() {
|
|
$(this).val(fn_addComma($(this).val().replace(/[^0-9]/g,"")));
|
|
});
|
|
|
|
$("#btnAdd").click(function(){
|
|
|
|
var selectedRows = _tabulGrid.getSelectedRows();
|
|
if (selectedRows.length < 1) {
|
|
alert("추가할 대상을 선택하세요.");
|
|
} else if (selectedRows.length > 1) {
|
|
alert("대상을 한건만 선택하세요.");
|
|
}else{
|
|
var row = selectedRows[0];
|
|
var rowData = row.getData();
|
|
var taskName = rowData.TASK_NAME;
|
|
var vcCode = rowData.VC_CODE;
|
|
var selectedIndex = _tabulGrid.getSelectedRows()[0].getPosition(true); // 선택된 행의 인덱스
|
|
//alert(selectedIndex);
|
|
var sameRows = _tabulGrid.searchRows("TASK_NAME", "=", taskName);
|
|
var maxNo = '01';
|
|
sameRows.forEach(function (sameRow) {
|
|
var sameVcCode = fnc_checkNull(sameRow.getData().VC_CODE).replace("VC", "");
|
|
if(Number(maxNo) < Number(sameVcCode) ){
|
|
maxNo = sameVcCode;
|
|
selectedIndex = sameRow.getPosition(true);
|
|
}
|
|
});
|
|
maxNo = (Number(maxNo)+1);
|
|
//if(maxNo.length < 2){
|
|
if(maxNo < 10){
|
|
maxNo = '0'+maxNo;
|
|
}
|
|
|
|
var newData = JSON.parse(JSON.stringify(rowData)); //{TASK_NAME:taskName, VC_CODE:'VC'+maxNo};
|
|
//newData = rowData;
|
|
newData.VC_CODE = 'VC'+maxNo;
|
|
//newData.OBJID = '';
|
|
<c:choose>
|
|
<c:when test="${empty projectList}">
|
|
</c:when>
|
|
<c:otherwise>
|
|
<c:forEach var="info" items="${projectList}" varStatus="status">
|
|
newData.OBJID_${info.PROJECT_NO} = '';
|
|
newData.VALUE_${info.PROJECT_NO} = '';
|
|
</c:forEach>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
/*
|
|
//_tabulGrid.addRow({}, false, selectedRows[0]._row.getIndex() + 1);
|
|
//selectedRow[0]._row.getIndex()
|
|
//alert(selectedIndex);
|
|
// 선택된 행 다음에 새로운 행을 추가
|
|
_tabulGrid.addRow(newData, true, selectedIndex + 1)
|
|
.then((row) => {
|
|
var position = row.getPosition(); //get position of row
|
|
//alert(position);
|
|
});
|
|
//_tabulGrid.addRow({});
|
|
*/
|
|
|
|
// 특정 인덱스에 데이터를 삽입하고 테이블을 다시 렌더링
|
|
var indexToInsert = selectedIndex;
|
|
var tableData = _tabulGrid.getData();
|
|
tableData.splice(indexToInsert, 0, newData);
|
|
_tabulGrid.setData(tableData);
|
|
}
|
|
|
|
//Table2의 3번째 tr 다음에 tr 삽입
|
|
//var table2tr3rd = $('#dataTable > tbody').children()[2];
|
|
/* newTable
|
|
var newTr = $("#dataTable > tbody > tr:last").clone();
|
|
$("#dataTable > tbody > tr:last").after(newTr);
|
|
$(lastTd).next().css('background-color', "#bbbbbb");
|
|
$(lastTd).find('.select2').select2();
|
|
fnc_datepick();
|
|
*/
|
|
|
|
//$("#dataTable > tbody > tr:last").find('.select2').select2();
|
|
//fnc_datepick();
|
|
});
|
|
|
|
$("#btnDelete").click(function(){
|
|
var selectedRows = _tabulGrid.getSelectedRows();
|
|
if (selectedRows.length > 0) {
|
|
var existsVC01 = false;
|
|
selectedRows.forEach(function (row) {
|
|
if('VC01' == row.getData().VC_CODE){
|
|
existsVC01 = true;
|
|
}
|
|
});
|
|
if(existsVC01){
|
|
alert("VC01은 삭제 할 수 없습니다.");
|
|
return;
|
|
}
|
|
if(confirm("삭제하시겠습니까?")){ // 삭제 후 저장하여야 최종 삭제됩니다.
|
|
|
|
//var checkArr = new Array();
|
|
var param = $("#form1").serializeObject();
|
|
selectedRows.forEach(function (row, i) {
|
|
//row.delete();
|
|
//param.dataListJson[i] = {UNIT_OBJID : row.getData().UNIT_OBJID, VC_CODE : row.getData().VC_CODE};
|
|
});
|
|
//param.dataListJson = JSON.stringify(_tabulGrid.getData());
|
|
param.dataListJson = JSON.stringify(_tabulGrid.getSelectedData());
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "/productKindSpec/deleteProductKindSpec.do",
|
|
//data: $("#form1").serialize(),
|
|
//data: $("#form1").serializeObject(),
|
|
data: param,
|
|
//data: {"dataListJson" : JSON.stringify(_tabulGrid.getData())},
|
|
dataType:"json",
|
|
success:function(data){
|
|
alert(data.msg);
|
|
if(data.result){
|
|
|
|
selectedRows.forEach(function (row) {
|
|
row.delete();
|
|
});
|
|
//opener.fn_search();
|
|
//self.close();
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
}
|
|
} else {
|
|
alert("삭제할 대상을 선택하세요.");
|
|
}
|
|
});
|
|
|
|
//var cnt = fnc_checkNull(${masterInfo.FACILITY_QTY}, 1);
|
|
var cnt = fnc_checkNull(${fn:length(projectList)}, 1);
|
|
window.resizeTo(490+(cnt*100), 990);
|
|
|
|
fn_search();
|
|
});
|
|
});
|
|
|
|
</script>
|
|
<script>
|
|
|
|
var columns = [
|
|
{title:'OBJID_PROJECT',field:'OBJID_PROJECT' ,visible:false},
|
|
{title:'UNIT_OBJID',field:'UNIT_OBJID' ,visible:false},
|
|
{title:'SPEC_OBJID',field:'SPEC_OBJID' ,visible:false},
|
|
|
|
/*
|
|
{ title : '신청번호', field : 'EXPENSE_ID',
|
|
headerHozAlign : 'center', hozAlign : 'center', width : '70',
|
|
formatter : fnc_createGridAnchorTag,
|
|
cellClick : function(e, cell) {
|
|
fn_apply(cell.getData().EXPENSE_MASTER_OBJID);
|
|
}
|
|
},
|
|
{ title : '정산금액', field : 'SETTLE_AMOUNT',
|
|
headerHozAlign : 'center', hozAlign : 'center', width : '70',
|
|
formatter:"money", formatterParams:{ thousand:",", symbolAfter:"p", precision:false, }
|
|
},
|
|
{title:'PROJECT_NO',field:'PROJECT_NO' ,visible:false},
|
|
*/
|
|
{headerHozAlign : 'center', hozAlign : 'left ', width : '300', title : '유닛명', field : 'TASK_NAME' },
|
|
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '사양', field : 'VC_CODE' },
|
|
|
|
<c:choose>
|
|
<c:when test="${empty projectList}">
|
|
</c:when>
|
|
<c:otherwise>
|
|
<c:forEach var="info" items="${projectList}" varStatus="status">
|
|
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : 'OBJID_${info.PROJECT_NO}', field : 'OBJID_${info.PROJECT_NO}', headerSort:false, visible:false},
|
|
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '${info.PROJECT_NO}', field : 'VALUE_${info.PROJECT_NO}', headerSort:false,
|
|
editor:"number", editorParams:{
|
|
min:1, max:9, maxlength:1,//step:10, mask:"999",
|
|
elementAttributes:{ maxlength:"1", pattern:"\d*",min:1, max:9, oninput:"fnc_maxLengthCheck(this)" }, //set the maximum character length of the input element to 10 characters
|
|
selectContents:true, verticalNavigation:"table", //up and down arrow keys navigate away from cell without changing value
|
|
}
|
|
},
|
|
</c:forEach>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
<%--
|
|
<c:choose>
|
|
<c:when test="${empty masterInfo or empty masterInfo.FACILITY_QTY}">
|
|
</c:when>
|
|
<c:otherwise>
|
|
<c:forEach begin="${masterInfo.PROJECT_NO_MAX_NUM+1}" end="${masterInfo.PROJECT_NO_MAX_NUM+masterInfo.FACILITY_QTY}" var="no">
|
|
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '${masterInfo.TITLE}-${no}', field : '${masterInfo.TITLE}-${no}', headerSort:false,
|
|
editor:"number", editorParams:{
|
|
min:1, max:1, //step:10, mask:"999",
|
|
elementAttributes:{ maxlength:"1",}, //set the maximum character length of the input element to 10 characters
|
|
selectContents:true, verticalNavigation:"table", //up and down arrow keys navigate away from cell without changing value
|
|
}
|
|
},
|
|
</c:forEach>
|
|
</c:otherwise>
|
|
</c:choose>
|
|
--%>
|
|
/*
|
|
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '${masterInfo.TITLE}', field : '${masterInfo.TITLE}',
|
|
//editor:"input", editorParams:{mask:"AAA-999"}
|
|
editor:"input", editorParams:{
|
|
//search:true,
|
|
//mask:"AAA-999",
|
|
//selectContents:true,
|
|
elementAttributes:{
|
|
maxlength:"1", //set the maximum character length of the input element to 10 characters
|
|
}
|
|
},
|
|
},
|
|
*/
|
|
/*
|
|
{title:'input', field:'aa', headerHozAlign:'center', hozAlign:'center'
|
|
,editor: fnc_customSelectEditor
|
|
,editorParams: {values:_PRODUCT_CODE_LIST, valueId:"CODE_ID", labelId:"CODE_NAME"}
|
|
,formatterParams:{values:_PRODUCT_CODE_LIST, valueId:"CODE_ID", labelId:"CODE_NAME"}
|
|
,formatter:fnc_customSelectFormatter},
|
|
*/
|
|
//{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '상태', field : 'APPR_STATUS' },
|
|
];
|
|
|
|
//var grid;
|
|
function fn_search(){
|
|
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/productKindSpec/getProductKindSpecPopupListPaging.do", columns, true);
|
|
}
|
|
|
|
function fn_getPurchaseOrderTargetPartList(){
|
|
var appendText = "";
|
|
var requestStatus = $("#STATUS").val();
|
|
$("#formListArea").empty();
|
|
|
|
$.ajax({
|
|
url:"/purchaseOrder/getPurchaseOrderTargetPartList.do",
|
|
type:"POST",
|
|
data:{"checkArr":"${param.checkArr}"},
|
|
dataType:"json",
|
|
async:false,
|
|
success:function(data){
|
|
var resultData = data;
|
|
if(0 < resultData.length){
|
|
var PURCHASE_ORDER_NO = '';
|
|
$.each(resultData, function(i){
|
|
var RNUM = fnc_checkNull(resultData[i].RNUM);
|
|
var OBJID = fnc_checkNull(resultData[i].OBJID);
|
|
var PART_OBJID = fnc_checkNull(resultData[i].PART_OBJID);
|
|
var PART_NO = fnc_checkNull(resultData[i].PART_NO);
|
|
|
|
var completed = false; //입고완료
|
|
var inputReadOnly = "";
|
|
if(0 < 1){
|
|
completed = true;
|
|
//inputReadOnly = " readonly ";
|
|
}
|
|
appendText += " <tr class='dataTr' id='"+OBJID+"'>";
|
|
appendText += " <input type='hidden' name='OBJID' value='"+OBJID+"'>";
|
|
appendText += " <input type='hidden' name='PART_OBJID_"+OBJID+"' value='"+PART_OBJID+"'>";
|
|
|
|
/* No */
|
|
appendText += " <td title='"+RNUM+"' class='align_c'>"+RNUM+"</td>";
|
|
|
|
/* 품번 */
|
|
appendText += " <td class='align_l' title='"+PART_NO+"' class='align_c'>"+PART_NO+"</td>";
|
|
appendText += " <td class='align_l' title='"+PART_NO+"' class='align_c'>"+PART_NO+"</td>";
|
|
|
|
appendText += " </tr>";
|
|
});
|
|
|
|
$("#PURCHASE_ORDER_NO").html(PURCHASE_ORDER_NO);
|
|
|
|
}else{
|
|
appendText += "<tr>";
|
|
appendText += "<td colspan='11'>조회된 내용이 없습니다.</td>";
|
|
appendText += "</tr>";
|
|
}
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
|
|
$("#formListArea").append(appendText);
|
|
}
|
|
|
|
function fn_save(){
|
|
var formData = $("#form1").serialize();
|
|
if(fn_checkInputData()){
|
|
/*
|
|
var check_over_qty = false;
|
|
$("input[name^=NON_ARRIVAL_QTY_]").each(function(i,o){
|
|
if($(o).val() < 0){
|
|
alert("입고수량을 초과하였습니다.");
|
|
check_over_qty = true;
|
|
return false;
|
|
}
|
|
});
|
|
if(check_over_qty){
|
|
return;
|
|
}
|
|
*/
|
|
|
|
if(confirm("저장하시겠습니까?")){
|
|
|
|
var param = $("#form1").serializeObject();
|
|
param.dataListJson = JSON.stringify(_tabulGrid.getData());
|
|
//param.dataListJson = JSON.stringify(_tabulGrid.getSelectedData());
|
|
|
|
$.ajax({
|
|
type: "POST",
|
|
url: "/productKindSpec/saveProductKindSpec.do",
|
|
//data: $("#form1").serialize(),
|
|
//data: $("#form1").serializeObject(),
|
|
data: param,
|
|
//data: {"dataListJson" : JSON.stringify(_tabulGrid.getData())},
|
|
dataType:"json",
|
|
success:function(data){
|
|
alert(data.msg);
|
|
if(data.result){
|
|
opener.fn_search();
|
|
//self.close();
|
|
}
|
|
},
|
|
beforeSend:function(){
|
|
//_startLoading("저장중입니다. 데이터에 따라 시간이 걸릴 수 있습니다.");
|
|
_startLoading("저장중입니다.");
|
|
},
|
|
complete:function(){
|
|
_endLoading();
|
|
},
|
|
error: function(jqxhr, status, error){
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
function fn_checkInputData(){
|
|
return true;
|
|
|
|
var returnFlag = true;
|
|
|
|
$("input[name=OBJID]").each(function(i) {
|
|
var targetObjId = $(this).val();
|
|
var DELIVERY_QTY = $("#DELIVERY_QTY_"+targetObjId).val()
|
|
var DELIVERY_DATE = $("#DELIVERY_DATE_"+targetObjId).val()
|
|
var DELIVERY_PLACE_CD = $("#DELIVERY_PLACE_CD_"+targetObjId).val()
|
|
|
|
if(0 < DELIVERY_QTY){
|
|
if("" == DELIVERY_PLACE_CD){
|
|
alert("입력된 입고위치가 없습니다.");
|
|
returnFlag = false;
|
|
return false;
|
|
}
|
|
}
|
|
});
|
|
|
|
return returnFlag;
|
|
}
|
|
|
|
</script>
|
|
<style>
|
|
.input_title {border-left:1px solid #ccc;}
|
|
.input_sub_title {border-left:1px solid #ccc;}
|
|
.pmsPopupForm tr:last-child td{border-bottom:1px solid #ccc;}
|
|
</style>
|
|
<body class="bodyNoScroll">
|
|
<form name="hiddenForm" id="hiddenForm" action="" method="post">
|
|
<input type="hidden" name="targetObjId" />
|
|
<input type="hidden" name="docType" />
|
|
<input type="hidden" name="docTypeName" />
|
|
<input type="hidden" name="TITLE" />
|
|
<input type="hidden" name="callbackFnc" />
|
|
<input type="hidden" name="OBJID" />
|
|
</form>
|
|
<form name="form1" id="form1" action="" method="post">
|
|
<input type="hidden" name="OBJID" value="${param.OBJID }"/>
|
|
<input type="hidden" name="SPEC_OBJID" id="SPEC_OBJID" value="${param.SPEC_OBJID }"/>
|
|
<input type="hidden" name="OBJID_CONTRACT" value="${param.OBJID_CONTRACT }"/>
|
|
<input type="hidden" name="OBJID_PRODUCT" value="${param.OBJID_PRODUCT }"/>
|
|
<input type="hidden" name="MECHANICAL_TYPE" value="${param.MECHANICAL_TYPE }"/>
|
|
|
|
<section>
|
|
<div class="plm_menu_name_gdnsi" style="display:flex;">
|
|
<h2>
|
|
<span>제품별 사양 등록</span>
|
|
</h2>
|
|
|
|
<div class="plm_btn_wrap" style="padding:4 4 0 0;width:">
|
|
<input type="button" value="추가" class="plm_btns" id="btnAdd">
|
|
<input type="button" value="삭제" class="plm_btns" id="btnDelete">
|
|
<input type="button" value="저장" class="plm_btns" id="btnSave">
|
|
</div>
|
|
</div>
|
|
|
|
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
|
|
|
|
<%--
|
|
<div id="businessPopupFormWrap" style="z-index:99;">
|
|
<table class="pmsPopupForm" style="margin-top:10px;">
|
|
<tr>
|
|
<td class="input_title">
|
|
<label for="">입고 품목</label>
|
|
발주번호 : <label id="PURCHASE_ORDER_NO"></label>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<div class="in_table_scroll_wrap _table2" style="height:400px;width:100%;">
|
|
<table class="plm_table">
|
|
<colgroup>
|
|
<col width="30px" /> <!-- No</td> -->
|
|
<col width="50px" /> <!-- 입고수량</td> -->
|
|
</colgroup>
|
|
<thead>
|
|
<tr class="plm_thead">
|
|
<td>No</td>
|
|
<td>단가</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="formListArea">
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
--%>
|
|
|
|
<div class="btn_wrap">
|
|
<div class="plm_btn_wrap_center">
|
|
<input type="button" value="닫기" id="btnClose" class="plm_btns">
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</form>
|
|
</body>
|
|
</html> |