diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/partMng.xml b/WebContent/WEB-INF/classes/com/pms/mapper/partMng.xml index 0bef751..90d9e45 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/partMng.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/partMng.xml @@ -157,10 +157,11 @@ - SUPPLY_CODE - + P.SUPPLY_CODE, + (SELECT SUPPLY_NAME FROM admin_supply_mng O WHERE O.objid::varchar = P.SUPPLY_CODE) AS SUPPLY_NAME, + P.HEAT_TREATMENT_HARDNESS, + P.HEAT_TREATMENT_METHOD, + P.SURFACE_TREATMENT ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.DOC_TYPE IN ('3D_CAD')) CU01_CNT ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) CU02_CNT ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.DOC_TYPE IN ('2D_PDF_CAD')) CU03_CNT @@ -647,9 +648,12 @@ MAKER, POST_PROCESSING, MAJOR_CATEGORY, - SUB_CATEGORY - ) VALUES ( - #{OBJID}::NUMERIC, + SUB_CATEGORY, + HEAT_TREATMENT_HARDNESS, + HEAT_TREATMENT_METHOD, + SURFACE_TREATMENT + ) VALUES ( + #{OBJID}::NUMERIC, #{PRODUCT_MGMT_OBJID}, #{UPG_NO}, #{PART_NO}, @@ -690,9 +694,12 @@ #{MAKER}, #{POST_PROCESSING}, #{MAJOR_CATEGORY}, - #{SUB_CATEGORY} - ) ON - CONFLICT (OBJID) DO + #{SUB_CATEGORY}, + #{HEAT_TREATMENT_HARDNESS}, + #{HEAT_TREATMENT_METHOD}, + #{SURFACE_TREATMENT} + ) ON + CONFLICT (OBJID) DO UPDATE SET PRODUCT_MGMT_OBJID = #{PRODUCT_MGMT_OBJID}, @@ -731,8 +738,11 @@ MAKER = #{MAKER}, POST_PROCESSING = #{POST_PROCESSING}, MAJOR_CATEGORY = #{MAJOR_CATEGORY}, - SUB_CATEGORY = #{SUB_CATEGORY} - + SUB_CATEGORY = #{SUB_CATEGORY}, + HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS}, + HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD}, + SURFACE_TREATMENT = #{SURFACE_TREATMENT} + @@ -784,7 +794,11 @@ CODE4, CODE5, IS_NEW, - IS_LONGD + IS_LONGD, + HEAT_TREATMENT_HARDNESS, + HEAT_TREATMENT_METHOD, + SURFACE_TREATMENT, + SUPPLY_CODE ) VALUES ( #{OBJID}::NUMERIC, #{PRODUCT_MGMT_OBJID}, @@ -838,7 +852,11 @@ #{CODE4}, #{CODE5}, #{IS_NEW}, - #{IS_LONGD} + #{IS_LONGD}, + #{HEAT_TREATMENT_HARDNESS}, + #{HEAT_TREATMENT_METHOD}, + #{SURFACE_TREATMENT}, + #{SUPPLY_CODE} ) ON CONFLICT (OBJID) DO UPDATE @@ -885,7 +903,11 @@ CODE4 = #{CODE4}, CODE5 = #{CODE5}, IS_NEW = #{IS_NEW}, - IS_LONGD = #{IS_LONGD} + IS_LONGD = #{IS_LONGD}, + HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS}, + HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD}, + SURFACE_TREATMENT = #{SURFACE_TREATMENT}, + SUPPLY_CODE = #{SUPPLY_CODE} INSERT INTO PART_MNG_HISTORY @@ -925,7 +947,11 @@ IN_DIAMETER, LENGTH, CONTRACT_OBJID, - MAKER + MAKER, + HEAT_TREATMENT_HARDNESS, + HEAT_TREATMENT_METHOD, + SURFACE_TREATMENT, + SUPPLY_CODE ) VALUES ( #{OBJID}::NUMERIC, #{PRODUCT_MGMT_OBJID}, @@ -962,7 +988,11 @@ #{IN_DIAMETER}, #{LENGTH}, #{CONTRACT_OBJID}, - #{MAKER} + #{MAKER}, + #{HEAT_TREATMENT_HARDNESS}, + #{HEAT_TREATMENT_METHOD}, + #{SURFACE_TREATMENT}, + #{SUPPLY_CODE} ) ON CONFLICT (OBJID) DO @@ -1000,7 +1030,11 @@ IN_DIAMETER = #{IN_DIAMETER}, LENGTH = #{LENGTH}, CONTRACT_OBJID = (SELECT CONTRACT_OBJID FROM PART_MNG WHERE OBJID = #{OBJID}), - MAKER =#{MAKER} + MAKER =#{MAKER}, + HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS}, + HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD}, + SURFACE_TREATMENT = #{SURFACE_TREATMENT}, + SUPPLY_CODE = #{SUPPLY_CODE} + + + UPDATE PART_BOM_REPORT SET NOTE = #{NOTE} @@ -7167,6 +7225,36 @@ SELECT PM.OBJID WHERE 0 ]]> + + + + + + UPDATE PART_BOM_REPORT + SET + PRODUCT_CD = #{product_cd}, + PART_NO = #{part_no}, + PART_NAME = #{part_name}, + REVISION = #{version}, + STATUS = #{status}, + EDITER = #{EDITER}, + EDIT_DATE = NOW() + WHERE + OBJID = #{objId} + + + SELECT + REG_ID AS CONTACT_PERSON, + SUPPLY_TEL_NO AS CELL_PHONE, + EMAIL + FROM SUPPLY_MNG + WHERE OBJID = #{customerObjId}::NUMERIC + + \ No newline at end of file diff --git a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index 3fd34e5..d3d579b 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -814,9 +814,10 @@ - /* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (리스트와 동일한 구조) */ + /* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (sales_registration 테이블 사용) */ SELECT T.PROJECT_NO, CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE, @@ -1381,163 +1315,59 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N 정보 (리스트와 동일: "첫번째 S/N 외 N건") + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N 정보 (CONTRACT_ITEM_SERIAL에서만 조회, 품목별로 정확하게 매칭) + (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SEQ) + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL + ) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT COALESCE( - (SELECT - CASE - WHEN COUNT(*) = 0 THEN '' - WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) - ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' - END - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - ), '' - ) AS SERIAL_NO, - -- S/N 전체 목록 JSON 형식으로 - COALESCE( - (SELECT - JSON_AGG( - JSON_BUILD_OBJECT( - 'id', sn_data.row_num, - 'value', sn_data.serial_no - ) - )::TEXT - FROM ( - SELECT - ROW_NUMBER() OVER (ORDER BY CIS.SERIAL_NO) AS row_num, - CIS.SERIAL_NO AS serial_no - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - AND CIS.SERIAL_NO IS NOT NULL - ) AS sn_data - ), '[]' - ) AS SERIAL_NO_LIST, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - T.DUE_DATE AS REQUEST_DATE, - T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST, + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, + COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, - T.CONTRACT_DATE AS ORDER_DATE, + COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE, CASE WHEN EXISTS( SELECT 1 FROM ATTACH_FILE_INFO - WHERE TARGET_OBJID = T.OBJID::VARCHAR + WHERE TARGET_OBJID = T.CONTRACT_OBJID AND DOC_TYPE='ORDER_DOC' AND UPPER(STATUS) = 'ACTIVE' - ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, - (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (shipment_log에서 가져오기) - COALESCE(( - SELECT SL.SHIPPING_STATUS - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_ORDER_STATUS, - COALESCE(( - SELECT SL.SPLIT_QUANTITY - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_QUANTITY, - COALESCE(( - SELECT SL.SALES_UNIT_PRICE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_UNIT_PRICE, - COALESCE(( - SELECT SL.SALES_SUPPLY_PRICE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_SUPPLY_PRICE, - COALESCE(( - SELECT SL.SALES_VAT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_VAT, - COALESCE(( - SELECT SL.SALES_TOTAL_AMOUNT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_TOTAL_AMOUNT, - COALESCE(( - SELECT SL.SALES_TOTAL_AMOUNT - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(( - SELECT SL.SALES_CURRENCY - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(( - SELECT SL.SALES_EXCHANGE_RATE - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, - COALESCE(( - SELECT TO_CHAR(SL.SHIPPING_DATE, 'YYYY-MM-DD') - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_DATE, - COALESCE(( - SELECT SL.SHIPPING_METHOD - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS SHIPPING_METHOD, - COALESCE(( - SELECT SL.MANAGER_USER_ID - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), T.PM_USER_ID) AS MANAGER, - COALESCE(( - SELECT SL.INCOTERMS - FROM SHIPMENT_LOG SL - WHERE SL.TARGET_OBJID = T.PROJECT_NO - AND SL.LOG_TYPE = 'SALES_REGISTRATION' - ORDER BY SL.REG_DATE DESC - LIMIT 1 - ), '') AS INCOTERMS - FROM PROJECT_MGMT AS T - WHERE T.PROJECT_NO = #{orderNo} + ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, + (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, + -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(NULLIF(SR.sales_exchange_rate, 0), CM.EXCHANGE_RATE::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, + COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, + COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, + COALESCE(SR.incoterms, '') AS INCOTERMS + FROM PROJECT_MGMT AS T + LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID::VARCHAR = T.CONTRACT_OBJID + WHERE T.PROJECT_NO = #{orderNo} diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp index adbbec7..44898ac 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp @@ -171,7 +171,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '판매원화총액', field : 'SALES_TOTAL_AMOUNT_KRW', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: false} }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY'}, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY_NAME'}, {headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '판매환율', field : 'SALES_EXCHANGE_RATE', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2} }, diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp index 4956074..aa748ad 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp @@ -109,7 +109,7 @@ var columns = [ {headerHozAlign : 'center', hozAlign : 'right', width : '120', title : '판매원화총액', field : 'SALES_TOTAL_AMOUNT_KRW', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: false} }, - {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY'}, + {headerHozAlign : 'center', hozAlign : 'center', width : '80', title : '판매환종', field : 'SALES_CURRENCY_NAME'}, {headerHozAlign : 'center', hozAlign : 'right', width : '100', title : '판매환율', field : 'SALES_EXCHANGE_RATE', formatter: "money", formatterParams: {thousand: ",", symbolAfter: "", precision: 2} }, diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp index 497e0ac..f80db48 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp @@ -26,6 +26,9 @@ $("#manager").val(managerValue).trigger('change'); } + // 판매환종 초기값 설정 (견적환종과 동기화) + initializeSalesCurrency(); + // S/N 필드 클릭 이벤트 $("#serialNo").click(function() { fn_openSnManagePopup(); @@ -99,6 +102,37 @@ $("#salesTotalAmount").val(totalAmount); } + // 판매환종 초기값 설정 (견적환종과 동기화하되, 사용자가 변경 가능) + function initializeSalesCurrency() { + var existingSalesCurrency = "${saleInfo.SALES_CURRENCY}"; + var contractCurrency = "${orderInfo.SALES_CURRENCY}"; // 견적환종 (SALES_CURRENCY로 통일) + var contractExchangeRate = "${orderInfo.SALES_EXCHANGE_RATE}"; // 견적환율 + + console.log("=== 판매환종 초기화 디버그 ==="); + console.log("기존 판매환종:", existingSalesCurrency); + console.log("견적환종:", contractCurrency); + console.log("견적환율:", contractExchangeRate); + + // 이미 저장된 판매환종이 있으면 그대로 사용 + if(existingSalesCurrency && existingSalesCurrency.trim() !== '') { + $("#salesCurrency").val(existingSalesCurrency).trigger('change'); + console.log("기존 판매환종 사용:", existingSalesCurrency); + } + // 없으면 견적환종을 기본값으로 설정 + else if(contractCurrency && contractCurrency.trim() !== '') { + $("#salesCurrency").val(contractCurrency).trigger('change'); + + // 견적환율도 함께 설정 + if(contractExchangeRate && contractExchangeRate.trim() !== '') { + $("#salesExchangeRate").val(contractExchangeRate); + } + + console.log("판매환종 자동 설정: " + contractCurrency + " (견적환종과 동기화)"); + } else { + console.log("견적환종이 없습니다. orderInfo를 확인하세요."); + } + } + // 환율 변경 시 원화 금액 재계산 function fn_recalculateByExchangeRate() { var currency = $("#salesCurrency").val(); @@ -580,19 +614,20 @@ - - - - - - - - - - + + + + + * 최초 저장 시 견적환종이 자동 설정되며, 변경 가능합니다. + + + + + + diff --git a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java index 2754673..c6572a9 100644 --- a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java +++ b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java @@ -267,20 +267,23 @@ public class SalesNcollectMgmtController { codeMap.put("managerList", salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList")); - // 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅 - Map saleInfo = null; - String salesCurrency = ""; - if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) { - saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); - salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); - request.setAttribute("saleInfo", saleInfo); - } + // 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅 + Map saleInfo = null; + String salesCurrency = ""; + if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) { + saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); + salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); + request.setAttribute("saleInfo", saleInfo); - // 환종(통화) - 공통코드 0001533 - codeMap.put("salesCurrency", - commonService.bizMakeOptionList("0001533", salesCurrency, "common.getCodeselect")); - - request.setAttribute("codeMap", codeMap); + // orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함) + request.setAttribute("orderInfo", saleInfo); + } + + // 환종(통화) - 공통코드 0001533 + codeMap.put("salesCurrency", + commonService.bizMakeOptionList("0001533", salesCurrency, "common.getCodeselect")); + + request.setAttribute("codeMap", codeMap); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index e539d51..d3d579b 100644 --- a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -830,36 +830,33 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N: sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL (모두 "외 몇건" 형태로 표시) - COALESCE( - (SELECT - CASE - WHEN SR.serial_no IS NULL OR SR.serial_no = '' THEN '' - ELSE - (SELECT - CASE - WHEN array_length(string_to_array(SR.serial_no, ','), 1) = 1 THEN SR.serial_no - ELSE (string_to_array(SR.serial_no, ','))[1] || ' 외 ' || (array_length(string_to_array(SR.serial_no, ','), 1) - 1)::TEXT || '건' - END - ) - END - FROM sales_registration SR WHERE SR.project_no = T.PROJECT_NO - ), - (SELECT - CASE - WHEN COUNT(*) = 0 THEN '' - WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) - ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' - END - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE' AND CIS.SERIAL_NO IS NOT NULL), - '' - ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE, + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N: CONTRACT_ITEM_SERIAL에서만 조회 (품목별로 정확하게 매칭) + (SELECT + CASE + WHEN COUNT(*) = 0 THEN '' + WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO) + ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건' + END + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT + COALESCE( + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, @@ -871,16 +868,17 @@ AND UPPER(STATUS) = 'ACTIVE' ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기) - COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, - COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, - COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, - COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, - COALESCE(SR.sales_vat, 0) AS SALES_VAT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, + -- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, COALESCE( @@ -1317,22 +1315,29 @@ ELSE CM.PAID_TYPE END FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE, - T.PART_NO AS PRODUCT_NO, - T.PART_NAME AS PRODUCT_NAME, - -- S/N 정보 (sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL에서) - COALESCE( - SR.serial_no, - (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SERIAL_NO) - FROM CONTRACT_ITEM CI - LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID - WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID - AND UPPER(CIS.STATUS) = 'ACTIVE' - AND CIS.SERIAL_NO IS NOT NULL - ), - '' - ) AS SERIAL_NO, - COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, - COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE, + T.PART_NO AS PRODUCT_NO, + T.PART_NAME AS PRODUCT_NAME, + -- S/N 정보 (CONTRACT_ITEM_SERIAL에서만 조회, 품목별로 정확하게 매칭) + (SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SEQ) + FROM CONTRACT_ITEM CI + LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE' + AND UPPER(CIS.STATUS) = 'ACTIVE' + AND CIS.SERIAL_NO IS NOT NULL + ) AS SERIAL_NO, + COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY, + -- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT + COALESCE( + (SELECT CI.DUE_DATE + FROM CONTRACT_ITEM CI + WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID + AND CI.PART_OBJID = T.PART_OBJID + AND CI.STATUS = 'ACTIVE'), + T.DUE_DATE, + (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) + ) AS REQUEST_DATE, COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST, CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS, T.PO_NO, @@ -1344,23 +1349,25 @@ AND UPPER(STATUS) = 'ACTIVE' ) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH, (SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS, - -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) - COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, - COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, - COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, - COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, - COALESCE(SR.sales_vat, 0) AS SALES_VAT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, - COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, - COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, - COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE, - COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, - COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, - COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, - COALESCE(SR.incoterms, '') AS INCOTERMS - FROM PROJECT_MGMT AS T - LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no - WHERE T.PROJECT_NO = #{orderNo} + -- 판매 관련 필드들 (sales_registration 테이블에서 가져오기) + COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS, + COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY, + COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE, + COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE, + COALESCE(SR.sales_vat, 0) AS SALES_VAT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT, + COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, + COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY) AS SALES_CURRENCY, + CODE_NAME(COALESCE(NULLIF(SR.sales_currency, ''), CM.CONTRACT_CURRENCY)) AS SALES_CURRENCY_NAME, + COALESCE(NULLIF(SR.sales_exchange_rate, 0), CM.EXCHANGE_RATE::numeric, 0) AS SALES_EXCHANGE_RATE, + COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE, + COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD, + COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER, + COALESCE(SR.incoterms, '') AS INCOTERMS + FROM PROJECT_MGMT AS T + LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no + LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID::VARCHAR = T.CONTRACT_OBJID + WHERE T.PROJECT_NO = #{orderNo}