From 5d60957bcaf65ecbbaad37fcf0c90d917e4ae7f6 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Thu, 13 Nov 2025 09:55:36 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9D=BC=EB=8B=A8=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salesmgmt/mapper/salesNcollectMgmt.xml | 50 +++--- .../salesmgmt/salesMgmt/salesMgmtList.jsp | 10 +- .../view/salesmgmt/salesMgmt/salesRegForm.jsp | 8 +- .../SalesNcollectMgmtController.java | 137 ++++++---------- .../salesmgmt/mapper/salesNcollectMgmt.xml | 24 ++- .../service/SalesNcollectMgmtService.java | 153 ++++++++++-------- 6 files changed, 194 insertions(+), 188 deletions(-) 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 88733f5..a50c020 100644 --- a/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/WebContent/WEB-INF/classes/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -887,18 +887,18 @@ 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, - -- 잔량 계산: 수주수량 - 모든 분할 출하의 합계 + -- 잔량 계산: 수주수량 - shipment_log의 split_quantity 합계 COALESCE(T.QUANTITY::numeric, 0) - COALESCE( - (SELECT SUM(sales_quantity) - FROM sales_registration - WHERE project_no LIKE T.PROJECT_NO || '%'), + (SELECT SUM(COALESCE(split_quantity, 0)) + FROM shipment_log + WHERE target_objid = T.PROJECT_NO), 0 ) AS REMAINING_QUANTITY, - -- 잔량원화총액 계산: (수주수량 - 모든 분할 출하 합계) * 판매단가 + -- 잔량원화총액 계산: (수주수량 - shipment_log 합계) * 판매단가 (COALESCE(T.QUANTITY::numeric, 0) - COALESCE( - (SELECT SUM(sales_quantity) - FROM sales_registration - WHERE project_no LIKE T.PROJECT_NO || '%'), + (SELECT SUM(COALESCE(split_quantity, 0)) + FROM shipment_log + WHERE target_objid = T.PROJECT_NO), 0 )) * COALESCE(SR.sales_unit_price, 0) AS REMAINING_AMOUNT_KRW, COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY, @@ -1630,7 +1630,13 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC @@ -1732,23 +1738,21 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = #{orderNo} - + diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp index fb281d4..5bb0437 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp @@ -138,10 +138,14 @@ var popup_width = 850; var popup_height = 550; - // 기본 파라미터만 전달 (orderNo, saleNo) - // 잔량 계산은 Controller에서 자동으로 처리됨 + // 신규 판매등록: orderNo와 잔량 전달 (saleNo 없음) var params = "orderNo=" + encodeURIComponent(rowData.PROJECT_NO); - params += "&saleNo=" + (rowData.SALE_NO ? encodeURIComponent(rowData.SALE_NO) : ""); + // saleNo는 전달하지 않음 (신규 등록 모드) + + // 그리드에서 계산된 잔량 전달 + if(rowData.REMAINING_QUANTITY != null) { + params += "&remainingQuantity=" + encodeURIComponent(rowData.REMAINING_QUANTITY); + } // 금액 정보는 Controller에서 자동으로 불러옴 (수주 데이터 기반) // URL 파라미터로 전달하지 않음 diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp index 443388c..9d8fe5e 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesRegForm.jsp @@ -801,19 +801,19 @@ function fn_calculateSelectedItem() { - + - (잔량: ${saleInfo.SALES_QUANTITY}개) + (잔량: ${saleInfo.REMAINING_QUANTITY != null ? saleInfo.REMAINING_QUANTITY : saleInfo.ORDER_QUANTITY}개) + placeholder="판매할 수량 입력 (잔량: ${saleInfo.REMAINING_QUANTITY != null ? saleInfo.REMAINING_QUANTITY : saleInfo.ORDER_QUANTITY}개)" /> diff --git a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java index 7d430c6..5e32102 100644 --- a/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java +++ b/src/com/pms/salesmgmt/controller/SalesNcollectMgmtController.java @@ -280,107 +280,64 @@ public class SalesNcollectMgmtController { request.setAttribute("saleInfo", saleInfo); request.setAttribute("orderInfo", saleInfo); } - // orderNo가 있으면 기존 판매 정보 조회 + // orderNo가 있으면 판매 정보 조회 else if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) { System.out.println("=== salesRegForm.do 파라미터 확인 ==="); System.out.println("orderNo: " + paramMap.get("orderNo")); - System.out.println("salesQuantity: " + paramMap.get("salesQuantity")); - System.out.println("salesUnitPrice: " + paramMap.get("salesUnitPrice")); - System.out.println("salesSupplyPrice: " + paramMap.get("salesSupplyPrice")); - System.out.println("salesVat: " + paramMap.get("salesVat")); - System.out.println("salesTotalAmount: " + paramMap.get("salesTotalAmount")); - System.out.println("salesCurrency: " + paramMap.get("salesCurrency")); - System.out.println("salesExchangeRate: " + paramMap.get("salesExchangeRate")); + System.out.println("saleNo: " + paramMap.get("saleNo")); + System.out.println("remainingQuantity: " + paramMap.get("remainingQuantity")); - saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); - salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); - - System.out.println("=== DB에서 조회한 saleInfo ==="); - System.out.println("ORDER_QUANTITY: " + saleInfo.get("ORDER_QUANTITY")); - System.out.println("SALES_QUANTITY: " + saleInfo.get("SALES_QUANTITY")); - System.out.println("SALES_UNIT_PRICE: " + saleInfo.get("SALES_UNIT_PRICE")); - System.out.println("SALES_SUPPLY_PRICE: " + saleInfo.get("SALES_SUPPLY_PRICE")); + // saleNo가 있으면 기존 판매 데이터 수정 모드 + if(paramMap.get("saleNo") != null && !paramMap.get("saleNo").equals("")) { + System.out.println("=== 기존 판매 데이터 수정 모드 ==="); + saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap); + salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); - // URL 파라미터로 그리드 데이터가 전달된 경우 우선 사용 - if(paramMap.get("salesQuantity") != null && !paramMap.get("salesQuantity").equals("")) { - System.out.println("=== URL 파라미터로 그리드 데이터 설정 ==="); - if(saleInfo == null) saleInfo = new HashMap(); - - saleInfo.put("SALES_UNIT_PRICE", paramMap.get("salesUnitPrice")); - saleInfo.put("SALES_SUPPLY_PRICE", paramMap.get("salesSupplyPrice")); - saleInfo.put("SALES_VAT", paramMap.get("salesVat")); - saleInfo.put("SALES_TOTAL_AMOUNT", paramMap.get("salesTotalAmount")); - if(paramMap.get("salesCurrency") != null) { - saleInfo.put("SALES_CURRENCY", paramMap.get("salesCurrency")); - salesCurrency = CommonUtils.nullToEmpty((String)paramMap.get("salesCurrency")); - } - if(paramMap.get("salesExchangeRate") != null) { - saleInfo.put("SALES_EXCHANGE_RATE", paramMap.get("salesExchangeRate")); - } - System.out.println("설정 후 SALES_UNIT_PRICE: " + saleInfo.get("SALES_UNIT_PRICE")); - System.out.println("설정 후 SALES_SUPPLY_PRICE: " + saleInfo.get("SALES_SUPPLY_PRICE")); - System.out.println("설정 후 SALES_VAT: " + saleInfo.get("SALES_VAT")); - System.out.println("설정 후 SALES_TOTAL_AMOUNT: " + saleInfo.get("SALES_TOTAL_AMOUNT")); + System.out.println("=== DB에서 조회한 saleInfo ==="); + System.out.println("ORDER_QUANTITY: " + saleInfo.get("ORDER_QUANTITY")); + System.out.println("SALES_QUANTITY: " + saleInfo.get("SALES_QUANTITY")); + System.out.println("SALES_UNIT_PRICE: " + saleInfo.get("SALES_UNIT_PRICE")); + System.out.println("SALES_SUPPLY_PRICE: " + saleInfo.get("SALES_SUPPLY_PRICE")); } - // 판매 정보가 비어있거나 금액이 0이면 수주 데이터로 채우기 - else if(saleInfo == null || - (saleInfo.get("SALES_SUPPLY_PRICE") == null || - "0".equals(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) || - Integer.parseInt(String.valueOf(saleInfo.get("SALES_SUPPLY_PRICE"))) == 0)) { - // orderNo로 contractObjId 조회 후 수주 데이터 가져오기 - Map orderDataParam = new HashMap(); - orderDataParam.put("orderNo", paramMap.get("orderNo")); - Map orderData = salesNcollectMgmtService.getOrderDataByOrderNo(orderDataParam); + // saleNo가 없으면 신규 판매 등록 모드 -> 수주 데이터만 조회 + else { + System.out.println("=== 신규 판매 등록 모드 ==="); + Map orderDataParam = new HashMap(); + orderDataParam.put("orderNo", paramMap.get("orderNo")); + saleInfo = salesNcollectMgmtService.getOrderDataByOrderNo(orderDataParam); + + if(saleInfo != null) { + salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY")); + // 수주 데이터의 SALES_QUANTITY를 ORDER_QUANTITY로 변경 + saleInfo.put("ORDER_QUANTITY", saleInfo.get("SALES_QUANTITY")); + saleInfo.put("SALES_QUANTITY", ""); // 신규 등록이므로 판매수량은 비워둠 - if(orderData != null && orderData.get("SALES_SUPPLY_PRICE") != null) { - // 수주 데이터를 saleInfo에 병합 (기존 S/N 등은 유지) - if(saleInfo == null) saleInfo = new HashMap(); - // SALES_QUANTITY는 나중에 잔량으로 계산하므로 여기서는 설정하지 않음 - // saleInfo.put("SALES_QUANTITY", orderData.get("SALES_QUANTITY")); // 제거 - saleInfo.put("ORDER_QUANTITY", orderData.get("SALES_QUANTITY")); // 주문수량은 ORDER_QUANTITY로 저장 - saleInfo.put("SALES_UNIT_PRICE", orderData.get("SALES_UNIT_PRICE")); - saleInfo.put("SALES_SUPPLY_PRICE", orderData.get("SALES_SUPPLY_PRICE")); - saleInfo.put("SALES_VAT", orderData.get("SALES_VAT")); - saleInfo.put("SALES_TOTAL_AMOUNT", orderData.get("SALES_TOTAL_AMOUNT")); - saleInfo.put("SALES_CURRENCY", orderData.get("SALES_CURRENCY")); - saleInfo.put("SALES_CURRENCY_NAME", orderData.get("SALES_CURRENCY_NAME")); - saleInfo.put("SALES_EXCHANGE_RATE", orderData.get("SALES_EXCHANGE_RATE")); - if(saleInfo.get("SHIPPING_DATE") == null || "".equals(saleInfo.get("SHIPPING_DATE"))) { - saleInfo.put("SHIPPING_DATE", orderData.get("SHIPPING_DATE")); - } - salesCurrency = CommonUtils.nullToEmpty((String)orderData.get("SALES_CURRENCY")); + System.out.println("=== 수주 데이터 조회 완료 ==="); + System.out.println("ORDER_QUANTITY: " + saleInfo.get("ORDER_QUANTITY")); + System.out.println("SALES_QUANTITY: " + saleInfo.get("SALES_QUANTITY")); + System.out.println("SALES_UNIT_PRICE: " + saleInfo.get("SALES_UNIT_PRICE")); + System.out.println("SALES_SUPPLY_PRICE: " + saleInfo.get("SALES_SUPPLY_PRICE")); } } + + // 신규 등록 모드에서는 이미 수주 데이터를 조회했으므로 추가 처리 불필요 - // 잔량 계산: ORDER_QUANTITY - 모든 분할 출하의 합계 - if(saleInfo != null && saleInfo.get("ORDER_QUANTITY") != null) { - int orderQuantity = Integer.parseInt(String.valueOf(saleInfo.get("ORDER_QUANTITY")).split("\\.")[0]); - - // 모든 분할 출하의 합계 조회 - int totalSoldQuantity = 0; - try { - Map totalResult = salesNcollectMgmtService.getTotalSalesQuantity(paramMap); - System.out.println("getTotalSalesQuantity 결과: " + totalResult); - if(totalResult != null && totalResult.get("total") != null) { - System.out.println("total 값: " + totalResult.get("total")); - totalSoldQuantity = Integer.parseInt(String.valueOf(totalResult.get("total")).split("\\.")[0]); - } - } catch(Exception e) { - System.out.println("getTotalSalesQuantity 에러 발생!"); - e.printStackTrace(); + // 잔량은 그리드에서 이미 계산되어 있으므로 별도 계산 불필요 + // URL 파라미터로 잔량이 전달된 경우 사용 + if(paramMap.get("remainingQuantity") != null && !paramMap.get("remainingQuantity").equals("")) { + if(saleInfo == null) saleInfo = new HashMap(); + saleInfo.put("REMAINING_QUANTITY", paramMap.get("remainingQuantity")); + System.out.println("=== 그리드에서 전달받은 잔량 ==="); + System.out.println("잔량 (REMAINING_QUANTITY): " + saleInfo.get("REMAINING_QUANTITY")); + } + + // 판매수량은 기존 값 유지 (이미 판매 등록된 경우) 또는 비워둠 (신규 등록) + if(saleInfo != null) { + if(saleInfo.get("SALES_QUANTITY") == null || saleInfo.get("SALES_QUANTITY").equals(0)) { + saleInfo.put("SALES_QUANTITY", ""); // 신규 등록: 비워둠 } - - int remainingQuantity = orderQuantity - totalSoldQuantity; - - System.out.println("=== 잔량 계산 ==="); - System.out.println("주문수량 (ORDER_QUANTITY): " + orderQuantity); - System.out.println("총 판매 수량 (모든 분할 출하 합계): " + totalSoldQuantity); - System.out.println("잔량 (remainingQuantity): " + remainingQuantity); - - // 잔량을 판매수량으로 설정 (정수) - saleInfo.put("SALES_QUANTITY", remainingQuantity > 0 ? remainingQuantity : orderQuantity); - System.out.println("설정 후 SALES_QUANTITY: " + saleInfo.get("SALES_QUANTITY")); -} + System.out.println("판매수량 (SALES_QUANTITY): " + saleInfo.get("SALES_QUANTITY")); + } // 프로젝트의 모든 품목 조회 (Phase 2) - 주석처리: 품목은 하나만 존재 /* diff --git a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml index 88733f5..8cd44a6 100644 --- a/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/salesNcollectMgmt.xml @@ -889,14 +889,26 @@ COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW, -- 잔량 계산: 수주수량 - 모든 분할 출하의 합계 COALESCE(T.QUANTITY::numeric, 0) - COALESCE( - (SELECT SUM(sales_quantity) + (SELECT SUM( + CASE + WHEN sales_quantity IS NULL THEN 0 + WHEN TRIM(CAST(sales_quantity AS TEXT)) = '' THEN 0 + ELSE CAST(sales_quantity AS NUMERIC) + END + ) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0 ) AS REMAINING_QUANTITY, -- 잔량원화총액 계산: (수주수량 - 모든 분할 출하 합계) * 판매단가 (COALESCE(T.QUANTITY::numeric, 0) - COALESCE( - (SELECT SUM(sales_quantity) + (SELECT SUM( + CASE + WHEN sales_quantity IS NULL THEN 0 + WHEN TRIM(CAST(sales_quantity AS TEXT)) = '' THEN 0 + ELSE CAST(sales_quantity AS NUMERIC) + END + ) FROM sales_registration WHERE project_no LIKE T.PROJECT_NO || '%'), 0 @@ -1630,7 +1642,13 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC diff --git a/src/com/pms/salesmgmt/service/SalesNcollectMgmtService.java b/src/com/pms/salesmgmt/service/SalesNcollectMgmtService.java index 85490ff..8150751 100644 --- a/src/com/pms/salesmgmt/service/SalesNcollectMgmtService.java +++ b/src/com/pms/salesmgmt/service/SalesNcollectMgmtService.java @@ -350,74 +350,97 @@ public Map saveSaleRegistration(HttpServletRequest request, Map< PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("cretEmpNo", person.getUserId()); - String projectNo = (String) paramMap.get("orderNo"); - System.out.println("=== saveSaleRegistration 시작 ==="); - System.out.println("projectNo: " + projectNo); - System.out.println("salesQuantity: " + paramMap.get("salesQuantity")); - - // 기존 판매 데이터가 있는지 확인 - Map checkParam = new HashMap(); - checkParam.put("orderNo", projectNo); - Map existingSale = sqlSession.selectOne("salesNcollectMgmt.getSaleInfo", checkParam); - - System.out.println("existingSale: " + (existingSale != null ? "있음" : "없음")); + String projectNo = (String) paramMap.get("orderNo"); + String saleNo = (String) paramMap.get("saleNo"); - // SALE_NO가 null이면 첫 판매, 있으면 분할 출하 - Object saleNoObj = existingSale != null ? existingSale.get("SALE_NO") : null; - if(saleNoObj == null) saleNoObj = existingSale != null ? existingSale.get("sale_no") : null; + System.out.println("=== saveSaleRegistration 시작 ==="); + System.out.println("projectNo: " + projectNo); + System.out.println("saleNo (파라미터): " + saleNo); + System.out.println("salesQuantity: " + paramMap.get("salesQuantity")); - System.out.println("SALE_NO 확인: " + saleNoObj); + // 모든 판매를 shipment_log에 기록 (분할 출하 방식 통일) + // 1. 해당 프로젝트의 sales_registration 레코드 확인 + Map checkParam = new HashMap(); + checkParam.put("orderNo", projectNo); + Map existingSale = sqlSession.selectOne("salesNcollectMgmt.getSaleInfo", checkParam); + + Object saleNoObj = null; + if(existingSale != null) { + saleNoObj = existingSale.get("SALE_NO"); + if(saleNoObj == null) saleNoObj = existingSale.get("sale_no"); + } + + System.out.println("existingSale: " + (existingSale != null ? "있음" : "없음")); + System.out.println("SALE_NO: " + saleNoObj); + + // 2. sales_registration 레코드가 없으면 먼저 생성 + if(saleNoObj == null) { + System.out.println("sales_registration 레코드 생성 (첫 판매)"); - if(saleNoObj == null) { - // 첫 판매 등록: sales_registration에 INSERT - System.out.println("첫 판매 등록 - sales_registration에 INSERT"); - sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", paramMap); - } else { - // 분할 출하: shipment_log에 INSERT - System.out.println("분할 출하 - shipment_log에 INSERT"); - - // existingSale은 이미 대문자 키로 변환되어 있음 (CommonUtils.toUpperCaseMapKey) - // 하지만 getSaleInfo에서는 변환 안 함 - 직접 확인 - Object orderQtyObj = existingSale.get("ORDER_QUANTITY"); - if(orderQtyObj == null) orderQtyObj = existingSale.get("order_quantity"); - - // saleNoObj는 이미 위에서 선언됨 - 재사용 - // Object saleNoObj = existingSale.get("SALE_NO"); // 중복 제거 - // if(saleNoObj == null) saleNoObj = existingSale.get("sale_no"); // 이미 위에서 처리 - - System.out.println("ORDER_QUANTITY: " + orderQtyObj); - System.out.println("SALE_NO: " + saleNoObj); - - if(orderQtyObj == null || saleNoObj == null) { - System.out.println("=== existingSale 전체 내용 ==="); - for(Object key : existingSale.keySet()) { - System.out.println(key + ": " + existingSale.get(key)); - } - throw new RuntimeException("ORDER_QUANTITY 또는 SALE_NO가 null입니다"); - } - - paramMap.put("targetObjid", projectNo); - paramMap.put("originalQuantity", orderQtyObj); - - // 잔량 계산 - int orderQuantity = Integer.parseInt(String.valueOf(orderQtyObj).split("\\.")[0]); - int salesQuantity = Integer.parseInt(String.valueOf(paramMap.get("salesQuantity"))); - int remainingQuantity = orderQuantity - salesQuantity; - - System.out.println("orderQuantity: " + orderQuantity); - System.out.println("salesQuantity: " + salesQuantity); - System.out.println("remainingQuantity: " + remainingQuantity); - - paramMap.put("remainingQuantity", remainingQuantity); - paramMap.put("parentSaleNo", saleNoObj); - - System.out.println("shipment_log INSERT 직전 파라미터:"); - System.out.println(" targetObjid: " + paramMap.get("targetObjid")); - System.out.println(" parentSaleNo: " + paramMap.get("parentSaleNo")); - System.out.println(" cretEmpNo: " + paramMap.get("cretEmpNo")); - - sqlSession.insert("salesNcollectMgmt.insertShipmentLog", paramMap); - } + // sales_registration에 기본 레코드 INSERT (수량은 0으로) + Map baseRecord = new HashMap(); + baseRecord.put("orderNo", projectNo); + baseRecord.put("salesQuantity", 0); // 기본 레코드는 수량 0 + baseRecord.put("salesUnitPrice", paramMap.get("salesUnitPrice")); + baseRecord.put("salesSupplyPrice", 0); + baseRecord.put("salesVat", 0); + baseRecord.put("salesTotalAmount", 0); + baseRecord.put("salesCurrency", paramMap.get("salesCurrency")); + baseRecord.put("salesExchangeRate", paramMap.get("salesExchangeRate")); + baseRecord.put("shippingDate", paramMap.get("shippingDate")); + baseRecord.put("shippingMethod", paramMap.get("shippingMethod")); + baseRecord.put("managerUserId", paramMap.get("managerUserId")); + baseRecord.put("incoterms", paramMap.get("incoterms")); + baseRecord.put("serialNo", paramMap.get("serialNo")); + baseRecord.put("cretEmpNo", paramMap.get("cretEmpNo")); + + sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", baseRecord); + + // 생성된 sale_no 조회 + existingSale = sqlSession.selectOne("salesNcollectMgmt.getSaleInfo", checkParam); + saleNoObj = existingSale.get("SALE_NO"); + if(saleNoObj == null) saleNoObj = existingSale.get("sale_no"); + + System.out.println("생성된 SALE_NO: " + saleNoObj); + } + + // 3. shipment_log에 판매 기록 INSERT + System.out.println("shipment_log에 판매 기록 INSERT"); + + Object orderQtyObj = existingSale.get("ORDER_QUANTITY"); + if(orderQtyObj == null) orderQtyObj = existingSale.get("order_quantity"); + + System.out.println("ORDER_QUANTITY: " + orderQtyObj); + + if(orderQtyObj == null || saleNoObj == null) { + System.out.println("=== existingSale 전체 내용 ==="); + for(Object key : existingSale.keySet()) { + System.out.println(key + ": " + existingSale.get(key)); + } + throw new RuntimeException("ORDER_QUANTITY 또는 SALE_NO가 null입니다"); + } + + paramMap.put("targetObjid", projectNo); + paramMap.put("originalQuantity", orderQtyObj); + + // 잔량 계산 + int orderQuantity = Integer.parseInt(String.valueOf(orderQtyObj).split("\\.")[0]); + int salesQuantity = Integer.parseInt(String.valueOf(paramMap.get("salesQuantity"))); + int remainingQuantity = orderQuantity - salesQuantity; + + System.out.println("orderQuantity: " + orderQuantity); + System.out.println("salesQuantity: " + salesQuantity); + System.out.println("remainingQuantity: " + remainingQuantity); + + paramMap.put("remainingQuantity", remainingQuantity); + paramMap.put("parentSaleNo", saleNoObj); + + System.out.println("shipment_log INSERT 직전 파라미터:"); + System.out.println(" targetObjid: " + paramMap.get("targetObjid")); + System.out.println(" parentSaleNo: " + paramMap.get("parentSaleNo")); + System.out.println(" cretEmpNo: " + paramMap.get("cretEmpNo")); + + sqlSession.insert("salesNcollectMgmt.insertShipmentLog", paramMap); sqlSession.commit(); resultMap.put("result", true);