Merge pull request 'V20260210' (#166) from V20260210 into main

Reviewed-on: #166
This commit was merged in pull request #166.
This commit is contained in:
2026-03-11 07:45:15 +00:00
18 changed files with 873 additions and 123 deletions

View File

@@ -240,7 +240,10 @@ $(document).ready(function(){
var part_type = part_type_val && part_type_val.trim() !== '' ? $.parseJSON(part_type_val) : {};
var acctfg_code = acctfg_code_val && acctfg_code_val.trim() !== '' ? $.parseJSON(acctfg_code_val) : {};
var sup_code = sup_code_val && sup_code_val.trim() !== '' ? $.parseJSON(sup_code_val) : {};
var unit_dc_code_val = $("#unit_dc_code").val();
var unit_dc_code = unit_dc_code_val && unit_dc_code_val.trim() !== '' ? $.parseJSON(unit_dc_code_val) : {};
//Excel File Upload된 파일 목록 부분을 초기화 한다.
$("#excelImportList").hide();
@@ -384,16 +387,24 @@ $(document).ready(function(){
}
}
}
,{name:"UNIT_DC",index:"UNIT_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true
,{name:"UNIT_DC",index:"UNIT_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true
,edittype :"select"
,formatter :"select"
,editoptions:{
dataInit : function(e){
value: unit_dc_code
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
}
,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true
,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true
,edittype :"select"
,formatter :"select"
,editoptions:{
dataInit : function(e){
value: unit_dc_code
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
@@ -479,7 +490,7 @@ $(document).ready(function(){
//,cellsubmit : "clientArray"
,rownumbers : true
,viewrecords : true
,width : 1500
,width : "auto"
,height : 420
,multiselect : false
,shrinkToFit : false
@@ -1369,6 +1380,7 @@ function fn_save(){
<textarea style="width:0px; height:0px; visibility: hidden;" id="part_type">${code_map.part_type}</textarea><!-- 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="acctfg_code">${code_map.acctfg_code}</textarea><!-- 계정구분 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="sup_code">${code_map.sup_code}</textarea><!-- 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="unit_dc_code">${code_map.unit_dc_code}</textarea><!-- 단위 코드동적설정 -->
</form>
</body>
</html>

View File

@@ -38,6 +38,7 @@ $(document).ready(function(){
var part_type = $.parseJSON($("#part_type").val()); //jqGrid 구분
var acctfg_code = $.parseJSON($("#acctfg_code").val()); //jqGrid 계정구분
var sup_code = $.parseJSON($("#sup_code").val()); //jqGrid 구분
var unit_dc_code = $("#unit_dc_code").val() ? $.parseJSON($("#unit_dc_code").val()) : {}; //jqGrid 단위
//Excel File Upload된 파일 목록 부분을 초기화 한다.
$("#excelImportList").hide();
@@ -187,16 +188,24 @@ $(document).ready(function(){
}
}
}
,{name:"UNIT_DC",index:"UNIT_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true
,{name:"UNIT_DC",index:"UNIT_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true
,edittype :"select"
,formatter :"select"
,editoptions:{
dataInit : function(e){
value: unit_dc_code
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
}
,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 70, align:"center", hidden: false, sortable:false, editable:true
,{name:"UNITMANG_DC",index:"UNITMANG_DC", width: 80, align:"center", hidden: false, sortable:false, editable:true
,edittype :"select"
,formatter :"select"
,editoptions:{
dataInit : function(e){
value: unit_dc_code
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
@@ -293,7 +302,7 @@ $(document).ready(function(){
,height : 530 //'auto' //520
,multiselect : false
,shrinkToFit : false
,autowidth : true
,autowidth : false
,sortable : false
,rowNum : 5000
,forceFit : false //컬럼의 width를 변화시킬때 그리드의 width를 고정 여부
@@ -1084,6 +1093,7 @@ function fn_save(){
<textarea style="width:0px; height:0px; visibility: hidden;" id="part_type">${code_map.part_type}</textarea><!-- 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="acctfg_code">${code_map.acctfg_code}</textarea><!-- 계정구분 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="sup_code">${code_map.sup_code}</textarea><!-- 코드동적설정 -->
<textarea style="width:0px; height:0px; visibility: hidden;" id="unit_dc_code">${code_map.unit_dc_code}</textarea><!-- 단위 코드동적설정 -->
</form>
</body>
</html>

View File

@@ -461,9 +461,19 @@ section {
}
.plm_btn_wrap_center {
flex-direction: row !important;
display: flex !important;
justify-content: center !important;
position: relative !important;
left: auto !important;
transform: none !important;
}
.plm_btns, .btns {
width: auto !important;
float: none !important;
}
.btn_wrap {
padding: 10px 5px !important;
height: auto !important;
}
}
@@ -609,13 +619,13 @@ section {
<label for="">재고단위</label>
</td>
<td class="input_sub_title" colspan="2">
<input type="text" name="UNIT_DC" id="UNIT_DC" value="${resultMap.UNIT_DC}" maxlength="4" disabled>
<select name="UNIT_DC" id="UNIT_DC" class="select2" style="width:100%;" disabled>${code_map.unit_dc_cd}</select>
</td>
<td class="input_title">
<label for="">관리단위</label>
</td>
<td class="input_sub_title">
<input type="text" name="UNITMANG_DC" id="UNITMANG_DC" value="${resultMap.UNITMANG_DC}" maxlength="4" disabled>
<select name="UNITMANG_DC" id="UNITMANG_DC" class="select2" style="width:100%;" disabled>${code_map.unitmang_dc_cd}</select>
</td>
</tr>
<tr>

View File

@@ -293,6 +293,31 @@ function fn_overlapPartMng(){
.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;}
@media (max-width: 768px) {
.pmsPopupForm td {
display: table-cell !important;
width: auto !important;
}
.input_title {
border-right: 1px solid #ccc !important;
}
.plm_btn_wrap_center {
flex-direction: row !important;
display: flex !important;
justify-content: center !important;
position: relative !important;
left: auto !important;
transform: none !important;
}
.plm_btns, .btns {
width: auto !important;
float: none !important;
}
.btn_wrap {
padding: 10px 5px !important;
height: auto !important;
}
}
</style>
<body>
<form name="form1" id="form1" action="" method="post">
@@ -405,7 +430,7 @@ function fn_overlapPartMng(){
<td class="input_title">
<label for="">계정구분<span class="text-danger">*</span></label>
</td>
<td class="input_sub_title">
<td class="input_sub_title" colspan="2">
<select name="ACCTFG" id="ACCTFG" class="" type="select" required reqTitle="계정구분"></select>
</td>
<td class="input_title">
@@ -426,13 +451,19 @@ function fn_overlapPartMng(){
<label for="">재고단위<span class="text-danger">*</span></label>
</td>
<td class="input_sub_title" colspan="2">
<input type="text" name="UNIT_DC" id="UNIT_DC" value="${resultMap.UNIT_DC}" maxlength="4" required reqTitle="재고단위">
<select name="UNIT_DC" id="UNIT_DC" class="select2" style="width:100%;" required reqTitle="재고단위">
<option value="">선택</option>
${code_map.unit_dc_cd}
</select>
</td>
<td class="input_title">
<label for="">관리단위<span class="text-danger">*</span></label>
</td>
<td class="input_sub_title">
<input type="text" name="UNITMANG_DC" id="UNITMANG_DC" value="${resultMap.UNITMANG_DC}" maxlength="4" required reqTitle="관리단위">
<select name="UNITMANG_DC" id="UNITMANG_DC" class="select2" style="width:100%;" required reqTitle="관리단위">
<option value="">선택</option>
${code_map.unitmang_dc_cd}
</select>
</td>
</tr>
<tr>

View File

@@ -219,8 +219,8 @@ String connector = person.getUserId();
{headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '규격', field : 'SPEC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '계정구분', field : 'ACCTFG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '조달구분', field : 'ODRFG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '환산수량', field : 'UNITCHNG_NB' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : 'LOT구분', field : 'LOT_FG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '사용여부', field : 'USE_YN_NM' },

View File

@@ -189,8 +189,8 @@ ui-jqgrid tr.jqgrow td {
{headerHozAlign : 'center', hozAlign : 'left', width : '100', title : '규격', field : 'SPEC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '계정구분', field : 'ACCTFG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '조달구분', field : 'ODRFG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '재고단위', field : 'UNIT_DC_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '관리단위', field : 'UNITMANG_DC_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '환산수량', field : 'UNITCHNG_NB' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : 'LOT구분', field : 'LOT_FG_NM' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '사용여부', field : 'USE_YN_NM' },

View File

@@ -233,29 +233,119 @@ function generateObjId(){
return String(Math.abs(Math.floor(Math.random() * 2147483647))) + String(++rowSeq);
}
function findLastDescendant(parentTr){
var parentDepth = getRowDepth(parentTr[0]);
var lastDescendant = parentTr;
parentTr.nextAll("tr").each(function(){
if(getRowDepth(this) > parentDepth){
lastDescendant = $(this);
} else {
return false;
}
});
return lastDescendant;
}
function renumberAllRows(){
var rows = $("#wbsTaskList tr:not(#row_total)");
var counters = [0, 0, 0];
rows.each(function(){
var objId = $(this).find("input[name='WBS_TASK_OBJID']").val();
var depth = parseInt($("#TASK_LEVEL_" + objId).val()) || 0;
if(depth < 1 || depth > 3) return true;
if(depth === 1){
counters[0]++;
counters[1] = 0;
counters[2] = 0;
} else if(depth === 2){
counters[1]++;
counters[2] = 0;
} else {
counters[2]++;
}
var unitNo;
if(depth === 1) unitNo = String(counters[0]);
else if(depth === 2) unitNo = counters[0] + "." + counters[1];
else unitNo = counters[0] + "." + counters[1] + "." + counters[2];
$("#UNIT_NO_" + objId).val(unitNo);
$(this).find(".lvl_input").val("");
$(this).find(".lvl_input[data-level='" + depth + "']").val(unitNo);
});
}
function addRow(){
var objId = generateObjId();
var checked = $("input[name='rowCheck']:checked");
var autoLevel = "";
var insertAfterTr = null;
if(checked.length > 0){
var selectedTr = checked.last().closest("tr");
var selectedDepth = getRowDepth(selectedTr[0]);
autoLevel = selectedDepth;
insertAfterTr = findLastDescendant(selectedTr);
checked.prop("checked", false);
}
var tr = '<tr id="row_' + objId + '">';
tr += '<td><input type="checkbox" name="rowCheck" value="' + objId + '"></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="">';
tr += '<input type="hidden" name="UPPER_TASK_OBJID_' + objId + '" id="UPPER_TASK_OBJID_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="' + autoLevel + '">';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="1" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="2" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="3" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" name="TASK_NAME_' + objId + '" id="TASK_NAME_' + objId + '"></td>';
tr += '</tr>';
var checked = $("input[name='rowCheck']:checked");
if(checked.length > 0){
checked.last().closest("tr").after(tr);
checked.prop("checked", false);
if(insertAfterTr){
insertAfterTr.after(tr);
} else {
$("#wbsTaskList").append(tr);
}
bindLevelInput(objId);
renumberAllRows();
}
function addChildRow(){
var checked = $("input[name='rowCheck']:checked");
if(checked.length == 0){
Swal.fire('부모 행을 선택해 주세요');
return;
}
var selectedTr = checked.last().closest("tr");
var selectedDepth = getRowDepth(selectedTr[0]);
if(selectedDepth >= 3){
Swal.fire('수준 3 이하로는 추가할 수 없습니다');
return;
}
var objId = generateObjId();
var autoLevel = selectedDepth + 1;
var insertAfterTr = findLastDescendant(selectedTr);
var tr = '<tr id="row_' + objId + '">';
tr += '<td><input type="checkbox" name="rowCheck" value="' + objId + '"></td>';
tr += '<input type="hidden" name="WBS_TASK_OBJID" value="' + objId + '">';
tr += '<input type="hidden" name="UNIT_NO_' + objId + '" id="UNIT_NO_' + objId + '" value="">';
tr += '<input type="hidden" name="UPPER_TASK_OBJID_' + objId + '" id="UPPER_TASK_OBJID_' + objId + '" value="">';
tr += '<input type="hidden" name="TASK_LEVEL_' + objId + '" id="TASK_LEVEL_' + objId + '" value="' + autoLevel + '">';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="1" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="2" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" class="lvl_input" data-objid="' + objId + '" data-level="3" style="width:80%;text-align:center;"></td>';
tr += '<td><input type="text" name="TASK_NAME_' + objId + '" id="TASK_NAME_' + objId + '"></td>';
tr += '</tr>';
insertAfterTr.after(tr);
checked.prop("checked", false);
bindLevelInput(objId);
renumberAllRows();
}
function deleteRow(){
@@ -264,10 +354,35 @@ function deleteRow(){
Swal.fire('삭제할 행을 선택해 주세요');
return;
}
var removeTargets = [];
var hasChildren = false;
checked.each(function(){
var objId = $(this).val();
if($("#row_" + objId).attr("id") !== "row_total"){
$("#row_" + objId).remove();
var tr = $("#row_" + objId);
if(tr.attr("id") === "row_total") return true;
removeTargets.push(tr);
var parentDepth = getRowDepth(tr[0]);
tr.nextAll("tr").each(function(){
if(getRowDepth(this) > parentDepth){
removeTargets.push($(this));
hasChildren = true;
} else {
return false;
}
});
});
var msg = hasChildren ? '하위 항목도 함께 삭제됩니다. 삭제하시겠습니까?' : '삭제하시겠습니까?';
Swal.fire({
title: msg,
icon: 'warning',
showCancelButton: true,
confirmButtonText: '삭제',
cancelButtonText: '취소'
}).then(function(result){
if(result.isConfirmed){
$.each(removeTargets, function(i, tr){ tr.remove(); });
renumberAllRows();
}
});
}
@@ -439,6 +554,7 @@ function saveWBS(){
<div class="plm_btn_wrap">
<input type="button" value="Template Download" id="templateDownload" class="plm_btns">
<input type="button" value="추가" class="plm_btns" onclick="addRow();">
<input type="button" value="하위추가" class="plm_btns" onclick="addChildRow();">
<input type="button" value="삭제" class="plm_btns" onclick="deleteRow();">
<input type="button" value="저장" class="plm_btns" onclick="saveWBS();">
<input type="button" value="닫기" id="btn_close" class="plm_btns" onclick="javascript:self.close();">

View File

@@ -0,0 +1,218 @@
<%@ 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>
<c:set var="totalCount" value="${empty TOTAL_COUNT?0:TOTAL_COUNT}" />
<c:set var="maxPage" value="${empty MAX_PAGE_SIZE?1:MAX_PAGE_SIZE}" />
<c:set var="nPage" value="${empty param.page?1:param.page}" />
<c:set var="pageIndex" value="${(nPage-1)/10}" />
<c:set var="nextPage" value="${empty NEXT_PAGE?1:NEXT_PAGE}" />
<c:set var="prevPage" value="${empty PREV_PAGE?1:PREV_PAGE}" />
<c:set var="now" value="<%=new java.util.Date() %>"/>
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<style>
.select2-selection__choice {
font-size: 11px;
background-color: #fff !important;
border: none !important;
margin-right: 0px !important;
}
.select2-selection__choice__remove {
display: contents !important;
}
.select2-container .select2-selection--multiple {
min-height: 20px !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
margin-top: 3.5px !important;
}
.select2-selection__rendered {
height: 18px !important;
}
.select2-container .select2-selection--multiple .select2-selection__rendered {
overflow: auto !important;
}
</style>
<script>
$(document).ready(function(){
_fnc_datepick();
$('.select2').select2();
$("#btnSearch").click(function(){
$("#page").val("1");
fn_search();
});
$("input").keyup(function(e){
if(e.keyCode == 13){
$("#page").val("1");
fn_search();
}
});
fn_search(true);
});
var columns = [
{title:'OBJID', field:'OBJID', visible:false, frozen:true},
{title:"프로젝트정보", headerHozAlign:'center', frozen:true,
columns:[
{headerHozAlign:'center', hozAlign:'left', width:'120', title:'프로젝트번호', field:'PROJECT_NO'},
{headerHozAlign:'center', hozAlign:'center', width:'90', title:'제품구분', field:'PRODUCT_NAME'},
{headerHozAlign:'center', hozAlign:'left', width:'150', title:'품번', field:'PART_NO'},
{headerHozAlign:'center', hozAlign:'left', width:'180', title:'품명', field:'PART_NAME'},
{headerHozAlign:'center', hozAlign:'left', /*width:'130',*/ title:'고객사', field:'CUSTOMER_NAME'}
]
},
{title:"전체(BOM기준)", headerHozAlign:'center',
columns:[
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'전체품목수', field:'TOTAL_ITEM_CNT',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'전체수량', field:'TOTAL_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
}
]
},
{title:"발주현황", headerHozAlign:'center',
columns:[
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'발주품목수', field:'PO_ITEM_CNT',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'발주수량', field:'PO_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
}
]
},
{title:"미발주현황", headerHozAlign:'center',
columns:[
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'미발주품목수', field:'NON_PO_ITEM_CNT',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'미발주수량', field:'NON_PO_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
}
]
},
{title:"입고현황", headerHozAlign:'center',
columns:[
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'입고품목수', field:'DLV_ITEM_CNT',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'입고수량', field:'DLV_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
}
]
},
{title:"미입고현황", headerHozAlign:'center',
columns:[
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'미입고품목수', field:'NON_DLV_ITEM_CNT',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', width:'100', title:'미입고수량', field:'NON_DLV_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
}
]
}
];
function fn_search(isFirst){
var selectedValues = $("#project_no").val();
$('<input>').attr({
type: 'hidden',
name: 'project_nos',
value: selectedValues
}).appendTo('#form1');
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/purchaseOrder/projectPurchaseDeliveryStatusGridList.do", columns, false, null, null, null, false);
}
function _fnc_datepick(){
var $dateinput = $("input.date_icon");
for(var i=0; i<$dateinput.length; i++){
$dateinput.eq(i).attr("size","10");
$dateinput.eq(i).datepicker({
changeMonth:true,
changeYear:true
});
}
}
</script>
</head>
<body>
<form name="form1" id="form1" action="" method="post">
<input type="hidden" name="actionType" value="" />
<div class="min_part_enroll">
<div class="content-box">
<div class="content-box-s">
<div class="plm_menu_name_gdnsi">
<h2>
<span>프로젝트별 발주/입고 현황</span>
</h2>
<div class="btnArea">
<input type="button" value="조회" class="plm_btns" id="btnSearch" name="btnSearch">
</div>
</div>
<div id="plmSearchZon">
<table>
<tr>
<td><label for="Year">년도</label></td>
<td>
<select name="Year" id="Year" class="select2" autocomplete="off">
<option value="">선택</option>
<c:forEach begin="${sysYear-4}" end="${sysYear}" var="req_year">
<option value="${req_year}"${param.Year eq req_year ? 'selected':'' }>${req_year}</option>
</c:forEach>
</select>
</td>
<td><label for="customer_objid">고객사</label></td>
<td>
<select name="customer_objid" id="customer_objid" style="width:180px" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.customer_cd}
</select>
</td>
<td><label for="project_no">프로젝트번호</label></td>
<td>
<select name="project_no" id="project_no" style="width:300px;" class="select2" autocomplete="off" multiple="multiple">
<option value="">선택</option>
${code_map.project_no}
</select>
</td>
</tr>
<tr>
<td><label for="product">제품구분</label></td>
<td>
<select name="product" id="product" class="select2" autocomplete="off">
<option value="">선택</option>
${code_map.product_cd}
</select>
</td>
<td><label for="part_no">품번</label></td>
<td>
<input type="text" name="part_no" id="part_no" value="${param.part_no}" style="width:130px" />
</td>
<td><label for="part_name">품명</label></td>
<td>
<input type="text" name="part_name" id="part_name" value="${param.part_name}" style="width:200px" />
</td>
</tr>
</table>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</div>
</form>
</body>
</html>

View File

@@ -401,12 +401,16 @@ public class PartMngController {
}
// 단위 코드 셀렉트박스
code_map.put("unit_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNIT_DC")), "common.getCodeselect"));
code_map.put("unitmang_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNITMANG_DC")), "common.getCodeselect"));
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("code_map", code_map);
request.setAttribute("resultMap", resultMap);
return "/partMng/partMngFormPopUp";
}
@@ -456,6 +460,10 @@ public class PartMngController {
resultMap.put("OBJID", objId);
}
// 단위 코드 셀렉트박스
code_map.put("unit_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNIT_DC")), "common.getCodeselect"));
code_map.put("unitmang_dc_cd", commonService.bizMakeOptionList("0001399", CommonUtils.nullToEmpty((String)resultMap.get("UNITMANG_DC")), "common.getCodeselect"));
}catch(Exception e){
e.printStackTrace();
}
@@ -676,7 +684,12 @@ public class PartMngController {
Map acctfgParam = new HashMap();
acctfgParam.put("codeId", Constants.ACCTFG_CODE);
code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택"));
// 단위(UNIT_DC) 공통코드 조회 - jqGrid selectBox용 JSON
Map unitDcParam = new HashMap();
unitDcParam.put("codeId", "0001399");
code_map.put("unit_dc_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", unitDcParam, "선택"));
/*
code_map.put("customer_cd",commonService.bizMakeOptionList("", (String)paramMap.get("customer_cd"),"common.getsupplyselect"));
code_map.put("project_name",commonService.bizMakeOptionList("", (String)paramMap.get("project_name"),"common.getProjectNameList"));
@@ -1962,6 +1975,11 @@ public class PartMngController {
acctfgParam.put("codeId", Constants.ACCTFG_CODE);
code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택"));
// 단위(UNIT_DC) 공통코드 조회 - jqGrid selectBox용 JSON
Map unitDcParam = new HashMap();
unitDcParam.put("codeId", "0001399");
code_map.put("unit_dc_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", unitDcParam, "선택"));
sqlSession = SqlMapConfig.getInstance().getSqlSession();
// 통합 템플릿으로 변경하면서 unit_code 관련 로직은 사용하지 않음

View File

@@ -1302,6 +1302,33 @@ public class PurchaseOrderController {
return paramMap;
}
/**
* 프로젝트별 발주/입고 현황
*/
@RequestMapping("/purchaseOrder/projectPurchaseDeliveryStatus.do")
public String projectPurchaseDeliveryStatus(HttpServletRequest request, @RequestParam Map paramMap){
Map code_map = new HashMap();
try{
code_map.put("customer_cd", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")), "common.getsupplyselect"));
code_map.put("project_no", commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("project_no")), "common.getProjectNameList"));
code_map.put("product_cd", commonService.bizMakeOptionList("0000001", CommonUtils.nullToEmpty((String)paramMap.get("product")), "common.getCodeselect"));
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("code_map", code_map);
return "/purchaseOrder/projectPurchaseDeliveryStatus";
}
/**
* 프로젝트별 발주/입고 현황 그리드 조회
*/
@ResponseBody
@RequestMapping("/purchaseOrder/projectPurchaseDeliveryStatusGridList.do")
public Map projectPurchaseDeliveryStatusGridList(HttpSession session, HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
commonService.selectListPagingNew("purchaseOrder.projectPurchaseDeliveryStatus", request, paramMap);
return paramMap;
}
/**
* 수입검사 관리
*/

View File

@@ -188,6 +188,7 @@
<update id="updateLoginId" parameterType="map">
UPDATE user_info
SET user_id = #{login_id}
,email = #{emailAddr}
WHERE empseq = #{empseq}
AND empseq IS NOT NULL
AND empseq != ''

View File

@@ -162,7 +162,9 @@
P.ODRFG,
CASE WHEN P.ODRFG = '0' THEN '구매' WHEN P.ODRFG = '1' THEN '생산' WHEN P.ODRFG = '8' THEN 'Phantom' ELSE '' END AS ODRFG_NM,
P.UNIT_DC,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = P.UNIT_DC) AS UNIT_DC_NM,
P.UNITMANG_DC,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = P.UNITMANG_DC) AS UNITMANG_DC_NM,
P.UNITCHNG_NB,
P.LOT_FG,
CASE WHEN P.LOT_FG = '1' THEN '사용' WHEN P.LOT_FG = '0' THEN '미사용' ELSE '' END AS LOT_FG_NM,
@@ -7925,12 +7927,21 @@ SELECT PM.OBJID
<!-- 계정구분 코드 조회 (한글명 → ERP 코드값) -->
<select id="getAcctfgCode" parameterType="map" resultType="map">
SELECT
SELECT
CODE_ID
FROM COMM_CODE
WHERE CODE_NAME = #{CODE_NAME}
WHERE CODE_NAME = #{CODE_NAME}
AND PARENT_CODE_ID = '0900213'
</select>
<!-- 단위 코드 조회 (코드명 → 코드값) -->
<select id="getUnitDcCode" parameterType="map" resultType="map">
SELECT
CODE_ID
FROM COMM_CODE
WHERE UPPER(TRIM(CODE_NAME)) = UPPER(TRIM(#{CODE_NAME}))
AND PARENT_CODE_ID = '0001399'
</select>
<!-- 공급업체명으로 OBJID 조회 -->
<select id="getSupplyCodeByName" parameterType="map" resultType="map">

View File

@@ -2032,6 +2032,33 @@
DELETE FROM PURCHASE_ORDER_PART
WHERE PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
</delete>
<!-- 저장 목록에 없는 파트만 삭제 (UPSERT 방식에서 제거된 파트 정리용) -->
<delete id="deleteRemovedPurchaseOrderParts" parameterType="map">
DELETE FROM PURCHASE_ORDER_PART
WHERE PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
<if test="savedObjIds != null and savedObjIds != ''">
AND 0 = POSITION(OBJID::TEXT || ',' IN #{savedObjIds} || ',')
</if>
</delete>
<!-- POP 삭제/재생성 후 ARRIVAL_PLAN.ORDER_PART_OBJID를 새 POP OBJID로 재연결 -->
<update id="relinkArrivalPlanAfterPartReset" parameterType="map">
UPDATE ARRIVAL_PLAN
SET ORDER_PART_OBJID = (
SELECT POP.OBJID::VARCHAR
FROM PURCHASE_ORDER_PART POP
WHERE POP.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
AND POP.PART_OBJID = ARRIVAL_PLAN.PART_OBJID
LIMIT 1
)
WHERE PARENT_OBJID::VARCHAR = #{PURCHASE_ORDER_MASTER_OBJID}
AND EXISTS (
SELECT 1 FROM PURCHASE_ORDER_PART POP2
WHERE POP2.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
AND POP2.PART_OBJID = ARRIVAL_PLAN.PART_OBJID
)
</update>
<delete id="initPurchaseOrderPartMulti" parameterType="map">
DELETE FROM PURCHASE_ORDER_PART
@@ -4429,13 +4456,15 @@ SELECT POM.OBJID
,SUM(COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * (COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.SUM_RECEIPT_QTY, 0))) AS TOTAL_NOT_DELIVERY_PRICE
FROM PURCHASE_ORDER_PART POP
LEFT OUTER JOIN (
-- ARRIVAL_PLAN을 ORDER_PART_OBJID별로 먼저 집계
SELECT ORDER_PART_OBJID
-- ARRIVAL_PLAN을 PARENT_OBJID(POM) + PART_OBJID 기준 집계 (POP 삭제/재생성 대응)
SELECT PARENT_OBJID
,PART_OBJID
,SUM(RECEIPT_QTY::NUMERIC) AS SUM_RECEIPT_QTY
,MAX(RECEIPT_DATE) AS MAX_RECEIPT_DATE
FROM ARRIVAL_PLAN
GROUP BY ORDER_PART_OBJID
) AP_AGG ON POP.OBJID = AP_AGG.ORDER_PART_OBJID
GROUP BY PARENT_OBJID, PART_OBJID
) AP_AGG ON AP_AGG.PARENT_OBJID::VARCHAR = POP.PURCHASE_ORDER_MASTER_OBJID
AND AP_AGG.PART_OBJID = POP.PART_OBJID
GROUP BY POP.PURCHASE_ORDER_MASTER_OBJID
) AS S1 ON POM.OBJID::VARCHAR = S1.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN PROJECT_MGMT AS CM
@@ -6315,13 +6344,15 @@ FROM(
INNER JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID::VARCHAR = POP.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN PROJECT_MGMT CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
<!-- 입고 수량 집계 (ARRIVAL_PLAN) -->
<!-- 입고 수량 집계 (ARRIVAL_PLAN - PART_OBJID 기준, POP 삭제/재생성 대응) -->
LEFT OUTER JOIN (
SELECT ORDER_PART_OBJID
SELECT PARENT_OBJID
,PART_OBJID
,SUM(COALESCE(RECEIPT_QTY::NUMERIC, 0)) AS DELIVERY_QTY
FROM ARRIVAL_PLAN
GROUP BY ORDER_PART_OBJID
) AP_AGG ON POP.OBJID = AP_AGG.ORDER_PART_OBJID
GROUP BY PARENT_OBJID, PART_OBJID
) AP_AGG ON POM.OBJID = AP_AGG.PARENT_OBJID
AND POP.PART_OBJID = AP_AGG.PART_OBJID
<!-- 수입검사 현황 집계 (발주마스터+품목 기준: 불량상세가 있는 건만 카운트) -->
LEFT OUTER JOIN (
@@ -6634,4 +6665,184 @@ FROM(
ORDER BY AP.RECEIPT_DATE DESC, POM.PURCHASE_ORDER_NO, POP.PART_NO
</select>
<!-- 프로젝트별 발주/입고 현황 -->
<select id="projectPurchaseDeliveryStatus" parameterType="map" resultType="map">
SELECT T.*
,GREATEST(COALESCE(T.TOTAL_ITEM_CNT, 0) - COALESCE(T.PO_ITEM_CNT, 0), 0) AS NON_PO_ITEM_CNT
,GREATEST(COALESCE(T.TOTAL_QTY, 0) - COALESCE(T.PO_QTY, 0), 0) AS NON_PO_QTY
,COALESCE(T.NON_DLV_ITEM_CNT, 0) AS NON_DLV_ITEM_CNT
,GREATEST(COALESCE(T.PO_QTY, 0) - COALESCE(T.DLV_QTY, 0), 0) AS NON_DLV_QTY
FROM (
SELECT
CM.OBJID
,CM.PROJECT_NO
,CODE_NAME(CM.PRODUCT) AS PRODUCT_NAME
,CM.PART_NO
,CM.PART_NAME
,CASE WHEN CM.CUSTOMER_OBJID LIKE 'C_%'
THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = CM.CUSTOMER_OBJID)
ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = CM.CUSTOMER_OBJID::VARCHAR)
END AS CUSTOMER_NAME
/* 전체품목수: 공급업체 대상 + 가공업체 대상 (구매리스트 그룹핑 기준과 동일) */
,(
COALESCE((
SELECT COUNT(*) FROM (
SELECT 1
FROM MBOM_HEADER MH2
,MBOM_DETAIL MD2
WHERE MD2.MBOM_HEADER_OBJID = MH2.OBJID
AND MH2.PROJECT_OBJID = CM.OBJID
AND MD2.STATUS = 'ACTIVE'
AND COALESCE(MD2.PRODUCTION_QTY, 0) > 0
AND COALESCE(MD2.VENDOR, '') != ''
GROUP BY CASE WHEN COALESCE(MD2.RAW_MATERIAL_PART_NO, '') != ''
THEN MD2.RAW_MATERIAL_PART_NO ELSE MD2.PART_OBJID END
,COALESCE(MD2.RAW_MATERIAL_SIZE, '')
) SUB1
), 0)
+
COALESCE((
SELECT COUNT(*) FROM (
SELECT 1
FROM MBOM_HEADER MH2
,MBOM_DETAIL MD2
WHERE MD2.MBOM_HEADER_OBJID = MH2.OBJID
AND MH2.PROJECT_OBJID = CM.OBJID
AND MD2.STATUS = 'ACTIVE'
AND COALESCE(MD2.PRODUCTION_QTY, 0) > 0
AND COALESCE(MD2.PROCESSING_VENDOR, '') != ''
GROUP BY MD2.PART_OBJID
,COALESCE(MD2.RAW_MATERIAL_SIZE, '')
) SUB2
), 0)
) AS TOTAL_ITEM_CNT
/* 전체수량: 공급업체(소재: PO_QTY, 부품: PRODUCTION_QTY) + 가공업체(PRODUCTION_QTY) */
,(
COALESCE((
SELECT SUM(
CASE WHEN COALESCE(MD2.RAW_MATERIAL_PART_NO, '') != ''
THEN COALESCE(MD2.PO_QTY, 0)::NUMERIC
ELSE COALESCE(MD2.PRODUCTION_QTY, 0)::NUMERIC END)
FROM MBOM_HEADER MH2
,MBOM_DETAIL MD2
WHERE MD2.MBOM_HEADER_OBJID = MH2.OBJID
AND MH2.PROJECT_OBJID = CM.OBJID
AND MD2.STATUS = 'ACTIVE'
AND COALESCE(MD2.PRODUCTION_QTY, 0) > 0
AND COALESCE(MD2.VENDOR, '') != ''
), 0)
+
COALESCE((
SELECT SUM(COALESCE(MD2.PRODUCTION_QTY, 0)::NUMERIC)
FROM MBOM_HEADER MH2
,MBOM_DETAIL MD2
WHERE MD2.MBOM_HEADER_OBJID = MH2.OBJID
AND MH2.PROJECT_OBJID = CM.OBJID
AND MD2.STATUS = 'ACTIVE'
AND COALESCE(MD2.PRODUCTION_QTY, 0) > 0
AND COALESCE(MD2.PROCESSING_VENDOR, '') != ''
), 0)
) AS TOTAL_QTY
/* 발주품목수: 발주서(발송완료)의 고유 부품 수 */
,COALESCE((
SELECT COUNT(DISTINCT POP2.PART_NO)
FROM PURCHASE_ORDER_MASTER POM2
,PURCHASE_ORDER_PART POP2
WHERE POM2.OBJID::VARCHAR = POP2.PURCHASE_ORDER_MASTER_OBJID
AND POM2.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM2.MAIL_SEND_DATE IS NOT NULL
AND (POM2.MULTI_MASTER_YN = 'Y' OR NVL(POM2.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM2.MULTI_YN, '') != 'Y')
), 0) AS PO_ITEM_CNT
/* 발주수량: 발주서(발송완료)의 수량 합계 */
,COALESCE((
SELECT SUM(POP2.ORDER_QTY::NUMERIC)
FROM PURCHASE_ORDER_MASTER POM2
,PURCHASE_ORDER_PART POP2
WHERE POM2.OBJID::VARCHAR = POP2.PURCHASE_ORDER_MASTER_OBJID
AND POM2.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM2.MAIL_SEND_DATE IS NOT NULL
AND (POM2.MULTI_MASTER_YN = 'Y' OR NVL(POM2.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM2.MULTI_YN, '') != 'Y')
), 0) AS PO_QTY
/* 입고품목수: ARRIVAL_PLAN.PART_OBJID 직접 사용 (POP 삭제/재생성 대응) */
,COALESCE((
SELECT COUNT(DISTINCT AP2.PART_OBJID)
FROM ARRIVAL_PLAN AP2
,PURCHASE_ORDER_MASTER POM2
WHERE AP2.PARENT_OBJID = POM2.OBJID
AND POM2.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM2.MAIL_SEND_DATE IS NOT NULL
AND (POM2.MULTI_MASTER_YN = 'Y' OR NVL(POM2.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM2.MULTI_YN, '') != 'Y')
AND COALESCE(AP2.RECEIPT_QTY, '0')::NUMERIC > 0
), 0) AS DLV_ITEM_CNT
/* 입고수량: ARRIVAL_PLAN 직접 집계 */
,COALESCE((
SELECT SUM(AP2.RECEIPT_QTY::NUMERIC)
FROM ARRIVAL_PLAN AP2
,PURCHASE_ORDER_MASTER POM2
WHERE AP2.PARENT_OBJID = POM2.OBJID
AND POM2.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM2.MAIL_SEND_DATE IS NOT NULL
AND (POM2.MULTI_MASTER_YN = 'Y' OR NVL(POM2.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM2.MULTI_YN, '') != 'Y')
), 0) AS DLV_QTY
/* 미입고품목수: 품목별 발주수량 > 입고수량인 건수 */
,COALESCE((
SELECT COUNT(*)
FROM (
SELECT POP2.PART_OBJID
FROM PURCHASE_ORDER_MASTER POM2
,PURCHASE_ORDER_PART POP2
WHERE POM2.OBJID::VARCHAR = POP2.PURCHASE_ORDER_MASTER_OBJID
AND POM2.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM2.MAIL_SEND_DATE IS NOT NULL
AND (POM2.MULTI_MASTER_YN = 'Y' OR NVL(POM2.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM2.MULTI_YN, '') != 'Y')
GROUP BY POP2.PART_OBJID
HAVING SUM(POP2.ORDER_QTY::NUMERIC) > COALESCE((
SELECT SUM(AP3.RECEIPT_QTY::NUMERIC)
FROM ARRIVAL_PLAN AP3
,PURCHASE_ORDER_MASTER POM3
WHERE AP3.PARENT_OBJID = POM3.OBJID
AND POM3.CONTRACT_MGMT_OBJID = CM.OBJID
AND POM3.MAIL_SEND_DATE IS NOT NULL
AND (POM3.MULTI_MASTER_YN = 'Y' OR NVL(POM3.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM3.MULTI_YN, '') != 'Y')
AND AP3.PART_OBJID = POP2.PART_OBJID
AND COALESCE(AP3.RECEIPT_QTY, '0')::NUMERIC > 0
), 0)
) SUB
), 0) AS NON_DLV_ITEM_CNT
FROM PROJECT_MGMT CM
WHERE 1=1
<if test="Year != null and Year != ''">
AND TO_CHAR(CM.REGDATE,'YYYY') = #{Year}
</if>
<if test="customer_objid != null and customer_objid != ''">
AND CM.CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="project_nos != null and project_nos != ''">
AND CM.OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="product != null and product != ''">
AND CM.PRODUCT = #{product}
</if>
<if test="part_no != null and part_no != ''">
AND UPPER(CM.PART_NO) LIKE '%'||UPPER(#{part_no})||'%'
</if>
<if test="part_name != null and part_name != ''">
AND UPPER(CM.PART_NAME) LIKE '%'||UPPER(#{part_name})||'%'
</if>
ORDER BY CM.PROJECT_NO DESC
) AS T
</select>
</mapper>

View File

@@ -218,22 +218,24 @@ public class BatchService extends BaseService {
int updateCount = 0;
int skipCount = 0;
// empseq 기준으로 user_id 업데이트
// empseq 기준으로 user_id, email 업데이트
for (Map<String, Object> amaranthUser : amaranthUserList) {
String empSeq = (String) amaranthUser.get("empSeq");
String loginId = (String) amaranthUser.get("loginId");
String emailAddr = (String) amaranthUser.get("emailAddr");
if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) {
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.put("empseq", empSeq);
updateParam.put("login_id", loginId);
updateParam.put("emailAddr", emailAddr);
int updated = sqlSession.update("batch.updateLoginId", updateParam);
if (updated > 0) {
updateCount++;
if (updateCount <= 10) {
System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId);
System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId + ", email: " + emailAddr);
}
} else {
skipCount++;
@@ -329,22 +331,24 @@ public class BatchService extends BaseService {
int updateCount = 0;
int skipCount = 0;
// empseq 기준으로 user_id 업데이트
// empseq 기준으로 user_id, email 업데이트
for (Map<String, Object> amaranthUser : amaranthUserList) {
String empSeq = (String) amaranthUser.get("empSeq");
String loginId = (String) amaranthUser.get("loginId");
String emailAddr = (String) amaranthUser.get("emailAddr");
if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) {
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.put("empseq", empSeq);
updateParam.put("login_id", loginId);
updateParam.put("emailAddr", emailAddr);
int updated = sqlSession.update("batch.updateLoginId", updateParam);
if (updated > 0) {
updateCount++;
if (updateCount <= 10) {
System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId);
System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId + ", email: " + emailAddr);
}
} else {
skipCount++;
@@ -459,6 +463,15 @@ public class BatchService extends BaseService {
user.put("loginId", loginId);
}
// email 추출 (emailAddr + "@" + emailDomain 조합)
String emailAddr = extractJsonValue(jsonObject, "emailAddr");
String emailDomain = extractJsonValue(jsonObject, "emailDomain");
if (emailAddr != null && !emailAddr.isEmpty() && emailDomain != null && !emailDomain.isEmpty()) {
user.put("emailAddr", emailAddr + "@" + emailDomain);
} else if (emailAddr != null && !emailAddr.isEmpty()) {
user.put("emailAddr", emailAddr);
}
} catch (Exception e) {
System.err.println("Amaranth 사용자 객체 파싱 오류: " + e.getMessage());
return null;

View File

@@ -3106,10 +3106,40 @@ public class PartMngService extends BaseService {
}
// ERP 연동 필드 파싱
String unitDc = getCellValue(row, columnIndex++, formatter, emptyColCnt);
partMap.put("UNIT_DC", unitDc.trim());
if(!StringUtils.isBlank(unitDc)){
if(unitDc.trim().matches("\\d+")){
partMap.put("UNIT_DC", unitDc.trim());
} else {
Map unitDcParam = new HashMap();
unitDcParam.put("CODE_NAME", unitDc.trim());
Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam);
if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){
partMap.put("UNIT_DC", unitDcResult.get("code_id"));
} else {
partMap.put("UNIT_DC", unitDc.trim());
}
}
} else {
partMap.put("UNIT_DC", "");
}
String unitmangDc = getCellValue(row, columnIndex++, formatter, emptyColCnt);
partMap.put("UNITMANG_DC", unitmangDc.trim());
if(!StringUtils.isBlank(unitmangDc)){
if(unitmangDc.trim().matches("\\d+")){
partMap.put("UNITMANG_DC", unitmangDc.trim());
} else {
Map unitmangParam = new HashMap();
unitmangParam.put("CODE_NAME", unitmangDc.trim());
Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam);
if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){
partMap.put("UNITMANG_DC", unitmangResult.get("code_id"));
} else {
partMap.put("UNITMANG_DC", unitmangDc.trim());
}
}
} else {
partMap.put("UNITMANG_DC", "");
}
String unitchngNb = getCellValue(row, columnIndex++, formatter, emptyColCnt);
partMap.put("UNITCHNG_NB", unitchngNb.trim());
@@ -3678,9 +3708,40 @@ public class PartMngService extends BaseService {
} else {
partMap.put("ODRFG", "");
}
// ERP 연동 필드
partMap.put("UNIT_DC", unitDc.trim());
partMap.put("UNITMANG_DC", unitmangDc.trim());
// 재고단위(UNIT_DC) - 코드명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(unitDc)){
if(unitDc.trim().matches("\\d+")){
partMap.put("UNIT_DC", unitDc.trim());
} else {
Map unitDcParam = new HashMap();
unitDcParam.put("CODE_NAME", unitDc.trim());
Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam);
if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){
partMap.put("UNIT_DC", unitDcResult.get("code_id"));
} else {
partMap.put("UNIT_DC", unitDc.trim());
}
}
} else {
partMap.put("UNIT_DC", "");
}
// 관리단위(UNITMANG_DC) - 코드명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(unitmangDc)){
if(unitmangDc.trim().matches("\\d+")){
partMap.put("UNITMANG_DC", unitmangDc.trim());
} else {
Map unitmangParam = new HashMap();
unitmangParam.put("CODE_NAME", unitmangDc.trim());
Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam);
if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){
partMap.put("UNITMANG_DC", unitmangResult.get("code_id"));
} else {
partMap.put("UNITMANG_DC", unitmangDc.trim());
}
}
} else {
partMap.put("UNITMANG_DC", "");
}
partMap.put("UNITCHNG_NB", unitchngNb.trim());
// LOT구분 - 한글명 입력 시 코드값으로 변환 (0:미사용, 1:사용)
if(!CommonUtils.isBlank(lotFg)){
@@ -4198,7 +4259,7 @@ public class PartMngService extends BaseService {
int emptyRowCnt = 0;
AtomicInteger emptyColCnt = new AtomicInteger(0);
Map partNoUniqueMap = new HashMap();
for(int rowIndex= 1 ; rowIndex < rows ; rowIndex++){ // 2번째 행(index 1)부터 시작 (헤더 1줄 건너뜀)
Row row = sheet.getRow(rowIndex);
if(null != row){
@@ -4390,9 +4451,40 @@ public class PartMngService extends BaseService {
partMap.put("ODRFG", "");
}
// ERP 연동 필드
partMap.put("UNIT_DC", unitDc);
partMap.put("UNITMANG_DC", unitmangDc);
// 재고단위(UNIT_DC) - 코드명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(unitDc)){
if(unitDc.trim().matches("\\d+")){
partMap.put("UNIT_DC", unitDc.trim());
} else {
Map unitDcParam = new HashMap();
unitDcParam.put("CODE_NAME", unitDc.trim());
Map unitDcResult = sqlSession.selectOne("partMng.getUnitDcCode", unitDcParam);
if(unitDcResult != null && !StringUtils.isBlank((String)unitDcResult.get("code_id"))){
partMap.put("UNIT_DC", unitDcResult.get("code_id"));
} else {
partMap.put("UNIT_DC", unitDc.trim());
}
}
} else {
partMap.put("UNIT_DC", "");
}
// 관리단위(UNITMANG_DC) - 코드명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(unitmangDc)){
if(unitmangDc.trim().matches("\\d+")){
partMap.put("UNITMANG_DC", unitmangDc.trim());
} else {
Map unitmangParam = new HashMap();
unitmangParam.put("CODE_NAME", unitmangDc.trim());
Map unitmangResult = sqlSession.selectOne("partMng.getUnitDcCode", unitmangParam);
if(unitmangResult != null && !StringUtils.isBlank((String)unitmangResult.get("code_id"))){
partMap.put("UNITMANG_DC", unitmangResult.get("code_id"));
} else {
partMap.put("UNITMANG_DC", unitmangDc.trim());
}
}
} else {
partMap.put("UNITMANG_DC", "");
}
partMap.put("UNITCHNG_NB", unitchngNb);
// LOT구분 - 한글명 입력 시 코드값으로 변환
@@ -5789,4 +5881,5 @@ public class PartMngService extends BaseService {
}
}
}
}

View File

@@ -2786,7 +2786,7 @@ public class ProjectService {
String path = CommonUtils.checkNull(fileMap.get("FILE_PATH"));
String fileName = CommonUtils.checkNull(fileMap.get("SAVED_FILE_NAME"));
int lastColumnIndex = 2;
int lastColumnIndex = 4;
FileInputStream fis = new FileInputStream(path + File.separator + fileName);
XSSFWorkbook workBook = new XSSFWorkbook(fis);
@@ -2803,13 +2803,12 @@ public class ProjectService {
wbsMap.put("WBS_OBJID", CommonUtils.createObjId());
String deptCode = "";
String[] levelValues = new String[3];
String taskName = "";
for(int columnIndex = 0 ; columnIndex < lastColumnIndex ; columnIndex++){
XSSFCell cell = row.getCell(columnIndex);
System.out.println("cell :: " + cell);
//데이버 유형별 get date
String cellValue = "";
if(null == cell){
@@ -2818,27 +2817,19 @@ public class ProjectService {
switch(cell.getCellType()){
case XSSFCell.CELL_TYPE_FORMULA:
cellValue = cell.getCellFormula();
System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_FORMULA:"+cellValue);
break;
case XSSFCell.CELL_TYPE_NUMERIC:
DataFormatter formatter = new DataFormatter();
cellValue = formatter.formatCellValue(cell);
System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue);
break;
case XSSFCell.CELL_TYPE_STRING:
cellValue = cell.getStringCellValue()+"";
System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_STRING:"+cellValue);
break;
case XSSFCell.CELL_TYPE_BLANK:
cellValue = cell.getBooleanCellValue()+"";
System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_BLANK:"+cellValue);
cellValue = "";
break;
case XSSFCell.CELL_TYPE_ERROR:
cellValue = cell.getErrorCellValue()+"";
System.out.println(columnIndex+":"+"XSSFCell.CELL_TYPE_ERROR:"+cellValue);
break;
}
}
@@ -2849,56 +2840,29 @@ public class ProjectService {
cellValue = CommonUtils.checkNull(cellValue);
//기본정보 시작===========================
/* //단계
if(0 == columnIndex){
wbsMap.put("STEP", cellValue);
if(columnIndex <= 2){
levelValues[columnIndex] = cellValue;
}
//TASK명
if(1 == columnIndex){
wbsMap.put("TASK1", cellValue);
}*/
//공정명
if(0 == columnIndex){
wbsMap.put("TASK_NAME", cellValue);
if(columnIndex == 3){
taskName = cellValue;
}
//공정명
if(1 == columnIndex){
wbsMap.put("UNIT_NO", cellValue);
resultList.add(wbsMap);
System.out.println("wbsMap:"+wbsMap);
break;
}
//담당자
/*if(1 == columnIndex){
wbsMap.put("USER_NAME", cellValue);
if(!"".equals(cellValue)){
Map resultMap = new HashMap();
Map codeParamMap = new HashMap();
codeParamMap.put("USER_NAME", cellValue);
resultMap = commonService.getUserMap(codeParamMap);
if(null != resultMap){
wbsMap.put("USER_ID", CommonUtils.checkNull(resultMap.get("USER_ID")));
wbsMap.put("USER_NAME", CommonUtils.checkNull(resultMap.get("USER_NAME")));
}
}
resultList.add(wbsMap);
System.out.println("wbsMap:"+wbsMap);
break;
}*/
}
// 수준1/2/3 중 값이 있는 컬럼에서 UNIT_NO 결정
String unitNo = "";
if(!"".equals(CommonUtils.checkNull(levelValues[2]))){
unitNo = levelValues[2];
} else if(!"".equals(CommonUtils.checkNull(levelValues[1]))){
unitNo = levelValues[1];
} else if(!"".equals(CommonUtils.checkNull(levelValues[0]))){
unitNo = levelValues[0];
}
if(!"".equals(unitNo) && !"".equals(taskName)){
wbsMap.put("UNIT_NO", unitNo);
wbsMap.put("TASK_NAME", taskName);
resultList.add(wbsMap);
System.out.println("wbsMap:"+wbsMap);
}
}
}

View File

@@ -318,7 +318,7 @@ public class PurchaseOrderService {
sqlSession.update("purchaseOrder.mergePurchaseOrderMaster", paramMap);
sqlSession.update("purchaseOrder.initPurchaseOrderPart", paramMap);
//sqlSession.update("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거
String partObjList[] = request.getParameterValues("OBJID");
@@ -340,7 +340,6 @@ public class PurchaseOrderService {
}
}
sqlSession.commit();
resultMap.put("result", true);
@@ -1520,7 +1519,7 @@ public class PurchaseOrderService {
List<Map<String, Object>> gridDataList = JsonUtil.JsonToList(CommonUtils.checkNull(paramMap.get("jqGrid")));
//sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
paramMap.put("PURCHASE_ORDER_MASTER_OBJID", MASTER_OBJID);
cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap);
//cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거
//파트 등록
int [] ARR_STOCK_QTY = new int[gridDataList.size()]; //실발주수량
@@ -1553,7 +1552,7 @@ public class PurchaseOrderService {
//System.out.println("innerTextString:"+innerTextString);
}
insertMap.put("OBJID", CommonUtils.createObjId());
//insertMap.put("OBJID", CommonUtils.createObjId()); // POP OBJID 보존을 위해 신규 OBJID 생성 제거 (기존 OBJID로 UPSERT)
insertMap.put("PURCHASE_ORDER_MASTER_OBJID", MASTER_OBJID);
sqlSession.insert("purchaseOrder.mergePurchaseOrderPartInfo", insertMap);
//구매봄 단가 수정
@@ -1680,7 +1679,16 @@ public class PurchaseOrderService {
cnt = sqlSession.update("purchaseOrder.mergePurchaseOrderMaster", paramMap);
//cnt = sqlSession.update("purchaseOrder.mergePurchaseOrderMulti", paramMap);
cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); //발주서 파트 삭제
//cnt = sqlSession.delete("purchaseOrder.initPurchaseOrderPart", paramMap); // POP OBJID 보존을 위해 전체삭제 제거
// 기존 자식 POP 목록 조회 (PART_OBJID → POP.OBJID 매핑)
Map existingPopParam = new HashMap();
existingPopParam.put("PURCHASE_ORDER_MASTER_OBJID", APPLICATION_OBJID);
List<Map> existingChildPops = sqlSession.selectList("purchaseOrder.getPURCHASE_ORDER_PART", existingPopParam);
Map<String, String> partToPopObjid = new HashMap<String, String>();
for(Map pop : existingChildPops) {
partToPopObjid.put(CommonUtils.checkNull((String)pop.get("part_objid")), CommonUtils.checkNull((String)pop.get("objid")));
}
boolean changeOrderQty = false;
String partObjid = "";
@@ -1689,9 +1697,6 @@ public class PurchaseOrderService {
insertMap.clear();
insertMap.putAll(orgMap);
//insertMap.put("OBJID", newMASTER_OBJID);
partObjid = CommonUtils.createObjId();
insertMap.put("OBJID", partObjid);
insertMap.put("PURCHASE_ORDER_MASTER_OBJID", APPLICATION_OBJID);
System.out.println("insertMap:"+insertMap);
String partNo = CommonUtils.checkNull((String)insertMap.get("PART_NO"));
@@ -1743,9 +1748,19 @@ public class PurchaseOrderService {
throw new Exception(APPLICATION_PROJECT_NUMBER + " (" + partName + ") 동시발주건 구매BOM part가 존재하지 않습니다.(품번:"+partNo+")");
}else {
//해당 프로젝트의 파트정보로 변경
insertMap.put("PART_OBJID", resultList2.get(0).get("objid_part"));
String childPartObjid = (String)resultList2.get(0).get("objid_part");
insertMap.put("PART_OBJID", childPartObjid);
insertMap.put("PART_NAME", resultList2.get(0).get("part_name"));
insertMap.put("PART_NO", resultList2.get(0).get("part_no"));
// 기존 POP OBJID 보존: PART_OBJID로 매칭, 없으면 신규 생성
String existingPopObjid = partToPopObjid.get(childPartObjid);
if(existingPopObjid != null && !"".equals(existingPopObjid)) {
insertMap.put("OBJID", existingPopObjid);
} else {
insertMap.put("OBJID", CommonUtils.createObjId());
}
sqlSession.insert("purchaseOrder.mergePurchaseOrderPartInfo", insertMap);
}