V20260210 #165

Merged
hjjeong merged 4 commits from V20260210 into main 2026-03-10 08:59:53 +00:00
12 changed files with 862 additions and 99 deletions

View File

@@ -394,9 +394,8 @@ var columns = [
else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€';
else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥';
else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥';
// 통화 기호 제거 후 콤마 추가
var numericValue = String(value).replace(/[^0-9.]/g, '');
return currencySymbol + addComma(numericValue);
var numericValue = String(value).replace(/[^0-9.\-]/g, '');
return currencySymbol + Number(numericValue).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
},
// 10. 원화환산공급가액
@@ -404,9 +403,8 @@ var columns = [
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '' || value === '0') return '';
// 통화 기호 제거 후 콤마 추가
var numericValue = String(value).replace(/[^0-9.]/g, '');
return '₩' + addComma(numericValue);
var numericValue = String(value).replace(/[^0-9.\-]/g, '');
return '₩' + Number(numericValue).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
}
},
// 11. 견적현황

View File

@@ -50,6 +50,29 @@ $(document).ready(function(){
// 품번/품명 Select2 AJAX 초기화
initPartSelect2Ajax("#SEARCH_PART_NO", "#SEARCH_PART_NAME", "#SEARCH_PART_OBJID");
// 부품품번 Select2 AJAX 초기화 (단독)
$("#SEARCH_COMPONENT_PART_NO").select2({
placeholder: "부품품번 검색...",
allowClear: true,
width: '100%',
minimumInputLength: 1,
language: { inputTooShort: function(){ return "1글자 이상 입력하세요"; }, searching: function(){ return "검색 중..."; }, noResults: function(){ return "검색 결과가 없습니다"; } },
ajax: {
url: '/contractMgmt/searchPartList.do',
dataType: 'json', type: 'POST',
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
delay: 250,
data: function(params){ return { searchTerm: params.term, searchType: 'partNo' }; },
processResults: function(data){
return { results: $.map(data, function(item){
var partNo = item.PART_NO || item.part_no || '';
return { id: partNo, text: partNo };
})};
},
cache: true
}
});
$("input").keyup(function(e){
if(e.keyCode == 13){
$("#page").val("1");
@@ -407,6 +430,14 @@ function fn_purchaseClose(){
<input type="hidden" name="SEARCH_PART_OBJID" id="SEARCH_PART_OBJID" value="">
</td>
</tr>
<tr>
<td><label for="">부품품번</label></td>
<td>
<select name="SEARCH_COMPONENT_PART_NO" id="SEARCH_COMPONENT_PART_NO" class="select2-part" style="width:120px;">
<option value="">부품품번 선택</option>
</select>
</td>
</tr>
</table>
</div>

View File

@@ -0,0 +1,356 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<c:set var="now" value="<%=new java.util.Date() %>"/>
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<%
String menuObjId = request.getParameter("menuObjId");
String menuName = CommonUtils.getMenuName(menuObjId, "매입마감 관리");
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
</head>
<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 type="text/javascript">
$(document).ready(function(){
fnc_changePaginationAndTotalCountArea();
$('.select2').select2();
fnc_datepick();
initPartSelect2Ajax("#SEARCH_PART_NO", "#SEARCH_PART_NAME", "#SEARCH_PART_OBJID");
$("input").keyup(function(e){
if(e.keyCode == 13){
$("#page").val("1");
fn_search();
}
});
// 조회
$("#btnSearch").click(function(){
$("#page").val("1");
fn_search();
});
// 매입마감 버튼
$("#btnClose").click(function(){
fn_purchaseClose();
});
$("#project_no").change(function(){
fn_UnitCodeList(this.value, "unit_code", "");
});
fn_search();
});
var columns = [
{title:'STATUS', field:'STATUS', visible:false, frozen:true},
{title:'PURCHASE_ORDER_MASTER_OBJID', field:'PURCHASE_ORDER_MASTER_OBJID', visible:false, frozen:true},
{title:'PURCHASE_ORDER_PART_OBJID', field:'PURCHASE_ORDER_PART_OBJID', visible:false, frozen:true},
{title:'FORM_TYPE', field:'FORM_TYPE', visible:false, frozen:true},
{title:'ARRIVAL_PLAN_OBJID', field:'ARRIVAL_PLAN_OBJID', visible:false, frozen:true},
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'품의서 No', field:'PROPOSAL_NO',
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
fn_openProposalFormPopUp(cell.getData().SALES_REQUEST_OBJID);
}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'발주서 No', field:'PURCHASE_ORDER_NO',
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
var objId = fnc_checkNull(cell.getData().PURCHASE_ORDER_MASTER_OBJID);
var formType = fnc_checkNull(cell.getData().FORM_TYPE, 'general');
fn_formPopUp(objId, formType);
}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:0.9, title:'프로젝트번호', field:'PROJECT_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'부품품번', field:'COMPONENT_PART_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO'},
{headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME'},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.7, title:'입고일', field:'RECEIPT_DATE'},
//{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:0.8, title:'입고요청일', field:'DELIVERY_REQUEST_DATE'},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'구매담당자', field:'WRITER_NAME'},
// {headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:0.8, title:'발주수량', field:'ORDER_QTY',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
// },
{headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:0.8, title:'입고수량', field:'RECEIPT_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
// {headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:0.8, title:'미입고수량', field:'NON_DELIVERY_QTY',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
// },
// {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'발주금액', field:'TOTAL_SUPPLY_PRICE',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
// },
{headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'입고금액', field:'TOTAL_DELIVERY_PRICE',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
// {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'미입고금액', field:'TOTAL_NOT_DELIVERY_PRICE',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
// },
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.1, title:'수입검사 검사현황', field:'INSPECTION_STATUS'},
{headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1.1, title:'처리결과 폐기수량', field:'DEFECT_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:0.9, title:'확정입고수량', field:'CONFIRMED_QTY',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'}
];
function fn_search(){
var selectedValues = $("#project_no").val();
$('<input>').attr({
type: 'hidden',
name: 'project_nos',
value: selectedValues
}).appendTo('#form1');
var selectedIdValues = $("#sales_mng_user_id").val();
$('input[name="sales_mng_user_ids"]').remove();
$('<input>').attr({
type: 'hidden',
name: 'sales_mng_user_ids',
value: selectedIdValues
}).appendTo('#form1');
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/purchaseOrder/purchaseCloseGridList.do", columns, true);
if(_tabulGrid) {
_tabulGrid.off("renderComplete");
_tabulGrid.on("renderComplete", function(){
fnc_calculateContentHeight("gridDiv", 30);
});
}
$(window).off("resize.gridHeight").on("resize.gridHeight", function() {
fnc_calculateContentHeight("gridDiv", 30);
});
}
// 품의서 상세 팝업
function fn_openProposalFormPopUp(objId){
var url = "/salesMng/proposalFormPopUp.do?PROPOSAL_OBJID=" + fnc_checkNull(objId);
window.open(url, "proposalFormPopUp", "width=1200,height=900,scrollbars=yes,resizable=yes");
}
// 발주서 팝업
function fn_formPopUp(objId, formType){
var popup_width = 1460;
var popup_height = 1050;
formType = fnc_checkNull(formType, 'general');
var hiddenForm = document.hiddenForm;
var target = "";
var url = "";
if(formType == 'outsourcing'){
target = "purchaseOrderFormPopup_outsourcing";
url = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do";
popup_width = 1200;
popup_height = 900;
} else if(formType == 'general'){
target = "purchaseOrderFormPopup_general";
url = "/purchaseOrder/purchaseOrderFormPopup_general.do";
popup_width = 1000;
popup_height = 900;
} else {
target = "purchaseOrderFormPopup_new";
url = "/purchaseOrder/purchaseOrderFormPopup_new.do";
}
fn_centerPopup(popup_width, popup_height, "", target);
hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId;
hiddenForm.action = url;
hiddenForm.target = target;
hiddenForm.submit();
}
// 매입마감 처리 (입고건 단위)
function fn_purchaseClose(){
var selected = _tabulGrid.getSelectedData();
if(selected.length == 0){
Swal.fire("선택된 데이터가 없습니다.");
return;
}
var alreadyClosed = selected.filter(function(item){
return fnc_checkNull(item.PURCHASE_CLOSE_DATE) != '';
});
if(alreadyClosed.length > 0){
Swal.fire("이미 매입마감 처리된 건이 포함되어 있습니다.");
return;
}
var objIds = selected.map(function(item){
return item.ARRIVAL_PLAN_OBJID;
});
Swal.fire({
title: '매입마감',
text: '선택한 ' + selected.length + '건을 매입마감 처리하시겠습니까?',
icon: 'question',
showCancelButton: true,
confirmButtonText: '확인',
cancelButtonText: '취소'
}).then((result) => {
if(result.isConfirmed){
$.ajax({
url: '/purchaseOrder/purchaseCloseByArrival.do',
type: 'POST',
data: { objIds: objIds.join(',') },
dataType: 'json',
success: function(response){
if(response.result == 'SUCCESS'){
Swal.fire('매입마감 처리가 완료되었습니다.').then(function(){
fn_search();
});
} else {
Swal.fire('매입마감 처리 중 오류가 발생했습니다.');
}
},
error: function(){
Swal.fire('서버 통신 중 오류가 발생했습니다.');
}
});
}
});
}
</script>
<body class="bodyNoScroll">
<form name="hiddenForm" id="hiddenForm" method="post">
<input type="hidden" name="checkArr" id="checkArr">
<input type="hidden" name="PURCHASE_ORDER_MASTER_OBJID" id="PURCHASE_ORDER_MASTER_OBJID">
<input type="hidden" name="PURCHASE_ORDER_NO" id="PURCHASE_ORDER_NO">
<input type="hidden" name="actionType" id="actionType">
</form>
<form name="form1" id="form1" action="" method="post">
<textarea style="width:0px; height:0px; visibility: hidden;" id="jsonLevel3_csmCategory">${code_map.jsonLevel3_csmCategory}</textarea>
<div class="content-box" style="height: 99.3%;">
<div class="content-box-s">
<div class="plm_menu_name_gdnsi">
<h2>
<span><%=menuName%></span>
</h2>
<div class="btnArea">
<input type="button" class="plm_btns" value="조회" id="btnSearch">
<input type="button" class="plm_btns" value="매입마감" id="btnClose">
</div>
</div>
<div id="plmSearchZon">
<table>
<tr>
<td><label for="Year">년도</label></td>
<td>
<select name="Year" id="Year" class="select2" autocomplete="off" style="width:170px;">
<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="">고객사</label></td>
<td><select name="customer_cd" id="customer_cd" class="select2" autocomplete="off" style="width:170px;"><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:253px;" class="select2" autocomplete="off" multiple="multiple">
<option value="">선택</option>
${code_map.project_no}
</select>
</td>
<td><label for="">발주No.</label></td>
<td><input type="text" name="purchase_order_no" id="purchase_order_no" autocomplete="off" value="${param.purchase_order_no}" style="width:185px;"/></td>
<td><label for="">규격</label></td>
<td><input type="text" name="SEARCH_PART_SPEC" id="SEARCH_PART_SPEC" autocomplete="off" value="${param.SEARCH_PART_SPEC}" style=""/></td>
<td><label for="">품명</label></td>
<td>
<select name="SEARCH_PART_NAME" id="SEARCH_PART_NAME" class="select2-part" style="width:200px;">
<option value="">품명 선택</option>
</select>
</td>
</tr>
<tr>
<td><label for="">공급업체</label></td>
<td><select name="partner_objid" id="partner_objid" class="select2" autocomplete="off" style="width:170px;"><option value="">선택</option>${code_map.partner_objid}</select></td>
<td><label for="">구매담당자</label></td>
<td><select name="sales_mng_user_id" id="sales_mng_user_id" class="select2" autocomplete="off" style="width:170px;" multiple="multiple"><option value="">선택</option>${code_map.sales_mng_user_id}</select></td>
<td class=""><label>입고일</label></td>
<td>
<input type="text" name="receipt_start_date" id="receipt_start_date" style="width:120px;" autocomplete="off" value="${param.receipt_start_date}" class="date_icon">~
<input type="text" name="receipt_end_date" id="receipt_end_date" style="width:120px;" autocomplete="off" value="${param.receipt_end_date}" class="date_icon">
</td>
<!-- <td class=""><label>발주일</label></td>
<td>
<input type="text" name="reg_start_date" id="reg_start_date" style="width:87px;" autocomplete="off" value="${param.reg_start_date}" class="date_icon">~
<input type="text" name="reg_end_date" id="reg_end_date" style="width:87px;" autocomplete="off" value="${param.reg_end_date}" class="date_icon">
</td> -->
<td><label for="">매입마감</label></td>
<td>
<select name="close_status" id="close_status" class="select2" autocomplete="off" style="width:185px;">
<option value="">선택</option>
<option value="Y">마감</option>
<option value="N">미마감</option>
</select>
</td>
<td><label for="">품번</label></td>
<td>
<select name="SEARCH_PART_NO" id="SEARCH_PART_NO" class="select2-part" style="width:120px;">
<option value="">품번 선택</option>
</select>
<input type="hidden" name="SEARCH_PART_OBJID" id="SEARCH_PART_OBJID" value="">
</td>
</tr>
</table>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</form>
</body>
</html>

View File

@@ -270,14 +270,24 @@ $(document).ready(function(){
,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
,editoptions:{
dataInit: function(e){ e.style.textAlign = "right"; }
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
dataInit: function(e){
e.style.textAlign = "right";
var val = parseFloat($(e).val().replace(/,/g, ''));
if(!isNaN(val)) $(e).val(numberWithCommasDecimal(val));
}
,dataEvents: [
{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}
,{type:"blur", fn:function(e){
var val = parseFloat($(e.target).val().replace(/,/g, ''));
if(!isNaN(val)) $(e.target).val(numberWithCommasDecimal(val));
}}
]
}
}
,{name:"SUPPLY_UNIT_PRICE", width:90, align:"right", sortable:false, editable:false
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
}
,{name:"REMARK" , width:100, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"REMARK" , width:180, align:"left", sortable:false, editable:<%= isModify %>}
,{name:"DELIVERY_REQUEST_DATE", width:90, align:"center", sortable:false, editable:<%= isModify %>}
]
,rownumbers : false
@@ -307,7 +317,13 @@ $(document).ready(function(){
gridFn.opennEdit();
gridFn.calcAllRows();
// 창 크기 변경 시 그리드 리사이즈
$(window).on('resize', function(){
var newWidth = $("#grid1").closest(".ui-jqgrid").parent().width();
$("#grid1").jqGrid('setGridWidth', newWidth, true);
});
<% if(isModify){ %>
// 수정 가능 상태
$("#PARTNER_OBJID,#DELIVERY_PLACE_CD,#PAYMENT_METHOD").prop("disabled","");
@@ -762,11 +778,11 @@ function fn_generateAndUploadPdf(callback) {
<!-- 2행: 기본정보(좌) + 담당자(우) -->
<tr>
<td colspan="4" style="vertical-align:top; padding:10px; ">
<!-- 좌측: 기본정보 -->
<td colspan="3" style="vertical-align:top; padding:10px; width:40%;">
<!-- 좌측: 기본정보 -->
<table style="width:100%; border:none;">
<tr>
<td class="info-label" style="width:40%; border:none; white-space:nowrap;">1. 발 주 번 호 :</td>
<td class="info-label" style="width:140px; border:none; white-space:nowrap;">1. 발 주 번 호 :</td>
<td style="border:none;">
<input type="text" name="PURCHASE_ORDER_NO" id="PURCHASE_ORDER_NO" value="${info.PURCHASE_ORDER_NO}" readonly style="border:none; width:200px; font-weight:bold;"/>
<!-- <span style="color:#888; font-size:10px;">(자동생성)</span> -->
@@ -817,8 +833,8 @@ function fn_generateAndUploadPdf(callback) {
</tr>
</table>
</td>
<td colspan="3" style="vertical-align:top; padding:10px;">
<!-- 우측: 담당자 + 회사정보 + 요청사항 -->
<td colspan="4" style="vertical-align:top; padding:10px; width:60%;">
<!-- 우측: 담당자 + 회사정보 + 요청사항 -->
<!-- 담당자 박스 (PDF 양식과 동일한 테이블 형태) -->
<table class="manager-table" style="width:100%; border-collapse:collapse; border:1px solid #000; font-size:10px;">
<tr>

View File

@@ -222,15 +222,25 @@ $(document).ready(function(){
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
}
}
,{name:"UNIT" , width:40, align:"center", sortable:false, editable:<%= isModify %>
,{name:"UNIT" , width:50, align:"center", sortable:false, editable:<%= isModify %>
,edittype:"select", formatter:"select"
,editoptions:{ value: unit_cd }
}
,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %>
,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2}
,editoptions:{
dataInit: function(e){ e.style.textAlign = "right"; }
,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}]
dataInit: function(e){
e.style.textAlign = "right";
var val = parseFloat($(e).val().replace(/,/g, ''));
if(!isNaN(val)) $(e).val(numberWithCommasDecimal(val));
}
,dataEvents: [
{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}
,{type:"blur", fn:function(e){
var val = parseFloat($(e.target).val().replace(/,/g, ''));
if(!isNaN(val)) $(e.target).val(numberWithCommasDecimal(val));
}}
]
}
}
,{name:"SUPPLY_UNIT_PRICE" , width:90, align:"right", sortable:false, editable:false
@@ -258,7 +268,7 @@ $(document).ready(function(){
// 행번호 자동 부여
var ids = $(this).jqGrid('getDataIDs');
for(var i = 0; i < ids.length; i++){
$(this).jqGrid('setCell', ids[i], 'ROW_NUM', i+2); // 2부터 시작 (PDF 양식 참고)
$(this).jqGrid('setCell', ids[i], 'ROW_NUM', i+1);
}
setTimeout(function(){ gridFn.calcAllRows(); }, 100);
@@ -268,6 +278,12 @@ $(document).ready(function(){
gridFn.opennEdit();
gridFn.calcAllRows();
// 창 크기 변경 시 그리드 리사이즈
$(window).on('resize', function(){
var newWidth = $("#grid1").closest(".ui-jqgrid").parent().width();
$("#grid1").jqGrid('setGridWidth', newWidth, true);
});
<% if(isModify){ %>
// 수정 가능 상태
$("#PARTNER_OBJID").prop("disabled","");
@@ -316,7 +332,7 @@ function fn_addRow(rowData){
var newId = grid.getGridParam("reccount")+1;
var addData = {
"PART_OBJID" : rowData.map.PART_OBJID
,"ROW_NUM" : newId + 1
,"ROW_NUM" : newId
,"PURCHASE_ORDER_NO" : "${info.PURCHASE_ORDER_NO}"
,"PARTNER_NAME" : $("#PARTNER_OBJID option:selected").text()
,"PRODUCT_NAME" : rowData.map.PART_NAME + " / " + rowData.map.SPEC
@@ -393,7 +409,7 @@ var gridFn = {
// 행번호 재정렬
var ids = grid.jqGrid('getDataIDs');
for(var i = 0; i < ids.length; i++){
grid.jqGrid('setCell', ids[i], 'ROW_NUM', i+2);
grid.jqGrid('setCell', ids[i], 'ROW_NUM', i+1);
}
gridFn.footerSummary();
}
@@ -445,7 +461,7 @@ var gridFn = {
}
});
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice));
$("#TOTAL_SUPPLY_PRICE").val(numberWithCommasDecimal(totalSupplyPrice));
$("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원");
}
}

View File

@@ -1354,7 +1354,7 @@ public class PurchaseOrderController {
}
/**
* 매입마감 처리
* 매입마감 처리 (발주서 단위)
* PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트
*/
@ResponseBody
@@ -1363,6 +1363,17 @@ public class PurchaseOrderController {
String objIds = (String) paramMap.get("objIds");
return purchaseOrderService.updatePurchaseCloseDate(objIds);
}
/**
* 매입마감 처리 (입고건 단위)
* ARRIVAL_PLAN의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트
*/
@ResponseBody
@RequestMapping("/purchaseOrder/purchaseCloseByArrival.do")
public Map<String, Object> purchaseCloseByArrival(HttpSession session, HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
String objIds = (String) paramMap.get("objIds");
return purchaseOrderService.updateArrivalPlanCloseDate(objIds);
}
/**
* 품목별 입고 관리 화면
@@ -1410,7 +1421,37 @@ public class PurchaseOrderController {
commonService.selectListPagingNew("purchaseOrder.deliveryMngPartList", request, paramMap);
return paramMap;
}
/**
* 매입마감 관리 화면 (입고일별 입고관리)
*/
@RequestMapping("/purchaseOrder/purchaseCloseList.do")
public String purchaseCloseList(HttpServletRequest request, @RequestParam Map paramMap){
Map code_map = new HashMap();
try{
code_map.put("customer_cd", commonService.bizMakeOptionList("", (String)paramMap.get("customer_cd"), "common.getsupplyselect"));
code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList"));
code_map.put("partner_objid", commonService.bizMakeOptionList("", (String)paramMap.get("partner_objid"), "common.getAllSupplySelect"));
code_map.put("sales_mng_user_id", commonService.bizMakeOptionList("", (String)paramMap.get("sales_mng_user_id"), "common.getUserselect"));
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("code_map", code_map);
return "/purchaseOrder/purchaseCloseList";
}
/**
* 매입마감 관리 그리드 조회 (입고일별 입고관리)
*/
@ResponseBody
@RequestMapping("/purchaseOrder/purchaseCloseGridList.do")
public Map purchaseCloseGridList(HttpSession session, HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
commonService.selectListPagingNew("purchaseOrder.purchaseCloseList", request, paramMap);
return paramMap;
}
/**
* 입고 관리
*/

View File

@@ -8368,46 +8368,54 @@ SELECT PM.OBJID
<!-- ERP 전송을 위한 전체 PART 목록 조회 -->
<select id="selectAllPartListForErp" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg,
UNIT_DC,
UNITMANG_DC,
UNITCHNG_NB,
LOT_FG,
USE_YN,
QC_FG,
SETITEM_FG,
REQ_FG
FROM PART_MNG
WHERE STATUS = 'release'
AND PART_NO IS NOT NULL
AND PART_NAME IS NOT NULL
ORDER BY PART_NO
P.OBJID,
P.PART_NO,
P.PART_NAME,
P.SPEC,
P.acctfg,
P.odrfg,
P.UNIT_DC,
COALESCE(CC_UNIT.CODE_NAME, P.UNIT_DC) AS UNIT_DC_NM,
P.UNITMANG_DC,
COALESCE(CC_UNITMANG.CODE_NAME, P.UNITMANG_DC) AS UNITMANG_DC_NM,
P.UNITCHNG_NB,
P.LOT_FG,
P.USE_YN,
P.QC_FG,
P.SETITEM_FG,
P.REQ_FG
FROM PART_MNG P
LEFT JOIN COMM_CODE CC_UNIT ON CC_UNIT.CODE_ID = P.UNIT_DC
LEFT JOIN COMM_CODE CC_UNITMANG ON CC_UNITMANG.CODE_ID = P.UNITMANG_DC
WHERE P.STATUS = 'release'
AND P.PART_NO IS NOT NULL
AND P.PART_NAME IS NOT NULL
ORDER BY P.PART_NO
</select>
<!-- OBJID로 단일 PART 조회 -->
<select id="selectPartByObjid" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg,
UNIT_DC,
UNITMANG_DC,
UNITCHNG_NB,
LOT_FG,
USE_YN,
QC_FG,
SETITEM_FG,
REQ_FG
FROM PART_MNG
WHERE OBJID = #{objid}
P.OBJID,
P.PART_NO,
P.PART_NAME,
P.SPEC,
P.acctfg,
P.odrfg,
P.UNIT_DC,
COALESCE(CC_UNIT.CODE_NAME, P.UNIT_DC) AS UNIT_DC_NM,
P.UNITMANG_DC,
COALESCE(CC_UNITMANG.CODE_NAME, P.UNITMANG_DC) AS UNITMANG_DC_NM,
P.UNITCHNG_NB,
P.LOT_FG,
P.USE_YN,
P.QC_FG,
P.SETITEM_FG,
P.REQ_FG
FROM PART_MNG P
LEFT JOIN COMM_CODE CC_UNIT ON CC_UNIT.CODE_ID = P.UNIT_DC
LEFT JOIN COMM_CODE CC_UNITMANG ON CC_UNITMANG.CODE_ID = P.UNITMANG_DC
WHERE P.OBJID = #{objid}
</select>
</mapper>

View File

@@ -887,7 +887,7 @@
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT,
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT_DC) AS UNIT,
PM.MAKER,
(SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME,
CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN
@@ -1142,12 +1142,19 @@
-->
</update>
<!-- 매입마감 처리: PURCHASE_CLOSE_DATE를 현재일자로 업데이트 -->
<!-- 매입마감 처리: PURCHASE_ORDER_MASTER 단위 -->
<update id="updatePurchaseCloseDate" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER
SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD')
WHERE OBJID = #{OBJID}
</update>
<!-- 매입마감 처리: ARRIVAL_PLAN 입고건 단위 -->
<update id="updateArrivalPlanCloseDate" parameterType="map">
UPDATE ARRIVAL_PLAN
SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD')
WHERE OBJID = #{OBJID}
</update>
<update id="updatePurchaseOrderMasterPriceAll" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER SET
@@ -6404,7 +6411,227 @@ FROM(
<if test="SEARCH_PART_SPEC != null and SEARCH_PART_SPEC != ''">
AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%'
</if>
<if test="SEARCH_COMPONENT_PART_NO != null and SEARCH_COMPONENT_PART_NO != ''">
AND TRIM(UPPER(
COALESCE(
(SELECT
CASE WHEN COALESCE(SRP3.MATERIAL_YN, 'N') = 'Y' AND SRM3.MBOM_HEADER_OBJID IS NOT NULL THEN
(SELECT MIN(PM3.PART_NO) FROM MBOM_DETAIL MD3
JOIN PART_MNG PM3 ON MD3.PART_OBJID::VARCHAR = PM3.OBJID::VARCHAR
WHERE MD3.RAW_MATERIAL_PART_NO = POP.PART_NO
AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM3.MBOM_HEADER_OBJID::VARCHAR)
ELSE POP.PART_NO
END
FROM SALES_REQUEST_PART SRP3
JOIN SALES_REQUEST_MASTER SRM3 ON SRP3.SALES_REQUEST_MASTER_OBJID = SRM3.OBJID
WHERE SRM3.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID
AND SRP3.PART_OBJID = POP.PART_OBJID
LIMIT 1
),
POP.PART_NO
)
)) LIKE '%'||TRIM(UPPER(#{SEARCH_COMPONENT_PART_NO}))||'%'
</if>
ORDER BY POM.REGDATE DESC, POP.OBJID
</select>
<!-- =====================================================
매입마감 관리 리스트 조회 (입고일별/품목별)
ARRIVAL_PLAN 기준으로 개별 입고건을 풀어서 조회
===================================================== -->
<select id="purchaseCloseList" parameterType="map" resultType="map">
SELECT
AP.OBJID AS ARRIVAL_PLAN_OBJID
,POP.OBJID AS PURCHASE_ORDER_PART_OBJID
,POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
,POM.STATUS
,COALESCE(POM.FORM_TYPE, '') AS FORM_TYPE
<!-- 품의서 정보 -->
,POM.SALES_REQUEST_OBJID
,(SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER SRM
WHERE SRM.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID
AND SRM.DOC_TYPE IN ('PROPOSAL', 'PURCHASE_REG_PROPOSAL')) AS PROPOSAL_NO
<!-- 발주서 정보 -->
,POM.PURCHASE_ORDER_NO
,CM.PROJECT_NO
<!-- 부품품번 -->
,COALESCE(
(SELECT
CASE WHEN COALESCE(SRP2.MATERIAL_YN, 'N') = 'Y' AND SRM2.MBOM_HEADER_OBJID IS NOT NULL THEN
(SELECT MIN(PM2.PART_NO) FROM MBOM_DETAIL MD2
JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR
WHERE MD2.RAW_MATERIAL_PART_NO = POP.PART_NO
AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM2.MBOM_HEADER_OBJID::VARCHAR)
ELSE POP.PART_NO
END
FROM SALES_REQUEST_PART SRP2
JOIN SALES_REQUEST_MASTER SRM2 ON SRP2.SALES_REQUEST_MASTER_OBJID = SRM2.OBJID
WHERE SRM2.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID
AND SRP2.PART_OBJID = POP.PART_OBJID
LIMIT 1
),
POP.PART_NO
) AS COMPONENT_PART_NO
<!-- 품목 정보 -->
,POP.PART_NO
,POP.PART_NAME
<!-- 공급업체 -->
,(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
<!-- 구매담당자 -->
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME
<!-- 입고일 -->
,AP.RECEIPT_DATE
<!-- 입고요청일 -->
,POP.DELIVERY_REQUEST_DATE
<!-- 발주수량 -->
,COALESCE(POP.ORDER_QTY::NUMERIC, 0) AS ORDER_QTY
<!-- 입고수량 (해당 건) -->
,COALESCE(AP.RECEIPT_QTY::NUMERIC, 0) AS RECEIPT_QTY
<!-- 미입고수량 = 발주수량 - 전체입고수량 -->
,(COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.TOTAL_DELIVERY_QTY, 0)) AS NON_DELIVERY_QTY
<!-- 발주금액 = 단가 × 발주수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * COALESCE(POP.ORDER_QTY::NUMERIC, 0) AS TOTAL_SUPPLY_PRICE
<!-- 입고금액 = 단가 × 해당건 입고수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * COALESCE(AP.RECEIPT_QTY::NUMERIC, 0) AS TOTAL_DELIVERY_PRICE
<!-- 미입고금액 = 단가 × 미입고수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * (COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.TOTAL_DELIVERY_QTY, 0)) AS TOTAL_NOT_DELIVERY_PRICE
<!-- 수입검사 검사현황 -->
,(CASE
WHEN IID_AGG.TOTAL_COUNT > 0 AND IID_AGG.TOTAL_COUNT = IID_AGG.COMPLETED_COUNT THEN '완료'
WHEN IID_AGG.COMPLETED_COUNT > 0 THEN '진행중'
ELSE ''
END) AS INSPECTION_STATUS
<!-- 처리결과 폐기수량 -->
,COALESCE(DEFECT_AGG.DEFECT_QTY, 0) AS DEFECT_QTY
<!-- 확정입고수량 = 전체입고수량 - 폐기수량 -->
,(COALESCE(AP_AGG.TOTAL_DELIVERY_QTY, 0) - COALESCE(DEFECT_AGG.DEFECT_QTY, 0)) AS CONFIRMED_QTY
<!-- 매입마감일 (입고건 단위) -->
,AP.PURCHASE_CLOSE_DATE
FROM ARRIVAL_PLAN AP
INNER JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = AP.PARENT_OBJID
INNER JOIN PURCHASE_ORDER_PART POP ON POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
AND POP.PART_OBJID = AP.PART_OBJID
LEFT OUTER JOIN PROJECT_MGMT CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
<!-- 전체 입고수량 집계 (품목별) -->
LEFT OUTER JOIN (
SELECT AP2.PART_OBJID, AP2.PARENT_OBJID
,SUM(COALESCE(AP2.RECEIPT_QTY::NUMERIC, 0)) AS TOTAL_DELIVERY_QTY
FROM ARRIVAL_PLAN AP2
WHERE AP2.RECEIPT_QTY IS NOT NULL AND AP2.RECEIPT_QTY::NUMERIC <![CDATA[ > ]]> 0
GROUP BY AP2.PART_OBJID, AP2.PARENT_OBJID
) AP_AGG ON AP_AGG.PART_OBJID = AP.PART_OBJID AND AP_AGG.PARENT_OBJID = AP.PARENT_OBJID
<!-- 수입검사 현황 집계 -->
LEFT OUTER JOIN (
SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
,IM.PART_OBJID
,COUNT(IDF.OBJID) AS TOTAL_COUNT
,COUNT(CASE WHEN IDF.ACTION_RESULT IS NOT NULL AND IDF.ACTION_RESULT != '' THEN 1 END) AS COMPLETED_COUNT
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID, IM.PART_OBJID
) IID_AGG ON POM.OBJID::VARCHAR = IID_AGG.PURCHASE_ORDER_MASTER_OBJID
AND POP.PART_OBJID = IID_AGG.PART_OBJID
<!-- 폐기수량 집계 -->
LEFT OUTER JOIN (
SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
,IM.PART_OBJID
,SUM(COALESCE(NULLIF(IDF.DEFECT_QTY, '')::NUMERIC, 0)) AS DEFECT_QTY
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
AND IDF.ACTION_RESULT IN ('폐기', 'SCRAP')
GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID, IM.PART_OBJID
) DEFECT_AGG ON POM.OBJID::VARCHAR = DEFECT_AGG.PURCHASE_ORDER_MASTER_OBJID
AND POP.PART_OBJID = DEFECT_AGG.PART_OBJID
WHERE 1=1
AND POM.MAIL_SEND_DATE IS NOT NULL
AND POM.STATUS = 'create'
AND (POM.MULTI_MASTER_YN = 'Y' OR NVL(POM.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM.MULTI_YN, '') != 'Y')
AND AP.RECEIPT_QTY IS NOT NULL
AND AP.RECEIPT_QTY::NUMERIC <![CDATA[ > ]]> 0
<if test="Year != null and Year != ''">
AND TO_CHAR(POM.REGDATE, 'YYYY') = #{Year}
</if>
<if test="customer_cd != null and customer_cd != ''">
AND CM.CUSTOMER_OBJID = REPLACE(#{customer_cd}, 'C_', '')
</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="purchase_order_no != null and purchase_order_no != ''">
AND TRIM(UPPER(POM.PURCHASE_ORDER_NO)) LIKE '%'||TRIM(UPPER(#{purchase_order_no}))||'%'
</if>
<if test="receipt_start_date != null and receipt_start_date != ''">
AND AP.RECEIPT_DATE <![CDATA[ >= ]]> #{receipt_start_date}
</if>
<if test="receipt_end_date != null and receipt_end_date != ''">
AND AP.RECEIPT_DATE <![CDATA[ <= ]]> #{receipt_end_date}
</if>
<if test="partner_objid != null and partner_objid != ''">
AND POM.PARTNER_OBJID = REPLACE(#{partner_objid}, 'C_', '')
</if>
<if test="sales_mng_user_ids != null and sales_mng_user_ids != ''">
AND POM.SALES_MNG_USER_ID IN
<foreach item="value" collection="sales_mng_user_ids.split(',')" open="(" separator="," close=")">
#{value}
</foreach>
</if>
<if test="reg_start_date != null and reg_start_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{reg_start_date}, 'YYYY-MM-DD')
</if>
<if test="reg_end_date != null and reg_end_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{reg_end_date}, 'YYYY-MM-DD')
</if>
<if test="close_status != null and close_status != ''">
<if test="close_status == 'Y'.toString()">
AND AP.PURCHASE_CLOSE_DATE IS NOT NULL AND AP.PURCHASE_CLOSE_DATE != ''
</if>
<if test="close_status == 'N'.toString()">
AND (AP.PURCHASE_CLOSE_DATE IS NULL OR AP.PURCHASE_CLOSE_DATE = '')
</if>
</if>
<if test="SEARCH_PART_NO != null and SEARCH_PART_NO != ''">
AND TRIM(UPPER(POP.PART_NO)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NO}))||'%'
</if>
<if test="SEARCH_PART_NAME != null and SEARCH_PART_NAME != ''">
AND TRIM(UPPER(POP.PART_NAME)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NAME}))||'%'
</if>
<if test="SEARCH_PART_SPEC != null and SEARCH_PART_SPEC != ''">
AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%'
</if>
ORDER BY AP.RECEIPT_DATE DESC, POM.PURCHASE_ORDER_NO, POP.PART_NO
</select>
</mapper>

View File

@@ -5007,10 +5007,10 @@ ORDER BY V.PATH2
PM.PART_NAME,
PM.SPEC,
PM.MATERIAL,
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT,
COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT_DC) AS UNIT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = NULLIF(SRP.UNIT, '')),
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT)
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT_DC)
) AS UNIT_TITLE,
SRP.QTY,
COALESCE(SRP.UNIT_PRICE, 0) AS UNIT_PRICE,

View File

@@ -578,7 +578,14 @@
,(SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID order by regdate desc limit 1) AS EST_OBJID
-- 최근 차수 견적서 합계 정보
,(SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT
,(SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT_KRW
,CASE
WHEN T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != '' AND CAST(T.EXCHANGE_RATE AS NUMERIC) != 0
THEN ROUND(
CAST(COALESCE((SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC)
* CAST(T.EXCHANGE_RATE AS NUMERIC), 2
)
ELSE CAST(COALESCE((SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC)
END AS EST_TOTAL_AMOUNT_KRW
-- 견적수량 (ESTIMATE_TEMPLATE_ITEM의 수량 합계)
,(SELECT COALESCE(SUM(CAST(QUANTITY AS NUMERIC)), 0) FROM ESTIMATE_TEMPLATE_ITEM WHERE TEMPLATE_OBJID = (SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1)) AS ESTIMATE_QUANTITY
-- 수주 합계 정보 (CONTRACT_MGMT 테이블에 저장된 값 사용)

View File

@@ -1508,9 +1508,9 @@ public class BatchService extends BaseService {
// 회사코드 고정값
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드
String unitDc = CommonUtils.checkNull(part.get("unit_dc"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
@@ -1540,7 +1540,7 @@ public class BatchService extends BaseService {
}
// ERP로 전송
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm,itemDc,
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);
// 응답 확인
@@ -1616,9 +1616,9 @@ public class BatchService extends BaseService {
// 회사코드 고정값
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드
String unitDc = CommonUtils.checkNull(part.get("unit_dc"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
@@ -1804,31 +1804,54 @@ public class BatchService extends BaseService {
return result;
}
// DB에서 가져온 값
// DB에서 가져온 값
String itemCd = CommonUtils.checkNull(part.get("part_no"));
String itemNm = CommonUtils.checkNull(part.get("part_name"));
String acctFg = CommonUtils.checkNull(part.get("acctfg"));
String odrFg = CommonUtils.checkNull(part.get("odrfg"));
String itemDc = CommonUtils.checkNull(part.get("spec"));
// 하드코딩 고정값
String coCd = "1000"; // 회사코드
String unitDc = "1"; // 단위
String unitmangDc = "1"; // 단위관리
int unitchngNb = 1; // 단위변환
String lotFg = "0"; // LOT구분
String qcFg = "0"; // 검사구분
String reqFg = "0"; // 청구구분
String setitemFg = "0"; // 세트품목구분
String useYn = "1"; // 사용여부
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
if (!unitchngNbStr.isEmpty()) {
unitchngNb = (int) Double.parseDouble(unitchngNbStr);
}
} catch (Exception e) {
// 변환 실패 시 0 유지
}
String lotFg = CommonUtils.checkNull(part.get("lot_fg"));
String qcFg = CommonUtils.checkNull(part.get("qc_fg"));
String reqFg = CommonUtils.checkNull(part.get("req_fg"));
String setitemFg = CommonUtils.checkNull(part.get("setitem_fg"));
String useYn = CommonUtils.checkNull(part.get("use_yn"));
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
result.put("success", false);
result.put("message", "품번 또는 품명이 없습니다.");
return result;
}
if (acctFg.isEmpty() || odrFg.isEmpty()) {
result.put("success", false);
result.put("message", "계정구분 또는 조달구분이 없습니다.");
return result;
}
if (unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0) {
result.put("success", false);
result.put("message", "재고단위, 관리단위, 환산수량이 없습니다.");
return result;
}
if (lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) {
result.put("success", false);
result.put("message", "LOT구분, 검사여부, 의뢰여부, SET품여부, 사용여부가 없습니다.");
return result;
}
// ERP로 수정 전송
PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient();
String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
@@ -1887,16 +1910,7 @@ public class BatchService extends BaseService {
int failCount = 0;
StringBuilder errorMessages = new StringBuilder();
// 하드코딩 고정값
String coCd = "1000";
String unitDc = "1";
String unitmangDc = "1";
int unitchngNb = 1;
String lotFg = "0";
String qcFg = "0";
String reqFg = "0";
String setitemFg = "0";
String useYn = "1";
String coCd = "1000";
PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient();
@@ -1910,6 +1924,23 @@ public class BatchService extends BaseService {
String acctFg = CommonUtils.checkNull(part.get("acctfg"));
String odrFg = CommonUtils.checkNull(part.get("odrfg"));
String itemDc = CommonUtils.checkNull(part.get("spec"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
if (!unitchngNbStr.isEmpty()) {
unitchngNb = (int) Double.parseDouble(unitchngNbStr);
}
} catch (Exception ex) {
// 변환 실패 시 0 유지
}
String lotFg = CommonUtils.checkNull(part.get("lot_fg"));
String qcFg = CommonUtils.checkNull(part.get("qc_fg"));
String reqFg = CommonUtils.checkNull(part.get("req_fg"));
String setitemFg = CommonUtils.checkNull(part.get("setitem_fg"));
String useYn = CommonUtils.checkNull(part.get("use_yn"));
// 100건마다 진행 상황 출력
if ((i + 1) % 100 == 0) {
@@ -1917,14 +1948,16 @@ public class BatchService extends BaseService {
}
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
if (itemCd.isEmpty() || itemNm.isEmpty() || acctFg.isEmpty() || odrFg.isEmpty() ||
unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0 ||
lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) {
failCount++;
if (failCount <= 5) {
errorMessages.append(itemCd).append(": 품번 또는 품명이 없습니다.\n");
errorMessages.append(itemCd).append(": 필수값이 없습니다.\n");
}
continue;
}
// ERP로 수정 전송
String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);

View File

@@ -3276,6 +3276,36 @@ public class PurchaseOrderService {
return resultMap;
}
/**
* 매입마감 처리 (입고건 단위)
* ARRIVAL_PLAN의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트
*/
public Map<String, Object> updateArrivalPlanCloseDate(String objIds) {
Map<String, Object> resultMap = new HashMap<String, Object>();
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
try {
if(objIds != null && !objIds.isEmpty()) {
String[] objIdArr = objIds.split(",");
for(String objId : objIdArr) {
Map<String, Object> updateParam = new HashMap<String, Object>();
updateParam.put("OBJID", objId.trim());
sqlSession.update("purchaseOrder.updateArrivalPlanCloseDate", updateParam);
}
}
sqlSession.commit();
resultMap.put("result", "SUCCESS");
} catch(Exception e) {
sqlSession.rollback();
e.printStackTrace();
resultMap.put("result", "FAIL");
resultMap.put("message", e.getMessage());
} finally {
sqlSession.close();
}
return resultMap;
}
/**
* 발주 취소 전 입고 여부 확인
* @param request