Compare commits

...

4 Commits

Author SHA1 Message Date
2edfff2c44 서브쿼리 오류 수정 2026-03-23 16:56:31 +09:00
d9ca95718b 이봄 csv 업로드 시 기존 파트 정보 새로 업데이트 (임시로! 나중에 다시 원복예정) 2026-03-23 16:01:42 +09:00
ed261664ef 수주단가 필수컬럼 해제 2026-03-20 17:48:45 +09:00
c4eeec1450 구매관리 입고/매입마감 금액 소수점 2자리 포맷 추가
- deliveryMngAcceptanceList: 발주/입고/미입고 금액 및 합계 소수점 2자리 적용
- purchaseCloseList: 입고금액/환율/관세/수입부가세 그리드 포맷 적용
- purchaseCloseList: 마감정보입력 팝업 금액 입력/표시/저장 포맷 처리

Made-with: Cursor
2026-03-20 17:42:59 +09:00
6 changed files with 146 additions and 82 deletions

View File

@@ -265,7 +265,7 @@
html += '<td><input type="text" class="item-quantity" value="' + (item.ORDER_QUANTITY || item.QUANTITY || '') + '" numberOnly required /></td>'; html += '<td><input type="text" class="item-quantity" value="' + (item.ORDER_QUANTITY || item.QUANTITY || '') + '" numberOnly required /></td>';
} }
// ORDER_UNIT_PRICE 수정 가능 // ORDER_UNIT_PRICE 수정 가능
html += '<td><input type="text" class="item-unit-price" value="' + (item.ORDER_UNIT_PRICE || '') + '" numberOnly required /></td>'; html += '<td><input type="text" class="item-unit-price" value="' + (item.ORDER_UNIT_PRICE || '') + '" numberOnly /></td>';
// ORDER_SUPPLY_PRICE 자동 계산 // ORDER_SUPPLY_PRICE 자동 계산
html += '<td><input type="text" class="item-supply-price" value="' + (item.ORDER_SUPPLY_PRICE || '') + '" numberOnly readonly style="background:#f5f5f5;" /></td>'; html += '<td><input type="text" class="item-supply-price" value="' + (item.ORDER_SUPPLY_PRICE || '') + '" numberOnly readonly style="background:#f5f5f5;" /></td>';
// ORDER_VAT 수정 가능 // ORDER_VAT 수정 가능

View File

