Merge branch 'main' into V2025101701

This commit is contained in:
Johngreen
2025-10-22 21:05:10 +09:00
8 changed files with 292 additions and 130 deletions

View File

@@ -886,7 +886,7 @@
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID)
) AS MANAGER,
COALESCE(SR.incoterms, '') AS INCOTERMS,
'N' AS SALES_STATUS,
T.SALES_STATUS,
T.OBJID::VARCHAR AS SALE_NO,
'ORIGINAL' AS RECORD_TYPE,
'' AS SPLIT_LOG_ID

View File

@@ -310,20 +310,24 @@ var columns = [
}
},
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '견적단가', field : 'EST_PRICE' },
{headerHozAlign : 'center', hozAlign : 'center', width : '130', title : '견적공급가액', field : 'EST_TOTAL_AMOUNT',
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '' || value === '0') return '';
return addComma(value);
}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '150', title : '견적원화환산공급가액', field : 'EST_TOTAL_AMOUNT_KRW',
formatter: function(cell, formatterParams, onRendered){
var value = fnc_checkNull(cell.getValue());
if(value === '' || value === '0') return '';
return addComma(value);
}
},
{headerHozAlign : 'center', hozAlign : 'right', width : '130', title : '견적공급가액', field : 'EST_TOTAL_AMOUNT',
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);
}
},
{headerHozAlign : 'center', hozAlign : 'right', width : '150', title : '견적원화환산공급가액', field : 'EST_TOTAL_AMOUNT_KRW',
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);
}
},
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '견적환종', field : 'CONTRACT_CURRENCY_NAME' },
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '견적환율', field : 'EXCHANGE_RATE' },

View File

@@ -1054,9 +1054,9 @@ function fn_save() {
return;
}
// 합계 계산 (콤마 제거한 순수 숫자)
var totalAmount = $("#totalAmount").text().replace(/,/g, "");
var totalAmountKRW = $("#totalAmountKRW").text().replace(/,/g, "");
// 합계 계산 (통화 기호와 콤마 제거한 순수 숫자)
var totalAmount = $("#totalAmount").text().replace(/[^0-9.]/g, "");
var totalAmountKRW = $("#totalAmountKRW").text().replace(/[^0-9.]/g, "");
// 디버깅: 품목 데이터 확인
console.log("저장할 품목 데이터:", items);

View File

@@ -169,16 +169,16 @@ var columns = [
// {headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '단가', field : 'ORDER_UNIT_PRICE',
// formatter:"money", formatterParams:{thousand:",", symbolAfter:"", precision:false,},
// },
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '수주공급가액', field : 'ORDER_SUPPLY_PRICE_SUM',
{headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '수주공급가액', field : 'ORDER_SUPPLY_PRICE_SUM',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"", precision:false,},
},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '수주부가세', field : 'ORDER_VAT_SUM',
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '수주부가세', field : 'ORDER_VAT_SUM',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"", precision:false,},
},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '수주총액', field : 'ORDER_TOTAL_AMOUNT_SUM',
{headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '수주총액', field : 'ORDER_TOTAL_AMOUNT_SUM',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"", precision:false,},
},
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '수주원화총액', field : 'ORDER_TOTAL_AMOUNT_KRW',
{headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '수주원화총액', field : 'ORDER_TOTAL_AMOUNT_KRW',
formatter:"money", formatterParams:{thousand:",", symbolAfter:"", precision:false,},
},
{headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '견적환종', field : 'CONTRACT_CURRENCY_NAME' },

View File

