V20260210 #165
@@ -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. 견적현황
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
356
WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp
Normal file
356
WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp
Normal 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>
|
||||
@@ -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>
|
||||
|
||||
@@ -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) + " 원");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 입고 관리
|
||||
*/
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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,
|
||||
|
||||
@@ -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 테이블에 저장된 값 사용)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user