@@ -133,37 +133,37 @@ var columns = [
else if(cn.includes('유로') || cn === 'EUR') s = '€'; else if(cn.includes('유로') || cn === 'EUR') s = '€';
else if(cn.includes('엔') || cn === 'JPY') s = '¥'; else if(cn.includes('엔') || cn === 'JPY') s = '¥';
else if(cn.includes('위안') || cn === 'CNY') s = '¥'; else if(cn.includes('위안') || cn === 'CNY') s = '¥';
return s + Number(value).toLocaleString(); return s + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
} }
}, },
{headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '입고금액', field : 'TOTAL_DELIVERY_PRICE', {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '입고금액', field : 'TOTAL_DELIVERY_PRICE',
formatter: function(cell) { formatter: function(cell) {
var value = cell.getValue(); var value = cell.getValue();
if(!value || value === '' || value === '0') return ''; if(!value || value === '' || value === '0') return '';
var cn = cell.getRow().getData().CURRENCY_NAME || ''; var cn = cell.getRow().getData().CURRENCY_NAME || '';
var s = ''; var s = '';
if(cn.includes('원') || cn === 'KRW') s = '₩'; if(cn.includes('원') || cn === 'KRW') s = '₩';
else if(cn.includes('달러') || cn === 'USD') s = '$'; else if(cn.includes('달러') || cn === 'USD') s = '$';
else if(cn.includes('유로') || cn === 'EUR') s = '€'; else if(cn.includes('유로') || cn === 'EUR') s = '€';
else if(cn.includes('엔') || cn === 'JPY') s = '¥'; else if(cn.includes('엔') || cn === 'JPY') s = '¥';
else if(cn.includes('위안') || cn === 'CNY') s = '¥'; else if(cn.includes('위안') || cn === 'CNY') s = '¥';
return s + Number(value).toLocaleString(); return s + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
} }
}, },
{headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '미입고금액', field : 'TOTAL_NOT_DELIVERY_PRICE', {headerHozAlign : 'center', hozAlign : 'right', minWidth : 90, widthGrow : 1, title : '미입고금액', field : 'TOTAL_NOT_DELIVERY_PRICE',
formatter: function(cell) { formatter: function(cell) {
var value = cell.getValue(); var value = cell.getValue();
if(!value || value === '' || value === '0') return ''; if(!value || value === '' || value === '0') return '';
var cn = cell.getRow().getData().CURRENCY_NAME || ''; var cn = cell.getRow().getData().CURRENCY_NAME || '';
var s = ''; var s = '';
if(cn.includes('원') || cn === 'KRW') s = '₩'; if(cn.includes('원') || cn === 'KRW') s = '₩';
else if(cn.includes('달러') || cn === 'USD') s = '$'; else if(cn.includes('달러') || cn === 'USD') s = '$';
else if(cn.includes('유로') || cn === 'EUR') s = '€'; else if(cn.includes('유로') || cn === 'EUR') s = '€';
else if(cn.includes('엔') || cn === 'JPY') s = '¥'; else if(cn.includes('엔') || cn === 'JPY') s = '¥';
else if(cn.includes('위안') || cn === 'CNY') s = '¥'; else if(cn.includes('위안') || cn === 'CNY') s = '¥';
return s + Number(value).toLocaleString(); return s + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
} }
}, },
{headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, widthGrow : 1, title : '업체성적서', field : 'INSPECTION_FILE_CNT', {headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, widthGrow : 1, title : '업체성적서', field : 'INSPECTION_FILE_CNT',
formatter:fnc_subInfoValueFormatter, formatter:fnc_subInfoValueFormatter,
cellClick:function(e, cell){ cellClick:function(e, cell){
@@ -269,9 +269,9 @@ function fn_calculateTotalAmount(){
} }
// 합계 표시 // 합계 표시
$("#totalOrderAmount").text(Number(Math.round(totalOrderAmount)).toLocaleString()); $("#totalOrderAmount").text(Number(totalOrderAmount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$("#deliveredAmount").text(Number(Math.round(totalDeliveredAmount)).toLocaleString()); $("#deliveredAmount").text(Number(totalDeliveredAmount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
$("#notDeliveredAmount").text(Number(Math.round(totalNotDeliveredAmount)).toLocaleString()); $("#notDeliveredAmount").text(Number(totalNotDeliveredAmount).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}));
} }
//수입검사등록 //수입검사등록

View File

@@ -172,27 +172,39 @@ $(document).ready(function(){
changeMonth: true, changeMonth: true,
changeYear: true changeYear: true
}); });
// 기존 데이터 세팅 // 기존 데이터 세팅
if(taxType) $('#swal_taxType').val(taxType); if(taxType) $('#swal_taxType').val(taxType);
if(taxInvoiceDate) $('#swal_taxInvoiceDate').val(taxInvoiceDate); if(taxInvoiceDate) $('#swal_taxInvoiceDate').val(taxInvoiceDate);
if(exportDeclNo) $('#swal_exportDeclNo').val(exportDeclNo); if(exportDeclNo) $('#swal_exportDeclNo').val(exportDeclNo);
if(loadingDate) $('#swal_loadingDate').val(loadingDate); if(loadingDate) $('#swal_loadingDate').val(loadingDate);
if(foreignType) $('#swal_foreignType').val(foreignType); if(foreignType) $('#swal_foreignType').val(foreignType);
if(duty) $('#swal_duty').val(duty); if(duty) $('#swal_duty').val(formatMoney(duty));
if(importVat) $('#swal_importVat').val(importVat); if(importVat) $('#swal_importVat').val(formatMoney(importVat));
if(exchangeRate) $('#swal_exchangeRate').val(exchangeRate); if(exchangeRate) $('#swal_exchangeRate').val(formatMoney(exchangeRate));
// 금액 입력 필드 포맷 (keyup: 천단위 콤마, blur: 소수점 2자리)
$('#swal_exchangeRate, #swal_duty, #swal_importVat').on('keyup', function(){
var val = this.value.replace(/[^0-9.]/g, '');
var parts = val.split('.');
if(parts.length > 2) val = parts[0] + '.' + parts.slice(1).join('');
if(parts[0]) parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
this.value = parts.join('.');
}).on('blur', function(){
var v = this.value.replace(/,/g, '');
if(v && !isNaN(v)) this.value = formatMoney(v);
});
}, },
preConfirm: function() { preConfirm: function() {
return { return {
taxType: $('#swal_taxType').val(), taxType: $('#swal_taxType').val(),
taxInvoiceDate: $('#swal_taxInvoiceDate').val(), taxInvoiceDate: $('#swal_taxInvoiceDate').val(),
exportDeclNo: $('#swal_exportDeclNo').val(), exportDeclNo: $('#swal_exportDeclNo').val(),
loadingDate: $('#swal_loadingDate').val(), loadingDate: $('#swal_loadingDate').val(),
foreignType: $('#swal_foreignType').val(), foreignType: $('#swal_foreignType').val(),
duty: $('#swal_duty').val(), duty: removeComma($('#swal_duty').val()),
importVat: $('#swal_importVat').val(), importVat: removeComma($('#swal_importVat').val()),
exchangeRate: $('#swal_exchangeRate').val() exchangeRate: removeComma($('#swal_exchangeRate').val())
}; };
} }
}).then(function(result) { }).then(function(result) {
if (result.isConfirmed) { if (result.isConfirmed) {
@@ -307,7 +319,7 @@ var columns = [
else if(cn.includes('유로') || cn === 'EUR') s = '€'; else if(cn.includes('유로') || cn === 'EUR') s = '€';
else if(cn.includes('엔') || cn === 'JPY') s = '¥'; else if(cn.includes('엔') || cn === 'JPY') s = '¥';
else if(cn.includes('위안') || cn === 'CNY') s = '¥'; else if(cn.includes('위안') || cn === 'CNY') s = '¥';
return s + Number(value).toLocaleString(); return s + Number(value).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
} }
}, },
// {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'미입고금액', field:'TOTAL_NOT_DELIVERY_PRICE', // {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:1, title:'미입고금액', field:'TOTAL_NOT_DELIVERY_PRICE',
@@ -322,13 +334,19 @@ var columns = [
}, },
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'계정과목', field:'SUB_LOCATION_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'계정과목', field:'SUB_LOCATION_NAME'},
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'국내/해외', field:'FOREIGN_TYPE_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'국내/해외', field:'FOREIGN_TYPE_NAME'},
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'환율', field:'EXCHANGE_RATE'}, {headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'환율', field:'EXCHANGE_RATE',
formatter: function(cell){ var v = cell.getValue(); if(!v || v === '') return ''; return formatMoney(v); }
},
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'과세구분', field:'TAX_TYPE_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'과세구분', field:'TAX_TYPE_NAME'},
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'세금계산서발행일', field:'TAX_INVOICE_DATE'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'세금계산서발행일', field:'TAX_INVOICE_DATE'},
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'수출신고필증신고번호', field:'EXPORT_DECL_NO'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'수출신고필증신고번호', field:'EXPORT_DECL_NO'},
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'선적일자', field:'LOADING_DATE'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1.2, title:'선적일자', field:'LOADING_DATE'},
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'관세', field:'DUTY'}, {headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'관세', field:'DUTY',
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'수입부가세', field:'IMPORT_VAT'}, formatter: function(cell){ var v = cell.getValue(); if(!v || v === '') return ''; return formatMoney(v); }
},
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1.2, title:'수입부가세', field:'IMPORT_VAT',
formatter: function(cell){ var v = cell.getValue(); if(!v || v === '') return ''; return formatMoney(v); }
},
{headerHozAlign:'center', hozAlign:'center', minWidth:85, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'} {headerHozAlign:'center', hozAlign:'center', minWidth:85, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'}
]; ];

