분할 출하 기능 완료 - 잔량 계산 수정
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -282,11 +282,47 @@ public class SalesNcollectMgmtController {
|
||||
}
|
||||
// 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"));
|
||||
|
||||
saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
|
||||
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
|
||||
|
||||
System.out.println("=== DB에서 조회한 saleInfo ===");
|
||||
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)) {
|
||||
@@ -310,13 +346,40 @@ 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);
|
||||
if(totalResult != null && totalResult.get("total") != null) {
|
||||
totalSoldQuantity = Integer.parseInt(String.valueOf(totalResult.get("total")).split("\\.")[0]);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
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"));
|
||||
}
|
||||
|
||||
request.setAttribute("saleInfo", saleInfo);
|
||||
|
||||
// orderInfo로 견적 정보 전달 (saleInfo가 이미 모든 필요한 정보를 포함)
|
||||
request.setAttribute("orderInfo", saleInfo);
|
||||
}
|
||||
|
||||
// 환종(통화) - 공통코드 0001533
|
||||
@@ -418,6 +481,27 @@ 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";
|
||||
}
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 계약관리 목록 조회
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -875,16 +875,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,
|
||||
@@ -1397,29 +1413,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>
|
||||
|
||||
<!--
|
||||
/**
|
||||
@@ -1488,9 +1487,10 @@ 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,
|
||||
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,
|
||||
@@ -1619,5 +1619,129 @@ 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(sales_quantity), 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>
|
||||
|
||||
</mapper>
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 견적서 템플릿 품목 조회 (수주등록용)
|
||||
* 최종 견적서의 품목 정보를 수주등록 형식으로 변환하여 반환
|
||||
|
||||
@@ -321,12 +321,38 @@ public class SalesNcollectMgmtService {
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
paramMap.put("cretEmpNo", person.getUserId());
|
||||
|
||||
// sales_registration 테이블에 판매 데이터 저장 (ON CONFLICT로 자동 UPDATE)
|
||||
sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", paramMap);
|
||||
// 기존 데이터 확인
|
||||
Map<String, Object> existingData = sqlSession.selectOne("salesNcollectMgmt.getSaleInfo", paramMap);
|
||||
|
||||
if(existingData != null && existingData.get("sale_no") != null) {
|
||||
// 이미 있으면 순번을 붙여서 새로운 project_no로 INSERT
|
||||
String originalProjectNo = String.valueOf(paramMap.get("orderNo"));
|
||||
|
||||
// 기존 레코드 개수 조회
|
||||
Map<String, Object> countResult = sqlSession.selectOne("salesNcollectMgmt.getSaleRegistrationCount", paramMap);
|
||||
int count = countResult != null && countResult.get("count") != null ?
|
||||
Integer.parseInt(String.valueOf(countResult.get("count"))) : 0;
|
||||
|
||||
// 새로운 project_no 생성 (순번 추가)
|
||||
String newProjectNo = originalProjectNo + "_" + (count + 1);
|
||||
paramMap.put("orderNo", newProjectNo);
|
||||
|
||||
System.out.println("=== 분할 출하 저장 ===");
|
||||
System.out.println("원본 PROJECT_NO: " + originalProjectNo);
|
||||
System.out.println("새 PROJECT_NO: " + newProjectNo);
|
||||
System.out.println("수량: " + paramMap.get("salesQuantity"));
|
||||
} else {
|
||||
System.out.println("=== 판매 정보 신규 저장 ===");
|
||||
System.out.println("PROJECT_NO: " + paramMap.get("orderNo"));
|
||||
System.out.println("수량: " + paramMap.get("salesQuantity"));
|
||||
}
|
||||
|
||||
// INSERT
|
||||
sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", paramMap);
|
||||
resultMap.put("msg", "저장되었습니다.");
|
||||
|
||||
sqlSession.commit();
|
||||
resultMap.put("result", true);
|
||||
resultMap.put("msg", "저장되었습니다.");
|
||||
} catch(Exception e) {
|
||||
if(sqlSession != null) {
|
||||
sqlSession.rollback();
|
||||
@@ -918,4 +944,61 @@ public class SalesNcollectMgmtService {
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 출하일 상세 내역 조회
|
||||
* @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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public Map<String, Object> getShipmentLogTotal(Map<String, Object> paramMap) {
|
||||
SqlSession sqlSession = null;
|
||||
Map<String, Object> result = new HashMap<String, Object>();
|
||||
try {
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
result = sqlSession.selectOne("salesNcollectMgmt.getShipmentLogTotal", paramMap);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (sqlSession != null) {
|
||||
sqlSession.close();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user