@@ -27,7 +27,21 @@
}
$(document).ready(function(){
fnc_datepick();
_fnc_datepick();
// select2가 로드되었을 때만 초기화
if(typeof $.fn !== 'undefined' && typeof $.fn.select2 === 'function') {
$('.select2').select2();
// 품번/품명 Select2 AJAX 초기화 (common.js의 새 함수 사용)
initPartSelect2Ajax("#search_partNo", "#search_partName", "#search_partObjId", {
debug: true // 디버깅 모드 활성화
});
} else {
console.error('select2 라이브러리가 로드되지 않았습니다.');
console.error('$.fn:', $.fn);
}
//엔터키로 조회
$("input").keyup(function(e){
if(e.keyCode == 13){
@@ -40,22 +54,78 @@
$("#page").val("1");
fn_search();
});
$("#btnDeadline").click(function(){
var targetObj = _tabulGrid.getSelectedData();
if(1 == targetObj.length){
var OBJID = fnc_checkNull(targetObj[0].OBJID);
var status = fnc_checkNull(targetObj[0].SALES_STATUS);
//var settleAmount = fnc_checkNull(targetObj[0].SETTLE_AMOUNT);
if(status == '' || status == null || status == '매출마감'){
Swal.fire({
title: '선택된 데이터를 매출마감 처리하시겠습니까?',
text: '',
icon: 'warning',
showCancelButton: true, // cancel버튼 보이기. 기본은 원래 없음
confirmButtonColor: '#3085d6', // confrim 버튼 색깔 지정
cancelButtonColor: '#d33', // cancel 버튼 색깔 지정
confirmButtonText: '확인', // confirm 버튼 텍스트 지정
cancelButtonText: '취소', // cancel 버튼 텍스트 지정
reverseButtons: false, // 버튼 순서 거꾸로
}).then(result => {
// 만약 Promise리턴을 받으면,
if (result.isConfirmed) { // 만약 모달창에서 confirm 버튼을 눌렀다면
$.ajax({
url:"/salesNcollectMgmt/salesDeadlineConfirm.do",
type:"POST",
data: {"OBJID" : OBJID},
dataType:"json",
success:function(data){
Swal.fire(data.msg);
fn_search();
},
error: function(jqxhr, status, error){
}
});
}
});
}else{
alert("매출마감 전 데이터만 매출마감 가능합니다.");
return false;
}
//var productGroup = fnc_checkNull(targetObj[0].PRODUCT_GROUP);
//var product = fnc_checkNull(targetObj[0].PRODUCT);
//var releaseObjId = fnc_checkNull(targetObj[0].RELEASE_OBJID);
}else if(0 == targetObj.length){
Swal.fire("선택된 내용이 없습니다.");
return false;
}else if(1 < targetObj.length){
Swal.fire("한번에 1개의 내용만 등록 가능합니다. ");
return false;
}
//fn_confirm();
});
fn_search();
});
</script>
<script type="text/javascript">
var columns = [
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true,
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
var rowData = cell.getData();
var popup_width = 600;
var popup_height = 400;
var url = "/salesMgmt/salesRegForm.do?orderNo=" + rowData.PROJECT_NO + "&saleNo=" + (rowData.SALE_NO || '');
fn_centerPopup(popup_width, popup_height, url);
}
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true
// formatter: fnc_createGridAnchorTag,
// cellClick: function(e, cell){
// var rowData = cell.getData();
// var popup_width = 600;
// var popup_height = 400;
// var url = "/salesMgmt/salesRegForm.do?orderNo=" + rowData.PROJECT_NO + "&saleNo=" + (rowData.SALE_NO || '');
// fn_centerPopup(popup_width, popup_height, url);
// }
},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문유형', field : 'ORDER_TYPE'},
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
@@ -167,6 +237,19 @@ function fn_search(){
_endLoading();
}
});
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/revenueMgmt/revenueGridList.do", columns, true);
}
function _fnc_datepick(){
var $dateinput = $("input.date_icon");
for(var i=0; i<$dateinput.length; i++){
$dateinput.eq(i).attr("size","10");
$dateinput.eq(i).datepicker({
changeMonth:true,
changeYear:true
});
}
}
// 엑셀 다운로드 실행 중 플래그
@@ -281,107 +364,121 @@ function fn_FileRegist(objId, docType, docTypeName){
</div>
<div id="plmSearchZon">
<table>
<colgroup>
<col width="120px">
<col width="20%">
<col width="120px">
<col width="20%">
<col width="120px">
<col width="20%">
<col width="120px">
<col width="*">
</colgroup>
<tr>
<td class="label"><label for="">주문유형</label></td>
<td><select name="orderType" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.orderTypeList}</select></td>
<td><select name="orderType" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.orderTypeList}</select></td>
<td class="label"><label for="">제품구분</label></td>
<td><select name="productType" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.productTypeList}</select></td>
<td class="label"><label for="">국내/해외</label></td>
<td>
<select name="nation" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="D">국내</option>
<option value="E">해외</option>
<select name="nation" class="select2" style="width:150px;">
<option value="">선택</option>
${codeMap.nationList}
</select>
</td>
<td class="label"><label for="">유/무상</label></td>
<td>
<select name="paymentType" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="N">유상</option>
<option value="Y">무상</option>
</select>
</td>
</tr>
<tr>
<td class="label"><label for="">고객사</label></td>
<td><input type="text" name="customer" /></td>
<td class="label"><label for="">품번</label></td>
<td><input type="text" name="productNo" /></td>
<td class="label"><label for="">품명</label></td>
<td><input type="text" name="productName" /></td>
<td class="label"><label for="">S/N</label></td>
<td><input type="text" name="serialNo" /></td>
</tr>
<tr>
<td class="label"><label for="">수주상태</label></td>
<td><select name="orderStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.orderStatusList}</select></td>
<td class="label"><label for="">발주번호</label></td>
<td><input type="text" name="poNo" /></td>
<td class="label"><label for="">담당자</label></td>
<td><select name="manager" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.managerList}</select></td>
<td class="label"><label for="">인도조건</label></td>
<td>
<select name="incoterms" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="EXW">EXW</option>
<option value="FOB">FOB</option>
<option value="CIF">CIF</option>
<option value="DDP">DDP</option>
</select>
</td>
</tr>
<tr>
<td class="label"><label for="">출하대기 상태</label></td>
<td><select name="shippingStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
<td class="label"><label for="">출고방법</label></td>
<td>
<select name="shippingMethod" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="DIRECT">직납</option>
<option value="PARCEL">택배</option>
</select>
</td>
<td class="label"><label for="">요청납기</label></td>
<td colspan="3"><input type="date" name="requestDateFrom" /> ~ <input type="date" name="requestDateTo" /></td>
</tr>
<tr>
<td class="label"><label for="">발주일</label></td>
<td colspan="3"><input type="date" name="orderDateFrom" /> ~ <input type="date" name="orderDateTo" /></td>
<td class="label"><label for="">출고일</label></td>
<td colspan="3"><input type="date" name="shippingDateFrom" /> ~ <input type="date" name="shippingDateTo" /></td>
</tr>
</table>
</div>
<select name="paymentType" class="select2" style="width:120px;">
<option value="">전체</option>
<option value="N">유상</option>
<option value="Y">무상</option>
</select>
</td>
<td><label for="customer_objid">고객사</label></td>
<td>
<select name="customer_objid" id="customer_objid" style="width:150px" class="select2" autocomplete="off">
<option value="">선택</option>
${codeMap.customer_cd}
</select>
</td>
<td class="align_r">
<label for="" class="">품번</label>
</td>
<td>
<select name="search_partNo" id="search_partNo" class="select2-part" style="width: 100%;">
<option value="">품번 선택</option>
</select>
<input type="hidden" name="search_partObjId" id="search_partObjId" value=""/>
</td>
<td class="align_r">
<label for="" class="">품명</label>
</td>
<td colspan="3">
<select name="search_partName" id="search_partName" class="select2-part" style="width: 100%;">
<option value="">품명 선택</option>
</select>
</td>
</tr>
<tr>
<td class="label"><label for="">S/N</label></td>
<td><input type="text" name="serialNo" /></td>
<td class="label"><label for="">수주상태</label></td>
<td><select name="orderStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.orderStatusList}</select></td>
<td class="label"><label for="">발주번호</label></td>
<td><input type="text" name="poNo" /></td>
<td class="label"><label for="">담당자</label></td>
<td><select name="manager" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.managerList}</select></td>
<td class="label"><label for="">인도조건</label></td>
<td>
<select name="incoterms" class="select2" style="width:150px;">
<option value="">전체</option>
<option value="EXW">EXW</option>
<option value="FOB">FOB</option>
<option value="CIF">CIF</option>
<option value="DDP">DDP</option>
</select>
</td>
<td class="label"><label for="">출하대기 상태</label></td>
<td><select name="shippingStatus" class="select2" style="width:150px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
<td class="label"><label for="">출고방법</label></td>
<td>
<select name="shippingMethod" class="select2" style="width:150px;">
<option value="">전체</option>
<option value="DIRECT">직납</option>
<option value="PARCEL">택배</option>
</select>
</td>
</tr>
<tr>
<td class="label"><label for="">요청납기</label></td>
<td colspan="3"><input type="text" name="requestDateFrom" class="date_icon"/> ~ <input type="text" name="requestDateTo" class="date_icon"/></td>
<td class="label"><label for="">발주일</label></td>
<td colspan="3"><input type="text" name="orderDateFrom" class="date_icon"/> ~ <input type="text" name="orderDateTo" class="date_icon"/></td>
<td class="label"><label for="">출고일</label></td>
<td colspan="3"><input type="text" name="shippingDateFrom" class="date_icon"/> ~ <input type="text" name="shippingDateTo" class="date_icon"/></td>
</tr>
</table>
</div>
<!-- Total 합계 표시 영역 -->
<div style="padding: 15px 0; background: #f5f5f5; border-radius: 4px; margin: 10px 0;">
<table style="width: 100%; max-width: 800px; margin: 0 auto;">
<tr>
<td style="text-align: center; padding: 8px; font-weight: bold; font-size: 14px;">
Total 공급가액: <span id="totalSupplyPrice" style="color: #2196F3;">0</span> 원
</td>
<td style="text-align: center; padding: 8px; font-weight: bold; font-size: 14px;">
Total 부가세: <span id="totalVat" style="color: #FF9800;">0</span> 원
</td>
<td style="text-align: center; padding: 8px; font-weight: bold; font-size: 14px;">
Total 총액: <span id="totalAmount" style="color: #4CAF50;">0</span> 원
</td>
</tr>
</table>
<div style="padding: 3px 10px; background: #f5f5f5; border-radius: 3px; margin: 0px 0;">
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
Total 공급가액: <span id="totalSupplyPrice" style="color: #2196F3;">0</span> 원
</span>
<span style="font-weight: bold; font-size: 12px; margin-right: 20px;">
Total 부가세: <span id="totalVat" style="color: #FF9800;">0</span> 원
</span>
<span style="font-weight: bold; font-size: 12px;">
Total 총액: <span id="totalAmount" style="color: #4CAF50;">0</span> 원
</span>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</div>