View File

@@ -7705,6 +7705,43 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
) )
</insert> </insert>
<!-- CSV 업로드 시 기존 파트 정보 업데이트 (임시 - 원복 예정) -->
<update id="updatePartInfoFromCsv" parameterType="map">
UPDATE PART_MNG
SET PART_NAME = #{PART_NAME}
,UNIT = #{UNIT}
,SPEC = #{SPEC}
,MATERIAL = #{MATERIAL}
,THICKNESS = NULLIF(#{THICKNESS}, '')
,WIDTH = NULLIF(#{WIDTH}, '')
,HEIGHT = NULLIF(#{HEIGHT}, '')
,OUT_DIAMETER = NULLIF(#{OUT_DIAMETER}, '')
,IN_DIAMETER = NULLIF(#{IN_DIAMETER}, '')
,LENGTH = NULLIF(#{LENGTH}, '')
,REMARK = #{REMARK}
,PART_TYPE = #{PART_TYPE}
,SUPPLY_CODE = #{SUPPLY_CODE}
,MAKER = #{MAKER}
,POST_PROCESSING = #{POST_PROCESSING}
,HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS}
,HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD}
,SURFACE_TREATMENT = #{SURFACE_TREATMENT}
,ACCTFG = #{ACCTFG}
,ODRFG = #{ODRFG}
,UNIT_DC = #{UNIT_DC}
,UNITMANG_DC = #{UNITMANG_DC}
,UNITCHNG_NB = COALESCE(NULLIF(#{UNITCHNG_NB}, ''), '0')::NUMERIC
,LOT_FG = COALESCE(#{LOT_FG}, '0')
,USE_YN = COALESCE(#{USE_YN}, '1')
,QC_FG = COALESCE(#{QC_FG}, '0')
,SETITEM_FG = COALESCE(#{SETITEM_FG}, '0')
,REQ_FG = COALESCE(#{REQ_FG}, '0')
,UNIT_LENGTH = NULLIF(#{UNIT_LENGTH}, '')
,UNIT_QTY = NULLIF(#{UNIT_QTY}, '')
,EDIT_DATE = now()
WHERE OBJID = #{PART_OBJID}
</update>
<!-- 계약제품, 업체명으로 BOM에 등록된 부품정보 조회 --> <!-- 계약제품, 업체명으로 BOM에 등록된 부품정보 조회 -->
<select id="partLinkedBomContractList" parameterType="map" resultType="map"> <select id="partLinkedBomContractList" parameterType="map" resultType="map">
SELECT P.OBJID AS PART_OBJID SELECT P.OBJID AS PART_OBJID

View File

@@ -867,7 +867,8 @@
FROM CONTRACT_ITEM CI FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'), AND CI.STATUS = 'ACTIVE'
ORDER BY CI.OBJID DESC LIMIT 1),
T.DUE_DATE, T.DUE_DATE,
(SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)
) AS REQUEST_DATE, ) AS REQUEST_DATE,
@@ -876,7 +877,8 @@
FROM CONTRACT_ITEM CI FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE') AS CUSTOMER_REQUEST, AND CI.STATUS = 'ACTIVE'
ORDER BY CI.OBJID DESC LIMIT 1) AS CUSTOMER_REQUEST,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
(SELECT CM.PO_NO FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PO_NO, (SELECT CM.PO_NO FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PO_NO,
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE, COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
@@ -1576,7 +1578,8 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
FROM CONTRACT_ITEM CI FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE'), AND CI.STATUS = 'ACTIVE'
ORDER BY CI.OBJID DESC LIMIT 1),
T.DUE_DATE, T.DUE_DATE,
(SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)
) AS REQUEST_DATE, ) AS REQUEST_DATE,
@@ -1585,7 +1588,8 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
FROM CONTRACT_ITEM CI FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CI.PART_OBJID = T.PART_OBJID AND CI.PART_OBJID = T.PART_OBJID
AND CI.STATUS = 'ACTIVE') AS CUSTOMER_REQUEST, AND CI.STATUS = 'ACTIVE'
ORDER BY CI.OBJID DESC LIMIT 1) AS CUSTOMER_REQUEST,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
T.PO_NO, T.PO_NO,
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE, COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,

View File

@@ -5274,6 +5274,11 @@ public class PartMngService extends BaseService {
resultMap = (HashMap)sqlSession.selectOne("partMng.getPartObjid", partobjMap); //part_no로 is_last = 1 건 조회 resultMap = (HashMap)sqlSession.selectOne("partMng.getPartObjid", partobjMap); //part_no로 is_last = 1 건 조회
if(null!=resultMap){ if(null!=resultMap){
part_no = CommonUtils.checkNull((String)resultMap.get("part_objid")); part_no = CommonUtils.checkNull((String)resultMap.get("part_objid"));
// [임시] 기존 파트를 CSV 데이터로 업데이트 (원복 예정 - 아래 주석된 원본 로직 해제하고 이 블록 삭제할 것)
insertMap.put("PART_OBJID", part_no);
sqlSession.update("partMng.updatePartInfoFromCsv", insertMap);
/* [원본] 기존 파트가 있으면 그대로 사용 (원복 시 위 update 3줄 삭제하고 이 주석만 제거)
*/
}else{ }else{
part_no = CommonUtils.createObjId(); part_no = CommonUtils.createObjId();
//PART저장 //PART저장