Merge branch 'V2025111104'

This commit is contained in:
leeheejin
2025-11-12 18:56:54 +09:00
14 changed files with 2674 additions and 276 deletions

View File

@@ -269,7 +269,24 @@ public class ContractMgmtController {
@ResponseBody
@RequestMapping("/contractMgmt/contractGridList.do")
public Map getProductKindSpecListPaging(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
commonService.selectListPagingNew("contractMgmt.contractGridList", request, paramMap);
try {
// 페이징 데이터 조회
commonService.selectListPagingNew("contractMgmt.contractGridList", request, paramMap);
// 조회된 데이터의 전체 합계 조회
Map<String, Object> totalAmount = (Map<String, Object>) commonService.selectOne("contractMgmt.getContractGridTotalAmount", request, paramMap);
// 합계 데이터 추가
if(totalAmount != null) {
paramMap.put("TOTAL_AMOUNT_KRW", totalAmount.get("totalAmountKRW"));
} else {
paramMap.put("TOTAL_AMOUNT_KRW", 0);
}
} catch(Exception e) {
e.printStackTrace();
paramMap.put("TOTAL_AMOUNT_KRW", 0);
}
return paramMap;
}
@@ -2359,6 +2376,41 @@ public class ContractMgmtController {
return paramMap;
}
/**
* 주문서관리 - Total 합계 조회
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/contractMgmt/getOrderTotalAmount.do")
public Map getOrderTotalAmount(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
// Total 합계 조회
Map<String, Object> totalData = contractMgmtService.getOrderTotalAmount(request, paramMap);
if(totalData != null) {
resultMap.put("result", "success");
resultMap.put("totalSupplyPrice", totalData.get("TOTAL_SUPPLY_PRICE"));
resultMap.put("totalVat", totalData.get("TOTAL_VAT"));
resultMap.put("totalAmount", totalData.get("TOTAL_AMOUNT"));
} else {
resultMap.put("result", "success");
resultMap.put("totalSupplyPrice", 0);
resultMap.put("totalVat", 0);
resultMap.put("totalAmount", 0);
}
} catch (Exception e) {
e.printStackTrace();
resultMap.put("result", "error");
resultMap.put("message", e.getMessage());
}
return resultMap;
}
/**
* 수주등록 팝업 페이지
* @param session

View File

@@ -282,11 +282,48 @@ public class SalesNcollectMgmtController {
}
// orderNo가 있으면 기존 판매 정보 조회
else if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
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"));
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"));
// URL 파라미터로 그리드 데이터가 전달된 경우 우선 사용
if(paramMap.get("salesQuantity") != null && !paramMap.get("salesQuantity").equals("")) {
System.out.println("=== URL 파라미터로 그리드 데이터 설정 ===");
if(saleInfo == null) saleInfo = new HashMap<String, Object>();
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"));
}
// 판매 정보가 비어있거나 금액이 0이면 수주 데이터로 채우기
if(saleInfo == null ||
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)) {
@@ -298,7 +335,9 @@ public class SalesNcollectMgmtController {
if(orderData != null && orderData.get("SALES_SUPPLY_PRICE") != null) {
// 수주 데이터를 saleInfo에 병합 (기존 S/N 등은 유지)
if(saleInfo == null) saleInfo = new HashMap<String, Object>();
saleInfo.put("SALES_QUANTITY", orderData.get("SALES_QUANTITY"));
// 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"));
@@ -310,13 +349,54 @@ public class SalesNcollectMgmtController {
saleInfo.put("SHIPPING_DATE", orderData.get("SHIPPING_DATE"));
}
salesCurrency = CommonUtils.nullToEmpty((String)orderData.get("SALES_CURRENCY"));
}
}
// 잔량 계산: 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<String, Object> 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();
}
request.setAttribute("saleInfo", saleInfo);
int remainingQuantity = orderQuantity - totalSoldQuantity;
// orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함)
request.setAttribute("orderInfo", saleInfo);
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"));
}
// 프로젝트의 모든 품목 조회 (Phase 2) - 주석처리: 품목은 하나만 존재
/*
List<Map<String, Object>> projectItems = null;
if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
projectItems = salesNcollectMgmtService.getProjectItems(paramMap);
System.out.println("=== 프로젝트 품목 조회 ===");
System.out.println("품목 개수: " + (projectItems != null ? projectItems.size() : 0));
request.setAttribute("projectItems", projectItems);
}
*/
request.setAttribute("saleInfo", saleInfo);
// orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함)
request.setAttribute("orderInfo", saleInfo);
}
// 환종(통화) - 공통코드 0001533
@@ -418,6 +498,96 @@ public class SalesNcollectMgmtController {
return resultMap;
}
/**
* <pre>
* 출하일 상세 내역 팝업
* </pre>
* @param request
* @param paramMap - projectNo
* @return String
*/
@RequestMapping(value = "/salesMgmt/shippingDetailPopup.do", method = RequestMethod.GET)
public String showShippingDetailPopup(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
String projectNo = (String) paramMap.get("projectNo");
List<Map<String, Object>> shippingList = salesNcollectMgmtService.getShippingDetailList(projectNo);
request.setAttribute("shippingList", shippingList);
request.setAttribute("projectNo", projectNo);
} catch (Exception e) {
e.printStackTrace();
}
return "/salesmgmt/salesMgmt/shippingDetailPopup";
}
/**
* 거래명세서 폼 표시
*/
@RequestMapping(value = "/salesMgmt/transactionStatementForm.do", method = RequestMethod.GET)
public String showTransactionStatementForm(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
return "/salesmgmt/salesMgmt/transactionStatementForm";
}
/**
* 거래명세서 데이터 조회
*/
@RequestMapping(value = "/salesMgmt/getTransactionStatementData.do", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getTransactionStatementData(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
String projectNos = (String) paramMap.get("projectNos");
if(projectNos == null || projectNos.isEmpty()) {
resultMap.put("success", false);
resultMap.put("message", "프로젝트 번호가 없습니다.");
return resultMap;
}
// 거래명세서 데이터 조회
Map<String, Object> statementData = salesNcollectMgmtService.getTransactionStatementData(paramMap);
resultMap.put("success", true);
resultMap.putAll(statementData);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("success", false);
resultMap.put("message", "데이터 조회 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
/**
* 거래명세서 저장 (차수 관리 없음)
*/
@RequestMapping(value = "/salesMgmt/saveTransactionStatement.do", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> saveTransactionStatement(HttpServletRequest request, @org.springframework.web.bind.annotation.RequestBody Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
// 거래명세서는 차수 관리가 불필요하므로 단순히 성공 응답만 반환
// 실제로는 PDF 생성 또는 로그 기록 등의 작업을 수행할 수 있음
System.out.println("=== 거래명세서 저장 ===");
System.out.println("프로젝트 번호: " + paramMap.get("projectNos"));
System.out.println("납품일: " + paramMap.get("deliveryDate"));
System.out.println("비고: " + paramMap.get("noteContent"));
resultMap.put("success", true);
resultMap.put("message", "저장되었습니다.");
} catch (Exception e) {
e.printStackTrace();
resultMap.put("success", false);
resultMap.put("message", "저장 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
/**
* <pre>
* 계약관리 목록 조회

View File

@@ -790,6 +790,102 @@
ORDER BY REGDATE DESC
</select>
<!-- 주문서관리 Total 합계 조회 (조회된 데이터 전체 합계) -->
<select id="getContractGridTotalAmount" parameterType="map" resultType="map">
/* contractMgmt.getContractGridTotalAmount */
SELECT
COALESCE(SUM(COALESCE(T.ORDER_TOTAL_AMOUNT_KRW, 0)), 0) AS "totalAmountKRW"
FROM
<include refid="contractBase"/> T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND SUBSTR(CONTRACT_DATE,0,5) = #{Year}
</if>
<if test="category_cd !=null and category_cd != '' ">
AND category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND customer_objid = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND product = #{product}
</if>
<if test="status_cd !=null and status_cd !=''">
AND status_cd = #{status_cd}
</if>
<if test="result_cd !=null and result_cd !=''">
AND result_cd = #{result_cd}
</if>
<if test="contract_result !=null and contract_result !=''">
AND contract_result = #{contract_result}
</if>
<if test="contract_start_date != null and !''.equals(contract_start_date)">
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{contract_start_date}, 'YYYY-MM-DD')
</if>
<if test="contract_end_date != null and !''.equals(contract_end_date)">
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{contract_end_date}, 'YYYY-MM-DD')
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND pm_user_id = #{pm_user_id}
</if>
<if test="contract_month != null and !''.equals(contract_month)">
AND TO_DATE(TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY-MM-DD'),'YYYY-MM') <![CDATA[ = ]]> TO_DATE(SUBSTRING(#{contract_month} FROM 1 FOR 4) || '-' || SUBSTRING(#{contract_month} FROM 5 FOR 2), 'YYYY-MM')
</if>
<!-- 견적관리 추가 검색조건 -->
<if test="appr_status !=null and appr_status != '' ">
AND APPR_STATUS = #{appr_status}
</if>
<if test="area_cd != null and area_cd !='' ">
AND AREA_CD = #{area_cd}
</if>
<if test="paid_type != null and paid_type !='' ">
AND PAID_TYPE = #{paid_type}
</if>
<!-- 품번/품명 검색: PART_OBJID로 정확하게 검색 -->
<if test="search_partObjId != null and search_partObjId != ''">
AND EXISTS (
SELECT 1
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.OBJID
AND CI.STATUS = 'ACTIVE'
AND CI.PART_OBJID = #{search_partObjId}
)
</if>
<if test="search_serialNo != null and search_serialNo != ''">
AND UPPER(SERIAL_NO) LIKE UPPER('%${search_serialNo}%')
</if>
<if test="search_poNo != null and search_poNo != ''">
AND UPPER(PO_NO) LIKE UPPER('%${search_poNo}%')
</if>
<if test="order_start_date != null and !''.equals(order_start_date)">
AND TO_DATE(ORDER_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{order_start_date}, 'YYYY-MM-DD')
</if>
<if test="order_end_date != null and !''.equals(order_end_date)">
AND TO_DATE(ORDER_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{order_end_date}, 'YYYY-MM-DD')
</if>
<if test="due_start_date != null and !''.equals(due_start_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{due_start_date}, 'YYYY-MM-DD')
</if>
<if test="due_end_date != null and !''.equals(due_end_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{due_end_date}, 'YYYY-MM-DD')
</if>
</select>
<select id="contractList_bak" parameterType="map" resultType="map">
SELECT *
FROM (
@@ -4474,6 +4570,103 @@ WHERE
</if>
ORDER BY REGDATE DESC
</select>
<!-- 주문서관리 Total 합계 조회 -->
<select id="getOrderTotalAmount" parameterType="map" resultType="map">
SELECT
COALESCE(SUM(COALESCE(T.ORDER_SUPPLY_PRICE_SUM, 0)), 0) AS TOTAL_SUPPLY_PRICE,
COALESCE(SUM(COALESCE(T.ORDER_VAT_SUM, 0)), 0) AS TOTAL_VAT,
COALESCE(SUM(COALESCE(T.ORDER_TOTAL_AMOUNT_SUM, 0)), 0) AS TOTAL_AMOUNT
FROM
<include refid="contractBase"/> T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND SUBSTR(CONTRACT_DATE,0,5) = #{Year}
</if>
<if test="category_cd !=null and category_cd != '' ">
AND category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND customer_objid = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND product = #{product}
</if>
<if test="status_cd !=null and status_cd !=''">
AND status_cd = #{status_cd}
</if>
<if test="result_cd !=null and result_cd !=''">
AND result_cd = #{result_cd}
</if>
<if test="contract_result !=null and contract_result !=''">
AND contract_result = #{contract_result}
</if>
<if test="contract_start_date != null and !''.equals(contract_start_date)">
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{contract_start_date}, 'YYYY-MM-DD')
</if>
<if test="contract_end_date != null and !''.equals(contract_end_date)">
AND TO_DATE(CONTRACT_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{contract_end_date}, 'YYYY-MM-DD')
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND pm_user_id = #{pm_user_id}
</if>
<if test="contract_month != null and !''.equals(contract_month)">
AND TO_DATE(TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY-MM-DD'),'YYYY-MM') <![CDATA[ = ]]> TO_DATE(SUBSTRING(#{contract_month} FROM 1 FOR 4) || '-' || SUBSTRING(#{contract_month} FROM 5 FOR 2), 'YYYY-MM')
</if>
<!-- 견적관리 추가 검색조건 -->
<if test="appr_status !=null and appr_status != '' ">
AND APPR_STATUS = #{appr_status}
</if>
<if test="area_cd != null and area_cd !='' ">
AND AREA_CD = #{area_cd}
</if>
<if test="paid_type != null and paid_type !='' ">
AND PAID_TYPE = #{paid_type}
</if>
<!-- 품번/품명 검색: PART_OBJID로 정확하게 검색 -->
<if test="search_partObjId != null and search_partObjId != ''">
AND EXISTS (
SELECT 1
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.OBJID
AND CI.STATUS = 'ACTIVE'
AND CI.PART_OBJID = #{search_partObjId}
)
</if>
<if test="search_serialNo != null and search_serialNo != ''">
AND UPPER(SERIAL_NO) LIKE UPPER('%${search_serialNo}%')
</if>
<if test="search_poNo != null and search_poNo != ''">
AND UPPER(PO_NO) LIKE UPPER('%${search_poNo}%')
</if>
<if test="order_start_date != null and !''.equals(order_start_date)">
AND TO_DATE(ORDER_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{order_start_date}, 'YYYY-MM-DD')
</if>
<if test="order_end_date != null and !''.equals(order_end_date)">
AND TO_DATE(ORDER_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{order_end_date}, 'YYYY-MM-DD')
</if>
<if test="due_start_date != null and !''.equals(due_start_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{due_start_date}, 'YYYY-MM-DD')
</if>
<if test="due_end_date != null and !''.equals(due_end_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{due_end_date}, 'YYYY-MM-DD')
</if>
</select>
<!-- 영업정보 조회 (수주등록용) -->
<select id="getContractInfo" parameterType="map" resultType="map">

View File

@@ -876,16 +876,32 @@
(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(
(SELECT SUM(sales_quantity)
FROM sales_registration
WHERE project_no LIKE T.PROJECT_NO || '%'),
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(T.QUANTITY::numeric, 0) - COALESCE(SR.sales_quantity, 0) AS REMAINING_QUANTITY,
-- 잔량원화총액 계산: (수주수량 - 판매수량) * 판매단가
(COALESCE(T.QUANTITY::numeric, 0) - COALESCE(SR.sales_quantity, 0)) * COALESCE(SR.sales_unit_price, 0) AS REMAINING_AMOUNT_KRW,
-- 잔량 계산: 수주수량 - 모든 분할 출하의 합계
COALESCE(T.QUANTITY::numeric, 0) - COALESCE(
(SELECT SUM(sales_quantity)
FROM sales_registration
WHERE project_no LIKE T.PROJECT_NO || '%'),
0
) AS REMAINING_QUANTITY,
-- 잔량원화총액 계산: (수주수량 - 모든 분할 출하 합계) * 판매단가
(COALESCE(T.QUANTITY::numeric, 0) - COALESCE(
(SELECT SUM(sales_quantity)
FROM sales_registration
WHERE project_no LIKE T.PROJECT_NO || '%'),
0
)) * COALESCE(SR.sales_unit_price, 0) AS REMAINING_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,
@@ -1398,29 +1414,12 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
NULL,
</otherwise>
</choose>
#{shippingMethod},
#{manager},
#{incoterms},
#{cretEmpNo}
)
ON CONFLICT (project_no)
DO UPDATE SET
shipping_order_status = EXCLUDED.shipping_order_status,
serial_no = EXCLUDED.serial_no,
sales_quantity = EXCLUDED.sales_quantity,
sales_unit_price = EXCLUDED.sales_unit_price,
sales_supply_price = EXCLUDED.sales_supply_price,
sales_vat = EXCLUDED.sales_vat,
sales_total_amount = EXCLUDED.sales_total_amount,
sales_currency = EXCLUDED.sales_currency,
sales_exchange_rate = EXCLUDED.sales_exchange_rate,
shipping_date = EXCLUDED.shipping_date,
shipping_method = EXCLUDED.shipping_method,
manager_user_id = EXCLUDED.manager_user_id,
incoterms = EXCLUDED.incoterms,
upd_date = NOW(),
upd_user_id = EXCLUDED.reg_user_id
</insert>
#{shippingMethod},
#{manager},
#{incoterms},
#{cretEmpNo}
)
</insert>
<!--
/**
@@ -1489,9 +1488,15 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
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,
-- 판매 관련 필드들 (sales_registration 테이블에서 가져오기)
SR.sale_no AS SALE_NO,
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
-- 주문수량 (PROJECT_MGMT에서 가져오기) - 잔량 계산용
COALESCE(T.QUANTITY::NUMERIC, 0) AS ORDER_QUANTITY,
-- 판매수량 (sales_registration에서 가져오기) - 이미 판매한 수량
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,
@@ -1499,7 +1504,7 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
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(NULLIF(SR.sales_exchange_rate, 0), NULLIF(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,
@@ -1567,40 +1572,43 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
-->
<select id="getOrderDataByOrderNo" parameterType="map" resultType="map">
/* salesNcollectMgmt.getOrderDataByOrderNo - orderNo로 판매등록용 수주 데이터 조회 */
SELECT
-- 기본 정보
CM.CONTRACT_NO AS ORDER_NO,
CM.OBJID AS CONTRACT_OBJID,
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NUMERIC으로 캐스팅
COALESCE(SUM(CI.ORDER_QUANTITY::NUMERIC), 0) AS SALES_QUANTITY,
COALESCE(ROUND(AVG(CI.ORDER_UNIT_PRICE::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
COALESCE(SUM(CI.ORDER_SUPPLY_PRICE::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
COALESCE(SUM(CI.ORDER_VAT::NUMERIC), 0) AS SALES_VAT,
COALESCE(SUM(CI.ORDER_TOTAL_AMOUNT::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
-- 환종 정보
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
COALESCE(CM.EXCHANGE_RATE::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
CM.ORDER_DATE AS SHIPPING_DATE,
-- 담당자
CM.PM_USER_ID AS MANAGER
FROM PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
WHERE PM.PROJECT_NO = #{orderNo}
GROUP BY
CM.CONTRACT_NO,
CM.OBJID,
CM.CONTRACT_CURRENCY,
CM.EXCHANGE_RATE,
CM.ORDER_DATE,
CM.PM_USER_ID
SELECT
-- 기본 정보
CM.CONTRACT_NO AS ORDER_NO,
CM.OBJID AS CONTRACT_OBJID,
-- 수주 수량 정보 (PROJECT_MGMT에서 직접 가져오기)
COALESCE(PM.QUANTITY::NUMERIC, 0) AS SALES_QUANTITY,
-- 수주 금액 정보 (CONTRACT_ITEM 테이블에서 합산) - VARCHAR 타입이므로 NULLIF로 빈 문자열 제거 후 NUMERIC 캐스팅
COALESCE(ROUND(AVG(NULLIF(CI.ORDER_UNIT_PRICE, '')::NUMERIC), 2), 0) AS SALES_UNIT_PRICE,
COALESCE(SUM(NULLIF(CI.ORDER_SUPPLY_PRICE, '')::NUMERIC), 0) AS SALES_SUPPLY_PRICE,
COALESCE(SUM(NULLIF(CI.ORDER_VAT, '')::NUMERIC), 0) AS SALES_VAT,
COALESCE(SUM(NULLIF(CI.ORDER_TOTAL_AMOUNT, '')::NUMERIC), 0) AS SALES_TOTAL_AMOUNT,
-- 환종 정보
CM.CONTRACT_CURRENCY AS SALES_CURRENCY,
CODE_NAME(CM.CONTRACT_CURRENCY) AS SALES_CURRENCY_NAME,
COALESCE(NULLIF(CM.EXCHANGE_RATE, '')::NUMERIC, 0) AS SALES_EXCHANGE_RATE,
-- 수주 날짜 - VARCHAR 타입이므로 그대로 사용
CM.ORDER_DATE AS SHIPPING_DATE,
-- 담당자
CM.PM_USER_ID AS MANAGER
FROM PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID AND UPPER(CI.STATUS) = 'ACTIVE'
WHERE PM.PROJECT_NO = #{orderNo}
GROUP BY
CM.CONTRACT_NO,
CM.OBJID,
CM.CONTRACT_CURRENCY,
CM.EXCHANGE_RATE,
CM.ORDER_DATE,
CM.PM_USER_ID,
PM.QUANTITY
</select>
<!--
@@ -1620,5 +1628,159 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!-- 모든 분할 출하의 총 판매 수량 조회 -->
<select id="getTotalSalesQuantity" parameterType="map" resultType="map">
/* salesNcollectMgmt.getTotalSalesQuantity - project_no로 시작하는 모든 레코드의 판매 수량 합계 */
SELECT COALESCE(SUM(NULLIF(sales_quantity, '')::NUMERIC), 0) as total
FROM sales_registration
WHERE project_no LIKE #{orderNo} || '%'
</select>
<!-- sales_registration 개수 조회 (분할 출하 순번용) -->
<select id="getSaleRegistrationCount" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSaleRegistrationCount - project_no로 시작하는 레코드 개수 */
SELECT COUNT(*) as count
FROM sales_registration
WHERE project_no LIKE #{orderNo} || '%'
</select>
<!-- sales_registration DELETE (기존 데이터 삭제) -->
<delete id="deleteSaleRegistration" parameterType="map">
/* salesNcollectMgmt.deleteSaleRegistration - sales_registration 삭제 */
DELETE FROM sales_registration
WHERE project_no = #{orderNo}
</delete>
<!-- sales_registration UPDATE (기존 데이터 수정) -->
<update id="updateSaleRegistration" parameterType="map">
/* salesNcollectMgmt.updateSaleRegistration - sales_registration 업데이트 */
UPDATE sales_registration
SET
shipping_order_status = <choose>
<when test="shippingOrderStatus != null and shippingOrderStatus != ''">
#{shippingOrderStatus},
</when>
<otherwise>
'',
</otherwise>
</choose>
serial_no = #{serialNo},
sales_quantity = #{salesQuantity}::integer,
sales_unit_price = #{salesUnitPrice}::numeric,
sales_supply_price = #{salesSupplyPrice}::numeric,
sales_vat = #{salesVat}::numeric,
sales_total_amount = #{salesTotalAmount}::numeric,
sales_currency = #{salesCurrency},
sales_exchange_rate = #{salesExchangeRate}::numeric,
shipping_date = <choose>
<when test="shippingDate != null and shippingDate != ''">
TO_DATE(#{shippingDate}, 'YYYY-MM-DD'),
</when>
<otherwise>
NULL,
</otherwise>
</choose>
shipping_method = #{shippingMethod},
manager_user_id = #{manager},
incoterms = #{incoterms},
upd_date = NOW(),
upd_user_id = #{cretEmpNo}
WHERE project_no = #{orderNo}
</update>
<!-- ========================================
분할 출하 관련 쿼리 (shipment_log 테이블 활용)
======================================== -->
<!-- shipment_log의 split_quantity 합산 조회 -->
<select id="getShipmentLogTotal" parameterType="map" resultType="map">
/* salesNcollectMgmt.getShipmentLogTotal - shipment_log의 split_quantity 합산 */
SELECT COALESCE(SUM(split_quantity), 0) as total
FROM shipment_log SL
INNER JOIN project_mgmt PM ON SL.target_objid = PM.OBJID::VARCHAR
WHERE PM.PROJECT_NO = #{orderNo}
</select>
<!-- shipment_log에 분할 출하 기록 저장 -->
<insert id="insertShipmentLog" parameterType="map">
/* salesNcollectMgmt.insertShipmentLog - 분할 출하 기록 저장 */
INSERT INTO shipment_log (
target_objid, log_type, log_message, split_quantity, original_quantity,
remaining_quantity, shipping_status, shipping_date, shipping_method,
sales_unit_price, sales_supply_price, sales_vat, sales_total_amount,
sales_currency, sales_exchange_rate, manager_user_id, incoterms,
serial_no, parent_sale_no, reg_user_id
) VALUES (
#{targetObjid}, 'SPLIT_SHIPMENT', '분할 출하',
#{salesQuantity}::integer, #{originalQuantity}::integer, #{remainingQuantity}::integer,
#{shippingOrderStatus},
<choose>
<when test="shippingDate != null and shippingDate != ''">
TO_DATE(#{shippingDate}, 'YYYY-MM-DD'),
</when>
<otherwise>NULL,</otherwise>
</choose>
#{shippingMethod}, #{salesUnitPrice}::numeric, #{salesSupplyPrice}::numeric,
#{salesVat}::numeric, #{salesTotalAmount}::numeric, #{salesCurrency},
#{salesExchangeRate}::numeric, #{manager}, #{incoterms}, #{serialNo},
#{parentSaleNo}::integer, #{cretEmpNo}
)
</insert>
<!-- PROJECT_MGMT의 OBJID 조회 (shipment_log의 target_objid로 사용) -->
<select id="getProjectObjid" parameterType="map" resultType="map">
/* salesNcollectMgmt.getProjectObjid - PROJECT_MGMT의 OBJID 조회 */
SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = #{orderNo}
</select>
<!-- 출하일 상세 내역 조회 (모든 분할 출하 포함) -->
<select id="getShippingDetailList" parameterType="map" resultType="map">
/* salesNcollectMgmt.getShippingDetailList - 모든 분할 출하 포함 */
SELECT
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '미등록') AS shipping_date,
COALESCE(SR.sales_quantity, 0) AS shipping_quantity,
COALESCE(SR.shipping_order_status, '미등록') AS shipping_order_status,
COALESCE(SR.serial_no, '-') AS serial_no,
SR.project_no,
CASE
WHEN SR.project_no = #{projectNo} THEN '최초 출하'
ELSE '분할 출하 ' || SUBSTRING(SR.project_no FROM LENGTH(#{projectNo}) + 2)
END AS source
FROM sales_registration SR
WHERE SR.project_no LIKE #{projectNo} || '%'
ORDER BY shipping_date DESC, project_no
</select>
<!-- 거래명세서 - 고객 정보 조회 -->
<select id="getCustomerInfoByProjectNo" parameterType="map" resultType="map">
/* salesNcollectMgmt.getCustomerInfoByProjectNo - 프로젝트 번호로 고객 정보 조회 */
SELECT
SM.SUPPLY_NAME AS CUSTOMER_NAME,
SM.BUSINESS_NO AS CUSTOMER_REG_NO,
SM.ADDRESS AS CUSTOMER_ADDRESS,
SM.BUSINESS_TYPE AS CUSTOMER_BUSINESS,
SM.BUSINESS_ITEM AS CUSTOMER_TYPE,
SM.TEL_NO AS CUSTOMER_CONTACT
FROM PROJECT_MGMT PM
INNER JOIN SUPPLY_MNG SM ON PM.CUSTOMER_OBJID::NUMERIC = SM.OBJID
WHERE PM.PROJECT_NO = #{projectNo}
</select>
<!-- 거래명세서 - 품목 정보 조회 -->
<select id="getTransactionStatementItem" parameterType="map" resultType="map">
/* salesNcollectMgmt.getTransactionStatementItem - 프로젝트 번호로 품목 정보 조회 */
SELECT
PM.PART_NAME AS productName,
PM.PART_NO AS spec,
COALESCE(SR.sales_quantity, PM.QUANTITY) AS quantity,
COALESCE(SR.sales_unit_price, 0) AS unitPrice,
COALESCE(SR.sales_supply_price, 0) AS supplyPrice,
COALESCE(SR.sales_vat, 0) AS vat
FROM PROJECT_MGMT PM
LEFT JOIN sales_registration SR ON PM.PROJECT_NO = SR.project_no
WHERE PM.PROJECT_NO = #{projectNo}
</select>
</mapper>

View File

@@ -2423,6 +2423,41 @@ private String encodeImageToBase64(String imagePath) {
return items;
}
/**
* 주문서관리 Total 합계 조회
* @param request
* @param paramMap - 검색 조건
* @return Map - TOTAL_SUPPLY_PRICE, TOTAL_VAT, TOTAL_AMOUNT
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public Map<String, Object> getOrderTotalAmount(HttpServletRequest request, Map<String, Object> paramMap){
SqlSession sqlSession = null;
Map<String, Object> resultMap = new HashMap<String, Object>();
try{
sqlSession = SqlMapConfig.getInstance().getSqlSession();
resultMap = sqlSession.selectOne("contractMgmt.getOrderTotalAmount", paramMap);
// 대문자 변환
if(resultMap != null) {
resultMap = CommonUtils.keyChangeUpperMap(resultMap);
} else {
// 데이터가 없을 경우 기본값 설정
resultMap = new HashMap<String, Object>();
resultMap.put("TOTAL_SUPPLY_PRICE", 0);
resultMap.put("TOTAL_VAT", 0);
resultMap.put("TOTAL_AMOUNT", 0);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(sqlSession != null) sqlSession.close();
}
return resultMap;
}
/**
* 견적서 템플릿 품목 조회 (수주등록용)
* 최종 견적서의 품목 정보를 수주등록 형식으로 변환하여 반환

View File

@@ -308,10 +308,39 @@ public class SalesNcollectMgmtService {
}
}
return CommonUtils.toUpperCaseMapKey(resultMap);
return CommonUtils.toUpperCaseMapKey(resultMap);
}
/**
* 프로젝트의 모든 품목 조회 - 주석처리: 품목은 하나만 존재
*/
/*
public List<Map<String, Object>> getProjectItems(Map<String, Object> paramMap) {
List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
SqlSession sqlSession = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
resultList = sqlSession.selectList("salesNcollectMgmt.getProjectItems", paramMap);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<String, Object> paramMap) {
// 대문자 키로 변환
List<Map<String, Object>> upperCaseList = new ArrayList<Map<String, Object>>();
for(Map<String, Object> item : resultList) {
upperCaseList.add(CommonUtils.toUpperCaseMapKey(item));
}
return upperCaseList;
}
*/
public Map<String, Object> saveSaleRegistration(HttpServletRequest request, Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
SqlSession sqlSession = null;
@@ -321,18 +350,87 @@ public class SalesNcollectMgmtService {
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
paramMap.put("cretEmpNo", person.getUserId());
// sales_registration 테이블에 판매 데이터 저장 (ON CONFLICT로 자동 UPDATE)
String projectNo = (String) paramMap.get("orderNo");
System.out.println("=== saveSaleRegistration 시작 ===");
System.out.println("projectNo: " + projectNo);
System.out.println("salesQuantity: " + paramMap.get("salesQuantity"));
// 기존 판매 데이터가 있는지 확인
Map<String, Object> checkParam = new HashMap<String, Object>();
checkParam.put("orderNo", projectNo);
Map<String, Object> existingSale = sqlSession.selectOne("salesNcollectMgmt.getSaleInfo", checkParam);
System.out.println("existingSale: " + (existingSale != null ? "있음" : "없음"));
// 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("SALE_NO 확인: " + saleNoObj);
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);
}
sqlSession.commit();
resultMap.put("result", true);
resultMap.put("msg", "저장되었습니다.");
System.out.println("=== 저장 성공 ===");
} catch(Exception e) {
if(sqlSession != null) {
sqlSession.rollback();
}
resultMap.put("result", false);
resultMap.put("msg", "저장 중 오류가 발생했습니다.");
System.out.println("=== 저장 실패 ===");
System.out.println("에러 메시지: " + e.getMessage());
e.printStackTrace();
} finally {
if(sqlSession != null) {
@@ -918,4 +1016,133 @@ public class SalesNcollectMgmtService {
}
return resultMap;
}
/**
* 모든 분할 출하의 총 판매 수량 조회
* @param paramMap
* @return Map
*/
public Map<String, Object> getTotalSalesQuantity(Map<String, Object> paramMap) {
SqlSession sqlSession = null;
Map<String, Object> result = null;
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
result = sqlSession.selectOne("salesNcollectMgmt.getTotalSalesQuantity", paramMap);
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sqlSession != null) {
sqlSession.close();
}
}
return result;
}
/**
* 출하일 상세 내역 조회
* @param projectNo
* @return List
*/
public List<Map<String, Object>> getShippingDetailList(String projectNo) {
SqlSession sqlSession = null;
List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("projectNo", projectNo);
resultList = sqlSession.selectList("salesNcollectMgmt.getShippingDetailList", paramMap);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
return resultList;
}
/**
* 거래명세서 데이터 조회
* @param paramMap - projectNos (쉼표로 구분된 프로젝트 번호들)
* @return Map
*/
public Map<String, Object> getTransactionStatementData(Map<String, Object> paramMap) {
SqlSession sqlSession = null;
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession();
String projectNos = (String) paramMap.get("projectNos");
System.out.println("=== getTransactionStatementData 시작 ===");
System.out.println("projectNos: " + projectNos);
String[] projectNoArray = projectNos.split(",");
// 첫 번째 프로젝트의 고객 정보 조회
Map<String, Object> firstProjectParam = new HashMap<String, Object>();
firstProjectParam.put("projectNo", projectNoArray[0].trim());
System.out.println("고객 정보 조회 - projectNo: " + projectNoArray[0].trim());
Map<String, Object> customerInfo = sqlSession.selectOne("salesNcollectMgmt.getCustomerInfoByProjectNo", firstProjectParam);
System.out.println("고객 정보 조회 결과: " + customerInfo);
if(customerInfo != null) {
resultMap.put("customerName", customerInfo.get("CUSTOMER_NAME"));
resultMap.put("customerRegNo", customerInfo.get("CUSTOMER_REG_NO"));
resultMap.put("customerAddress", customerInfo.get("CUSTOMER_ADDRESS"));
resultMap.put("customerBusiness", customerInfo.get("CUSTOMER_BUSINESS"));
resultMap.put("customerType", customerInfo.get("CUSTOMER_TYPE"));
resultMap.put("customerContact", customerInfo.get("CUSTOMER_CONTACT"));
System.out.println("고객명: " + customerInfo.get("CUSTOMER_NAME"));
} else {
System.out.println("고객 정보가 null입니다!");
}
// 공급자 정보 (회사 정보)
resultMap.put("supplierName", "㈜압피에스");
resultMap.put("supplierRegNo", "314-81-75146");
resultMap.put("supplierAddress", "대전광역시 유성구 국제과학10로 8");
resultMap.put("supplierBusiness", "제조");
resultMap.put("supplierType", "금속절삭가공기계의");
resultMap.put("supplierContact", "TEL:042-602-3300/FAX:042-672");
// 품목 정보 조회
List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();
for(String projectNo : projectNoArray) {
Map<String, Object> itemParam = new HashMap<String, Object>();
itemParam.put("projectNo", projectNo.trim());
System.out.println("품목 정보 조회 - projectNo: " + projectNo.trim());
Map<String, Object> item = sqlSession.selectOne("salesNcollectMgmt.getTransactionStatementItem", itemParam);
System.out.println("품목 정보 조회 결과: " + item);
if(item != null) {
items.add(item);
}
}
resultMap.put("items", items);
System.out.println("총 품목 개수: " + items.size());
// 비고
resultMap.put("note", "아래와 같이 공급합니다.");
System.out.println("=== resultMap 최종 ===");
System.out.println("customerName: " + resultMap.get("customerName"));
System.out.println("items size: " + ((List)resultMap.get("items")).size());
System.out.println("supplierName: " + resultMap.get("supplierName"));
} catch (Exception e) {
System.out.println("=== 에러 발생 ===");
e.printStackTrace();
} finally {
if (sqlSession != null) {
sqlSession.close();
}
}
return resultMap;
}
}