영업관리_판매관리업데이트

This commit is contained in:
Johngreen
2025-10-22 17:22:02 +09:00
parent dbc26fb35b
commit bbf91df26e
12 changed files with 1653 additions and 330 deletions

View File

@@ -3907,15 +3907,26 @@
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,(SELECT CODE_NAME(O.PAID_TYPE) FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS FREE_OF_CHARGE
,(SELECT O.QUANTITY FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CONTRACT_QTY
,(SELECT O.PART_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_CODE
,(SELECT O.PART_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_ITEM_NAME
,(SELECT O.SERIAL_NO FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SERIAL_NO
영업관리_주문서관리_수주등록 ,EBOM_STATUS
,MBOM_STATUS
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,(SELECT
CASE
WHEN O.PAID_TYPE = 'paid' THEN '유상'
WHEN O.PAID_TYPE = 'free' THEN '무상'
ELSE O.PAID_TYPE
END
FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS FREE_OF_CHARGE
,(SELECT SUM(O.QUANTITY) FROM CONTRACT_ITEM AS O WHERE O.CONTRACT_OBJID = T.CONTRACT_OBJID) AS CONTRACT_QTY
,(SELECT STRING_AGG(O.PART_NO, ', ' ORDER BY O.SEQ) FROM CONTRACT_ITEM AS O WHERE O.CONTRACT_OBJID = T.CONTRACT_OBJID AND O.PART_NO IS NOT NULL AND O.PART_NO != '') AS PRODUCT_ITEM_CODE
,(SELECT STRING_AGG(O.PART_NAME, ', ' ORDER BY O.SEQ) FROM CONTRACT_ITEM AS O WHERE O.CONTRACT_OBJID = T.CONTRACT_OBJID AND O.PART_NAME IS NOT NULL AND O.PART_NAME != '') AS PRODUCT_ITEM_NAME
,(SELECT STRING_AGG(S.SERIAL_NO, ', ' ORDER BY S.SEQ)
FROM CONTRACT_ITEM AS I
LEFT JOIN CONTRACT_ITEM_SERIAL AS S ON S.ITEM_OBJID = I.OBJID AND S.STATUS = 'ACTIVE'
WHERE I.CONTRACT_OBJID = T.CONTRACT_OBJID
AND S.SERIAL_NO IS NOT NULL) AS SERIAL_NO
-- 영업관리_주문서관리_수주등록
,EBOM_STATUS
,MBOM_STATUS
,(SELECT O.PURCHASE_DATE FROM PURCHASE_ORDER_MASTER AS O WHERE O.CONTRACT_MGMT_OBJID = T.CONTRACT_OBJID LIMIT 1) AS ORDER_DATE
,RECEIVING_RATE
,PRODUCTION_TEAM_12

View File

@@ -243,6 +243,21 @@ public class SalesNcollectMgmtController {
@RequestMapping(value = "/salesMgmt/salesRegForm.do", method = RequestMethod.GET)
public String showSalesRegForm(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
try {
// URL 인코딩 처리: 한글 프로젝트 번호 디코딩
if(paramMap.get("orderNo") != null) {
String orderNo = paramMap.get("orderNo").toString();
// 이미 디코딩된 경우와 구분하기 위해 %가 포함된 경우에만 디코딩
if(orderNo.contains("%")) {
try {
orderNo = java.net.URLDecoder.decode(orderNo, "UTF-8");
paramMap.put("orderNo", orderNo);
} catch(Exception ex) {
// 디코딩 실패시 원본 사용
ex.printStackTrace();
}
}
}
Map<String, Object> codeMap = new HashMap<String, Object>();
// 담당자

View File

@@ -812,178 +812,328 @@
,editEmpNo = #{cretEmpNo} /* 수정자 */
</update>
<!-- 매출관리 그리드 목록 (SW 테이블 사용 안함) -->
<!-- 매출관리 그리드 목록 - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) -->
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSalesMgmtGridList - VIEW 기반 조회 (원본 + 분할출하 통합) */
/* salesNcollectMgmt.getSalesMgmtGridList - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) */
SELECT
PROJECT_NO,
ORDER_TYPE,
PRODUCT_TYPE,
NATION,
RECEIPT_DATE,
CUSTOMER,
PAYMENT_TYPE,
PRODUCT_NO,
PRODUCT_NAME,
SERIAL_NO,
COALESCE(ORDER_QUANTITY, 0) AS ORDER_QUANTITY,
REQUEST_DATE,
CUSTOMER_REQUEST,
ORDER_STATUS,
PO_NO,
ORDER_DATE,
ORDER_ATTACH,
PRODUCTION_STATUS,
SHIPPING_ORDER_STATUS,
COALESCE(SALES_QUANTITY, 0) AS SALES_QUANTITY,
COALESCE(SALES_UNIT_PRICE, 0) AS SALES_UNIT_PRICE,
COALESCE(SALES_SUPPLY_PRICE, 0) AS SALES_SUPPLY_PRICE,
COALESCE(SALES_VAT, 0) AS SALES_VAT,
COALESCE(SALES_TOTAL_AMOUNT, 0) AS SALES_TOTAL_AMOUNT,
COALESCE(SALES_TOTAL_AMOUNT_KRW, 0) AS SALES_TOTAL_AMOUNT_KRW,
SALES_CURRENCY,
COALESCE(SALES_EXCHANGE_RATE, 0) AS SALES_EXCHANGE_RATE,
SHIPPING_DATE,
SHIPPING_METHOD,
MANAGER,
INCOTERMS,
SALES_STATUS,
SALE_NO,
RECORD_TYPE,
SPLIT_LOG_ID
FROM v_sales_mgmt_with_splits
T.PROJECT_NO,
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
CODE_NAME(T.AREA_CD) AS NATION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER,
(SELECT
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
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,
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,
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
T.DUE_DATE AS REQUEST_DATE,
T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
T.PO_NO,
T.CONTRACT_DATE AS ORDER_DATE,
CASE WHEN EXISTS(
SELECT 1 FROM ATTACH_FILE_INFO
WHERE TARGET_OBJID = T.OBJID::VARCHAR
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,
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 U.USER_NAME
FROM SHIPMENT_LOG SL
LEFT JOIN USER_INFO U ON U.USER_ID = SL.MANAGER_USER_ID
WHERE SL.TARGET_OBJID = T.PROJECT_NO
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
ORDER BY SL.REG_DATE DESC
LIMIT 1
), (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = 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,
'N' AS SALES_STATUS,
T.OBJID::VARCHAR AS SALE_NO,
'ORIGINAL' AS RECORD_TYPE,
'' AS SPLIT_LOG_ID
FROM PROJECT_MGMT AS T
WHERE 1 = 1
<if test="orderType != null and orderType != ''">
AND CATEGORY_CD = #{orderType}
AND T.CATEGORY_CD = #{orderType}
</if>
<if test="productType != null and productType != ''">
AND PRODUCT_TYPE = #{productType}
AND T.PRODUCT = #{productType}
</if>
<if test="nation != null and nation != ''">
AND AREA_CD = #{nation}
AND T.AREA_CD = #{nation}
</if>
<if test="customer != null and customer != ''">
AND CUSTOMER LIKE CONCAT('%', #{customer}, '%')
AND EXISTS (
SELECT 1 FROM SUPPLY_MNG
WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC
AND SUPPLY_NAME LIKE CONCAT('%', #{customer}, '%')
)
</if>
<if test="paymentType != null and paymentType != ''">
AND PAID_TYPE = #{paymentType}
AND EXISTS (
SELECT 1 FROM CONTRACT_MGMT CM
WHERE CM.OBJID = T.CONTRACT_OBJID
AND (
(#{paymentType} = 'N' AND CM.PAID_TYPE = 'paid') OR
(#{paymentType} = 'Y' AND CM.PAID_TYPE = 'free')
)
)
</if>
<if test="productNo != null and productNo != ''">
AND PRODUCT_NO LIKE CONCAT('%', #{productNo}, '%')
AND T.PART_NO LIKE CONCAT('%', #{productNo}, '%')
</if>
<if test="productName != null and productName != ''">
AND PRODUCT_NAME LIKE CONCAT('%', #{productName}, '%')
AND T.PART_NAME LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="serialNo != null and serialNo != ''">
AND SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND EXISTS (
SELECT 1 FROM CONTRACT_ITEM CI
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CIS.SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND UPPER(CIS.STATUS) = 'ACTIVE'
)
</if>
<if test="orderStatus != null and orderStatus != ''">
AND STATUS_CD = #{orderStatus}
AND T.CONTRACT_RESULT = #{orderStatus}
</if>
<if test="poNo != null and poNo != ''">
AND PO_NO LIKE CONCAT('%', #{poNo}, '%')
AND T.PO_NO LIKE CONCAT('%', #{poNo}, '%')
</if>
<if test="requestDateFrom != null and requestDateFrom != ''">
AND REQUEST_DATE <![CDATA[>=]]> #{requestDateFrom}
AND T.DUE_DATE <![CDATA[>=]]> #{requestDateFrom}
</if>
<if test="requestDateTo != null and requestDateTo != ''">
AND REQUEST_DATE <![CDATA[<=]]> #{requestDateTo}
AND T.DUE_DATE <![CDATA[<=]]> #{requestDateTo}
</if>
<if test="orderDateFrom != null and orderDateFrom != ''">
AND ORDER_DATE <![CDATA[>=]]> #{orderDateFrom}
AND T.CONTRACT_DATE <![CDATA[>=]]> #{orderDateFrom}
</if>
<if test="orderDateTo != null and orderDateTo != ''">
AND ORDER_DATE <![CDATA[<=]]> #{orderDateTo}
AND T.CONTRACT_DATE <![CDATA[<=]]> #{orderDateTo}
</if>
<if test="shippingStatus != null and shippingStatus != ''">
AND SALES_STATUS = #{shippingStatus}
/* SALES_STATUS 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateFrom != null and shippingDateFrom != ''">
AND SHIPPING_DATE <![CDATA[>=]]> #{shippingDateFrom}
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateTo != null and shippingDateTo != ''">
AND SHIPPING_DATE <![CDATA[<=]]> #{shippingDateTo}
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingMethod != null and shippingMethod != ''">
AND SHIPPING_METHOD = #{shippingMethod}
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
</if>
<if test="manager != null and manager != ''">
AND PM_USER_ID = #{manager}
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
AND INCOTERMS = #{incoterms}
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
ORDER BY REGDATE DESC
ORDER BY T.REGDATE DESC
LIMIT #{COUNT_PER_PAGE} OFFSET #{PAGE_START}
</select>
<!-- 매출관리 그리드 목록 개수 (VIEW 기반) -->
<!-- 매출관리 그리드 목록 개수 - project_mgmt 테이블 기반 -->
<select id="getSalesMgmtGridListCount" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSalesMgmtGridListCount - VIEW 기반 */
/* salesNcollectMgmt.getSalesMgmtGridListCount - project_mgmt 테이블 기반 */
SELECT
CEIL(COUNT(1)::float / #{COUNT_PER_PAGE}::float)::numeric::integer AS MAX_PAGE_SIZE,
COUNT(1)::integer AS TOTAL_CNT
FROM v_sales_mgmt_with_splits
FROM PROJECT_MGMT AS T
WHERE 1 = 1
<if test="orderType != null and orderType != ''">
AND CATEGORY_CD = #{orderType}
AND T.CATEGORY_CD = #{orderType}
</if>
<if test="productType != null and productType != ''">
AND PRODUCT_TYPE = #{productType}
AND T.PRODUCT = #{productType}
</if>
<if test="nation != null and nation != ''">
AND AREA_CD = #{nation}
AND T.AREA_CD = #{nation}
</if>
<if test="customer != null and customer != ''">
AND CUSTOMER LIKE CONCAT('%', #{customer}, '%')
AND EXISTS (
SELECT 1 FROM SUPPLY_MNG
WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC
AND SUPPLY_NAME LIKE CONCAT('%', #{customer}, '%')
)
</if>
<if test="paymentType != null and paymentType != ''">
AND PAID_TYPE = #{paymentType}
AND EXISTS (
SELECT 1 FROM CONTRACT_MGMT CM
WHERE CM.OBJID = T.CONTRACT_OBJID
AND (
(#{paymentType} = 'N' AND CM.PAID_TYPE = 'paid') OR
(#{paymentType} = 'Y' AND CM.PAID_TYPE = 'free')
)
)
</if>
<if test="productNo != null and productNo != ''">
AND PRODUCT_NO LIKE CONCAT('%', #{productNo}, '%')
AND T.PART_NO LIKE CONCAT('%', #{productNo}, '%')
</if>
<if test="productName != null and productName != ''">
AND PRODUCT_NAME LIKE CONCAT('%', #{productName}, '%')
AND T.PART_NAME LIKE CONCAT('%', #{productName}, '%')
</if>
<if test="serialNo != null and serialNo != ''">
AND SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND EXISTS (
SELECT 1 FROM CONTRACT_ITEM CI
JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
AND CIS.SERIAL_NO LIKE CONCAT('%', #{serialNo}, '%')
AND UPPER(CIS.STATUS) = 'ACTIVE'
)
</if>
<if test="orderStatus != null and orderStatus != ''">
AND STATUS_CD = #{orderStatus}
AND T.CONTRACT_RESULT = #{orderStatus}
</if>
<if test="poNo != null and poNo != ''">
AND PO_NO LIKE CONCAT('%', #{poNo}, '%')
AND T.PO_NO LIKE CONCAT('%', #{poNo}, '%')
</if>
<if test="requestDateFrom != null and requestDateFrom != ''">
AND REQUEST_DATE <![CDATA[>=]]> #{requestDateFrom}
AND T.DUE_DATE <![CDATA[>=]]> #{requestDateFrom}
</if>
<if test="requestDateTo != null and requestDateTo != ''">
AND REQUEST_DATE <![CDATA[<=]]> #{requestDateTo}
AND T.DUE_DATE <![CDATA[<=]]> #{requestDateTo}
</if>
<if test="orderDateFrom != null and orderDateFrom != ''">
AND ORDER_DATE <![CDATA[>=]]> #{orderDateFrom}
AND T.CONTRACT_DATE <![CDATA[>=]]> #{orderDateFrom}
</if>
<if test="orderDateTo != null and orderDateTo != ''">
AND ORDER_DATE <![CDATA[<=]]> #{orderDateTo}
AND T.CONTRACT_DATE <![CDATA[<=]]> #{orderDateTo}
</if>
<if test="shippingStatus != null and shippingStatus != ''">
AND SALES_STATUS = #{shippingStatus}
/* SALES_STATUS 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateFrom != null and shippingDateFrom != ''">
AND SHIPPING_DATE <![CDATA[>=]]> #{shippingDateFrom}
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingDateTo != null and shippingDateTo != ''">
AND SHIPPING_DATE <![CDATA[<=]]> #{shippingDateTo}
/* SHIPPING_DATE 필드 없음 - 검색 조건 무시 */
</if>
<if test="shippingMethod != null and shippingMethod != ''">
AND SHIPPING_METHOD = #{shippingMethod}
/* SHIPPING_METHOD 필드 없음 - 검색 조건 무시 */
</if>
<if test="manager != null and manager != ''">
AND PM_USER_ID = #{manager}
AND T.PM_USER_ID = #{manager}
</if>
<if test="incoterms != null and incoterms != ''">
AND INCOTERMS = #{incoterms}
/* INCOTERMS 필드 없음 - 검색 조건 무시 */
</if>
</select>
@@ -1139,5 +1289,256 @@
)
</insert>
<!--
/**
* 판매 등록 저장 (shipment_log 테이블 사용)
* @since 2025.10.22
* @author johngreen
* @version 1.0
**/
-->
<insert id="insertSaleRegistration" parameterType="map">
/* salesNcollectMgmt.insertSaleRegistration - shipment_log에 판매 데이터 저장 */
INSERT INTO shipment_log (
target_objid,
log_type,
log_message,
split_quantity,
shipping_status,
sales_unit_price,
sales_supply_price,
sales_vat,
sales_total_amount,
sales_currency,
sales_exchange_rate,
serial_no,
shipping_date,
shipping_method,
manager_user_id,
incoterms,
is_split_record,
reg_date,
reg_user_id
) VALUES (
#{orderNo},
'SALES_REGISTRATION',
'판매 등록',
#{salesQuantity}::integer,
<choose>
<when test="shippingOrderStatus != null and shippingOrderStatus != ''">
#{shippingOrderStatus},
</when>
<otherwise>
'',
</otherwise>
</choose>
#{salesUnitPrice}::numeric,
#{salesSupplyPrice}::numeric,
#{salesVat}::numeric,
#{salesTotalAmount}::numeric,
#{salesCurrency},
#{salesExchangeRate}::numeric,
#{serialNo},
<choose>
<when test="shippingDate != null and shippingDate != ''">
TO_DATE(#{shippingDate}, 'YYYY-MM-DD'),
</when>
<otherwise>
NULL,
</otherwise>
</choose>
#{shippingMethod},
#{manager},
#{incoterms},
false,
NOW(),
#{cretEmpNo}
)
</insert>
<!--
/**
* 판매 정보 조회 - 판매등록 팝업에서 사용
* PROJECT_NO 또는 SALE_NO로 조회
* @since 2025.10.22
* @author johngreen
* @version 1.0
**/
-->
<select id="getSaleInfo" parameterType="map" resultType="map">
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (리스트와 동일한 구조) */
SELECT
T.PROJECT_NO,
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
CODE_NAME(T.AREA_CD) AS NATION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER,
(SELECT
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
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건")
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,
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
T.PO_NO,
T.CONTRACT_DATE AS ORDER_DATE,
CASE WHEN EXISTS(
SELECT 1 FROM ATTACH_FILE_INFO
WHERE TARGET_OBJID = T.OBJID::VARCHAR
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}
</select>
</mapper>

View File

@@ -268,17 +268,16 @@ public class SalesNcollectMgmtService {
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
paramMap.put("cretEmpNo", person.getUserId());
// SWSC110A_TBL 업데이트
sqlSession.update("salesNcollectMgmt.updateSaleRegistration_swsc110a", paramMap);
// SWSD010A_TBL 업데이트 (insert or update)
sqlSession.update("salesNcollectMgmt.upsertSaleRegistration_swsd010a", paramMap);
// shipment_log 테이블에 판매 데이터 저장
sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", paramMap);
sqlSession.commit();
resultMap.put("result", true);
resultMap.put("msg", "저장되었습니다.");
} catch(Exception e) {
sqlSession.rollback();
if(sqlSession != null) {
sqlSession.rollback();
}
resultMap.put("result", false);
resultMap.put("msg", "저장 중 오류가 발생했습니다.");
e.printStackTrace();