View File

@@ -106,22 +106,24 @@ public class SalesNcollectMgmtController {
Map<String, Object> codeMap = new HashMap<String, Object>();
// 주문유형
codeMap.put("orderTypeList",
salesMgmtCommonService.bizMakeOptionList("GE", "", "salesMgmtCommon.getCodeList"));
codeMap.put("orderTypeList" , commonService.bizMakeOptionList("0000167", "" , "common.getCodeselect"));
// 제품구분
codeMap.put("productTypeList",
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getGoodsList"));
codeMap.put("productTypeList", commonService.bizMakeOptionList("0000001", "", "common.getCodeselect"));
// 국내/해외
codeMap.put("nationList",
salesMgmtCommonService.bizMakeOptionList("AR", "", "salesMgmtCommon.getCodeList"));
codeMap.put("nationList", commonService.bizMakeOptionList("0001219", "", "common.getCodeselect"));
//고객사
codeMap.put("customer_cd",commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("customer_objid")),"common.getsupplyselect"));
/*
// 유/무상
codeMap.put("paymentTypeList",
salesMgmtCommonService.bizMakeOptionList("0000156", "", "salesMgmtCommon.getCodeList"));
*/
// 수주상태
codeMap.put("orderStatusList",
commonService.bizMakeOptionList("0000932", "", "common.getCodeselect"));
codeMap.put("orderStatusList", commonService.bizMakeOptionList("0000963", "", "common.getCodeselect"));
//codeMap.put("orderStatusList",
// commonService.bizMakeOptionList("0000932", "", "common.getCodeselect"));
// 출하대기 상태
codeMap.put("shippingStatusList",
salesMgmtCommonService.bizMakeOptionList("SH", "", "salesMgmtCommon.getCodeList"));
@@ -131,8 +133,9 @@ public class SalesNcollectMgmtController {
salesMgmtCommonService.bizMakeOptionList("SM", "", "salesMgmtCommon.getCodeList"));
*/
// 담당자
codeMap.put("managerList",
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
codeMap.put("managerList", commonService.bizMakeOptionList("", "", "common.getUserselect"));
//codeMap.put("managerList",
// salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
/*
// 인도조건
codeMap.put("incotermsList",
@@ -735,4 +738,17 @@ public class SalesNcollectMgmtController {
return resultMap;
}
/**
* 매출마감 처리
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/salesNcollectMgmt/salesDeadlineConfirm.do")
public Map salesDeadlineConfirm(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map resultMap = salesNcollectMgmtService.salesDeadlineConfirm(request, paramMap);
return resultMap;
}
}

View File

@@ -886,7 +886,7 @@
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID)
) AS MANAGER,
COALESCE(SR.incoterms, '') AS INCOTERMS,
'N' AS SALES_STATUS,
T.SALES_STATUS,
T.OBJID::VARCHAR AS SALE_NO,
'ORIGINAL' AS RECORD_TYPE,
'' AS SPLIT_LOG_ID

View File

@@ -16,6 +16,7 @@ import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSession;
@@ -790,4 +791,48 @@ public class SalesNcollectMgmtService {
return resultMap;
}
/**
* 매출마감 처리
* @param request
* @param paramMap
* @return
*/
public Map salesDeadlineConfirm(HttpServletRequest request,Map paramMap){
Map resultMap = new HashMap();
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
try{
/*String checkParam = CommonUtils.checkNull(paramMap.get("checkArr"));
String[] targetObjIdList = checkParam.split(",");
if(null != targetObjIdList && 0 < targetObjIdList.length){*/
HttpSession session = request.getSession();
sqlSession = SqlMapConfig.getInstance().getSqlSession();
PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN);
String userId = person.getUserId();
/*for(int i=0;i<targetObjIdList.length;i++){*/
//String objId = CommonUtils.checkNull(targetObjIdList[i]);
//HashMap sqlParamMap = new HashMap();
//sqlParamMap.put("OBJID", objId);
//paramMap.put("PAYMENT_DATE", CommonUtils.getDateTime(new Date(), "yyyy-MM-dd"));
sqlSession.update("salesNcollectMgmt.salesDeadlineConfirm",paramMap);
/*}*/
sqlSession.commit();
resultMap.put("result", true);
resultMap.put("msg", "확인되었습니다");
/*}*/
}catch(Exception e){
resultMap.put("result", false);
resultMap.put("msg", "확인에 실패하였습니다");
sqlSession.rollback();
throw e;
}finally{
sqlSession.close();
}
return resultMap;
}
}