Merge pull request '판매관리 리스트의 요청납기, 고객사요청사항, 발주일, 주문서 컬럼의 내용넘어오게 수정' (#6) from V2025101701 into main
Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
@@ -814,9 +814,10 @@
|
||||
|
||||
<!-- 매출관리 그리드 목록 - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) -->
|
||||
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) */
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList - sales_registration LEFT JOIN으로 최적화 */
|
||||
SELECT
|
||||
T.PROJECT_NO,
|
||||
T.CONTRACT_OBJID,
|
||||
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
|
||||
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
|
||||
CODE_NAME(T.AREA_CD) AS NATION,
|
||||
@@ -831,143 +832,68 @@
|
||||
FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE,
|
||||
T.PART_NO AS PRODUCT_NO,
|
||||
T.PART_NAME AS PRODUCT_NAME,
|
||||
-- S/N: sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL (모두 "외 몇건" 형태로 표시)
|
||||
COALESCE(
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN SR.serial_no IS NULL OR SR.serial_no = '' THEN ''
|
||||
ELSE
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN array_length(string_to_array(SR.serial_no, ','), 1) = 1 THEN SR.serial_no
|
||||
ELSE (string_to_array(SR.serial_no, ','))[1] || ' 외 ' || (array_length(string_to_array(SR.serial_no, ','), 1) - 1)::TEXT || '건'
|
||||
END
|
||||
)
|
||||
END
|
||||
FROM sales_registration SR WHERE SR.project_no = T.PROJECT_NO
|
||||
),
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) = 0 THEN ''
|
||||
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
|
||||
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
|
||||
END
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
|
||||
AND UPPER(CIS.STATUS) = 'ACTIVE'
|
||||
), ''
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE' AND CIS.SERIAL_NO IS NOT NULL),
|
||||
''
|
||||
) AS SERIAL_NO,
|
||||
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
|
||||
T.DUE_DATE AS REQUEST_DATE,
|
||||
T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST,
|
||||
COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE,
|
||||
COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST,
|
||||
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
|
||||
T.PO_NO,
|
||||
T.CONTRACT_DATE AS ORDER_DATE,
|
||||
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
|
||||
CASE WHEN EXISTS(
|
||||
SELECT 1 FROM ATTACH_FILE_INFO
|
||||
WHERE TARGET_OBJID = T.OBJID::VARCHAR
|
||||
WHERE TARGET_OBJID = T.CONTRACT_OBJID
|
||||
AND DOC_TYPE='ORDER_DOC'
|
||||
AND UPPER(STATUS) = 'ACTIVE'
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
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,
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기)
|
||||
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
|
||||
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
|
||||
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
|
||||
COALESCE(
|
||||
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SR.manager_user_id),
|
||||
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID)
|
||||
) AS MANAGER,
|
||||
COALESCE(SR.incoterms, '') 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
|
||||
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND T.CATEGORY_CD = #{orderType}
|
||||
@@ -1289,56 +1215,51 @@
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!--
|
||||
<!--
|
||||
/**
|
||||
* 판매 등록 저장 (shipment_log 테이블 사용)
|
||||
* 판매 등록 저장 (sales_registration 테이블 사용)
|
||||
* INSERT 또는 UPDATE (ON CONFLICT로 중복 방지)
|
||||
* @since 2025.10.22
|
||||
* @author johngreen
|
||||
* @version 1.0
|
||||
* @version 1.1
|
||||
**/
|
||||
-->
|
||||
<insert id="insertSaleRegistration" parameterType="map">
|
||||
/* salesNcollectMgmt.insertSaleRegistration - shipment_log에 판매 데이터 저장 */
|
||||
INSERT INTO shipment_log (
|
||||
target_objid,
|
||||
log_type,
|
||||
log_message,
|
||||
split_quantity,
|
||||
shipping_status,
|
||||
/* salesNcollectMgmt.insertSaleRegistration - sales_registration에 판매 데이터 저장 */
|
||||
INSERT INTO sales_registration (
|
||||
project_no,
|
||||
shipping_order_status,
|
||||
serial_no,
|
||||
sales_quantity,
|
||||
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>
|
||||
<choose>
|
||||
<when test="shippingOrderStatus != null and shippingOrderStatus != ''">
|
||||
#{shippingOrderStatus},
|
||||
</when>
|
||||
<otherwise>
|
||||
'',
|
||||
</otherwise>
|
||||
</choose>
|
||||
#{serialNo},
|
||||
#{salesQuantity}::integer,
|
||||
#{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'),
|
||||
@@ -1350,10 +1271,25 @@
|
||||
#{shippingMethod},
|
||||
#{manager},
|
||||
#{incoterms},
|
||||
false,
|
||||
NOW(),
|
||||
#{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>
|
||||
|
||||
<!--
|
||||
@@ -1366,7 +1302,7 @@
|
||||
**/
|
||||
-->
|
||||
<select id="getSaleInfo" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (리스트와 동일한 구조) */
|
||||
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (sales_registration 테이블 사용) */
|
||||
SELECT
|
||||
T.PROJECT_NO,
|
||||
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
|
||||
@@ -1383,160 +1319,47 @@
|
||||
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,
|
||||
-- S/N 정보 (sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL에서)
|
||||
COALESCE(
|
||||
SR.serial_no,
|
||||
(SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SERIAL_NO)
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
|
||||
AND UPPER(CIS.STATUS) = 'ACTIVE'
|
||||
AND CIS.SERIAL_NO IS NOT NULL
|
||||
),
|
||||
''
|
||||
) AS SERIAL_NO,
|
||||
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
|
||||
T.DUE_DATE AS REQUEST_DATE,
|
||||
T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST,
|
||||
COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE,
|
||||
COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST,
|
||||
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
|
||||
T.PO_NO,
|
||||
T.CONTRACT_DATE AS ORDER_DATE,
|
||||
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
|
||||
CASE WHEN EXISTS(
|
||||
SELECT 1 FROM ATTACH_FILE_INFO
|
||||
WHERE TARGET_OBJID = T.OBJID::VARCHAR
|
||||
WHERE TARGET_OBJID = T.CONTRACT_OBJID
|
||||
AND DOC_TYPE='ORDER_DOC'
|
||||
AND UPPER(STATUS) = 'ACTIVE'
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (shipment_log에서 가져오기)
|
||||
COALESCE((
|
||||
SELECT SL.SHIPPING_STATUS
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE((
|
||||
SELECT SL.SPLIT_QUANTITY
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_QUANTITY,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_UNIT_PRICE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_SUPPLY_PRICE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_VAT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_VAT,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_TOTAL_AMOUNT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_TOTAL_AMOUNT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_CURRENCY
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_EXCHANGE_RATE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE((
|
||||
SELECT TO_CHAR(SL.SHIPPING_DATE, 'YYYY-MM-DD')
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_DATE,
|
||||
COALESCE((
|
||||
SELECT SL.SHIPPING_METHOD
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_METHOD,
|
||||
COALESCE((
|
||||
SELECT SL.MANAGER_USER_ID
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.PM_USER_ID) AS MANAGER,
|
||||
COALESCE((
|
||||
SELECT SL.INCOTERMS
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS INCOTERMS
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (sales_registration 테이블에서 가져오기)
|
||||
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
|
||||
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
|
||||
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
|
||||
COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER,
|
||||
COALESCE(SR.incoterms, '') AS INCOTERMS
|
||||
FROM PROJECT_MGMT AS T
|
||||
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
|
||||
WHERE T.PROJECT_NO = #{orderNo}
|
||||
</select>
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문서첨부', field : 'ORDER_ATTACH',
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell){
|
||||
var objid = cell.getData().PROJECT_NO || cell.getData().SALE_NO;
|
||||
var objid = cell.getData().CONTRACT_OBJID || cell.getData().SALE_NO;
|
||||
if(objid){
|
||||
fn_FileRegist(objid, "ORDER_DOC", "주문서");
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ include file="/init.jsp" %>
|
||||
<%@ include file="/init_new.jsp" %>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
@@ -7,26 +7,7 @@
|
||||
<title>판매 등록</title>
|
||||
<link rel="stylesheet" href="/css/ions-basic.css">
|
||||
<script type="text/javascript" src="/js/ions-common.js" ></script>
|
||||
<style>
|
||||
/* S/N 입력 필드 placeholder 색상 */
|
||||
#serialNo::placeholder {
|
||||
color: #999 !important;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#serialNo::-webkit-input-placeholder {
|
||||
color: #999 !important;
|
||||
}
|
||||
|
||||
#serialNo::-moz-placeholder {
|
||||
color: #999 !important;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#serialNo:-ms-input-placeholder {
|
||||
color: #999 !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// S/N 관리 전역 변수
|
||||
var snList = [];
|
||||
@@ -50,8 +31,25 @@
|
||||
fn_openSnManagePopup();
|
||||
});
|
||||
|
||||
// 초기 S/N 데이터 로드
|
||||
fn_loadSnList();
|
||||
// 페이지 로드 시 기존 S/N 데이터가 있으면 파싱하여 hidden 필드에 저장
|
||||
var initialSnValue = $("#serialNo").val();
|
||||
if(initialSnValue && initialSnValue.trim() != '') {
|
||||
var snArray = initialSnValue.split(',');
|
||||
var initialSnList = [];
|
||||
for(var i = 0; i < snArray.length; i++) {
|
||||
if(snArray[i].trim() != '') {
|
||||
initialSnList.push({
|
||||
id: i + 1,
|
||||
value: snArray[i].trim()
|
||||
});
|
||||
}
|
||||
}
|
||||
if(initialSnList.length > 0) {
|
||||
$("#serialNoList").val(JSON.stringify(initialSnList));
|
||||
snCounter = initialSnList.length + 1;
|
||||
console.log("초기 S/N 데이터 로드:", initialSnList);
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$("#btnClose").click(function() {
|
||||
@@ -128,126 +126,71 @@
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 목록 로드
|
||||
function fn_loadSnList() {
|
||||
// S/N 화면 표시 업데이트
|
||||
function fn_updateSnDisplay() {
|
||||
var count = snList.length;
|
||||
if(count > 0) {
|
||||
// 모든 S/N을 쉼표로 연결
|
||||
var snValues = [];
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
snValues.push(snList[i].value);
|
||||
}
|
||||
$("#serialNo").val(snValues.join(', '));
|
||||
} else {
|
||||
$("#serialNo").val('');
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 관리 팝업 열기
|
||||
function fn_openSnManagePopup() {
|
||||
// 최신 데이터 다시 로드 (display 업데이트 없이)
|
||||
var serialNoValue = $("#serialNo").val();
|
||||
var serialNoListValue = $("#serialNoList").val();
|
||||
|
||||
console.log("초기 로드 - serialNo:", serialNoValue);
|
||||
console.log("초기 로드 - serialNoList:", serialNoListValue);
|
||||
|
||||
snList = [];
|
||||
console.log("팝업 열기 시작");
|
||||
console.log("serialNoList 값:", serialNoListValue);
|
||||
|
||||
// 데이터가 있을 때만 로드
|
||||
if(serialNoListValue && serialNoListValue.trim() != '') {
|
||||
// JSON 형태로 저장된 데이터가 있으면 파싱
|
||||
try {
|
||||
var loadedList = JSON.parse(serialNoListValue);
|
||||
snList = loadedList;
|
||||
console.log("JSON 파싱 성공:", snList);
|
||||
snList = JSON.parse(serialNoListValue);
|
||||
console.log("JSON 파싱 성공, snList:", snList);
|
||||
// counter 재설정
|
||||
if(snList.length > 0) {
|
||||
var maxId = Math.max.apply(Math, snList.map(function(item) { return item.id; }));
|
||||
snCounter = maxId + 1;
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("JSON 파싱 실패:", e);
|
||||
// JSON 파싱 실패 시 기존 로직 사용
|
||||
if(serialNoValue && serialNoValue.trim() != '') {
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
}
|
||||
}
|
||||
} else if(serialNoValue && serialNoValue.trim() != '') {
|
||||
// hidden 필드가 없고 display 필드만 있는 경우
|
||||
console.log("display 필드만 있음, 파싱 시작");
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
}
|
||||
|
||||
// 초기 로드 후 hidden 필드에 JSON 저장
|
||||
if(snList.length > 0) {
|
||||
$("#serialNoList").val(JSON.stringify(snList));
|
||||
console.log("hidden 필드에 저장:", $("#serialNoList").val());
|
||||
}
|
||||
|
||||
fn_updateSnDisplay();
|
||||
}
|
||||
|
||||
// S/N 값 파싱 함수
|
||||
function fn_parseSerialNoValue(serialNoValue) {
|
||||
// "외 N개" 패턴 제거 및 콤마로 분리
|
||||
var cleanValue = serialNoValue;
|
||||
|
||||
// "외 N개" 패턴 제거 (예: "20251021-007 외 2건" -> "20251021-007")
|
||||
cleanValue = cleanValue.replace(/\s*외\s*\d+\s*건?\s*$/g, '').trim();
|
||||
|
||||
console.log("정제된 값:", cleanValue);
|
||||
|
||||
if(cleanValue != '') {
|
||||
var snArray = cleanValue.split(',');
|
||||
for(var i = 0; i < snArray.length; i++) {
|
||||
var sn = snArray[i].trim();
|
||||
if(sn != '') {
|
||||
snList.push({
|
||||
id: snCounter++,
|
||||
value: sn
|
||||
});
|
||||
}
|
||||
}
|
||||
console.log("파싱 완료, snList:", snList);
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 화면 표시 업데이트
|
||||
function fn_updateSnDisplay() {
|
||||
if(snList.length === 0) {
|
||||
$("#serialNo").val('');
|
||||
} else if(snList.length === 1) {
|
||||
$("#serialNo").val(snList[0].value);
|
||||
} else {
|
||||
$("#serialNo").val(snList[0].value + ' 외 ' + (snList.length - 1) + '개');
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 관리 팝업 열기
|
||||
function fn_openSnManagePopup() {
|
||||
console.log("=== 팝업 열기 시작 ===");
|
||||
|
||||
// 최신 데이터 다시 로드
|
||||
var serialNoValue = $("#serialNo").val();
|
||||
var serialNoListValue = $("#serialNoList").val();
|
||||
|
||||
console.log("팝업 - serialNo:", serialNoValue);
|
||||
console.log("팝업 - serialNoList:", serialNoListValue);
|
||||
|
||||
if(serialNoListValue && serialNoListValue.trim() != '' && serialNoListValue != '[]') {
|
||||
// JSON 데이터가 있으면 파싱
|
||||
try {
|
||||
snList = JSON.parse(serialNoListValue);
|
||||
console.log("JSON 파싱 성공:", snList);
|
||||
if(snList.length > 0) {
|
||||
var maxId = Math.max.apply(Math, snList.map(function(item) { return item.id; }));
|
||||
snCounter = maxId + 1;
|
||||
}
|
||||
} catch(e) {
|
||||
console.log("JSON 파싱 실패:", e);
|
||||
// JSON 파싱 실패 시 display 필드 파싱
|
||||
console.log("JSON 파싱 오류:", e);
|
||||
snList = [];
|
||||
if(serialNoValue && serialNoValue.trim() != '') {
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
}
|
||||
}
|
||||
} else if(serialNoValue && serialNoValue.trim() != '') {
|
||||
// hidden 필드가 없으면 display 필드 파싱
|
||||
console.log("hidden 필드 없음, display 필드 파싱");
|
||||
console.log("hidden 필드 없음, display 필드에서 파싱");
|
||||
snList = [];
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
var snArray = serialNoValue.split(',');
|
||||
for(var i = 0; i < snArray.length; i++) {
|
||||
if(snArray[i].trim() != '') {
|
||||
snList.push({
|
||||
id: snCounter++,
|
||||
value: snArray[i].trim()
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("데이터 없음, 빈 배열로 시작");
|
||||
console.log("저장된 데이터 없음, 빈 배열로 시작");
|
||||
snList = [];
|
||||
}
|
||||
|
||||
console.log("최종 snList:", snList);
|
||||
console.log("로드된 S/N 목록 (복사본):", JSON.parse(JSON.stringify(snList)));
|
||||
console.log("snList.length:", snList.length);
|
||||
|
||||
// 실제 데이터 확인
|
||||
if(snList.length > 0) {
|
||||
console.log("첫 번째 아이템:", snList[0]);
|
||||
}
|
||||
|
||||
// 팝업 HTML 생성
|
||||
var popupHtml = '<div style="padding:10px; color:#333;">';
|
||||
popupHtml += ' <h3 style="margin:0 0 15px 0; text-align:center; color:#333;">S/N 관리</h3>';
|
||||
@@ -272,7 +215,7 @@
|
||||
customClass: {
|
||||
popup: 'sn-manage-popup'
|
||||
},
|
||||
didOpen: function() {
|
||||
onOpen: function() {
|
||||
setTimeout(function() {
|
||||
fn_renderSnList();
|
||||
// 엔터키로 추가
|
||||
@@ -289,23 +232,35 @@
|
||||
|
||||
// S/N 목록 렌더링
|
||||
function fn_renderSnList() {
|
||||
var container = $(".swal2-html-container #snListContainer");
|
||||
console.log("fn_renderSnList 실행, snList 길이:", snList.length);
|
||||
console.log("snList 내용:", snList);
|
||||
|
||||
if(snList.length === 0) {
|
||||
container.html('<div style="text-align:center; padding:20px; color:#999;">등록된 S/N이 없습니다.</div>');
|
||||
return;
|
||||
var html = '<table style="width:100%; margin-bottom:10px; border-collapse:collapse; border:1px solid #ddd; color:#333;">';
|
||||
html += '<colgroup><col width="15%"><col width="65%"><col width="20%"></colgroup>';
|
||||
html += '<thead><tr style="background:#f5f5f5; color:#333;">';
|
||||
html += '<th style="padding:10px; border:1px solid #ddd; text-align:center; color:#333;">번호</th>';
|
||||
html += '<th style="padding:10px; border:1px solid #ddd; text-align:center; color:#333;">S/N</th>';
|
||||
html += '<th style="padding:10px; border:1px solid #ddd; text-align:center; color:#333;">삭제</th>';
|
||||
html += '</tr></thead>';
|
||||
html += '<tbody>';
|
||||
|
||||
if(snList.length == 0) {
|
||||
html += '<tr><td colspan="3" style="text-align:center; padding:30px; color:#999; border:1px solid #ddd;">등록된 S/N이 없습니다.</td></tr>';
|
||||
} else {
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
html += '<tr>';
|
||||
html += '<td style="text-align:center; padding:8px; border:1px solid #ddd; color:#333;">' + (i+1) + '</td>';
|
||||
html += '<td style="padding:8px; border:1px solid #ddd; color:#333;">' + snList[i].value + '</td>';
|
||||
html += '<td style="text-align:center; padding:8px; border:1px solid #ddd;">';
|
||||
html += '<button type="button" onclick="fn_deleteSn(' + snList[i].id + ')" class="plm_btns" style="padding:4px 8px; font-size:12px;">삭제</button>';
|
||||
html += '</td>';
|
||||
html += '</tr>';
|
||||
}
|
||||
}
|
||||
|
||||
var html = '<div style="display:flex; flex-direction:column; gap:5px;">';
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
html += '<div style="display:flex; align-items:center; padding:8px; background:#f8f9fa; border-radius:4px; color:#333;">';
|
||||
html += ' <span style="flex:1; color:#333;">' + snList[i].value + '</span>';
|
||||
html += ' <button type="button" onclick="fn_deleteSn(' + snList[i].id + ')" class="plm_btns" style="padding:4px 8px; font-size:12px; background:#dc3545; color:#fff;">삭제</button>';
|
||||
html += '</div>';
|
||||
}
|
||||
html += '</div>';
|
||||
html += '</tbody></table>';
|
||||
|
||||
container.html(html);
|
||||
$(".swal2-html-container #snListContainer").html(html);
|
||||
}
|
||||
|
||||
// S/N 추가
|
||||
@@ -447,13 +402,23 @@
|
||||
|
||||
// S/N 목록 확인 및 적용
|
||||
function fn_confirmSnList() {
|
||||
// snList를 JSON 문자열로 변환하여 hidden 필드에 저장
|
||||
$("#serialNoList").val(JSON.stringify(snList));
|
||||
console.log("확인 버튼 클릭, snList:", snList);
|
||||
console.log("snList.length:", snList.length);
|
||||
|
||||
// S/N 목록을 쉼표로 구분하여 input에 저장
|
||||
var snValues = [];
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
snValues.push(snList[i].value);
|
||||
}
|
||||
|
||||
// hidden 필드에 전체 목록 저장 (서버 전송용)
|
||||
var jsonString = JSON.stringify(snList);
|
||||
console.log("저장할 JSON:", jsonString);
|
||||
$("#serialNoList").val(jsonString);
|
||||
console.log("저장 후 확인:", $("#serialNoList").val());
|
||||
|
||||
// 화면 표시 업데이트
|
||||
fn_updateSnDisplay();
|
||||
|
||||
// 팝업 닫기
|
||||
Swal.close();
|
||||
}
|
||||
|
||||
@@ -467,12 +432,34 @@
|
||||
var isChecked = $("#isShippingOrder").is(":checked");
|
||||
$("#shippingOrderStatus").val(isChecked ? "출하지시" : "");
|
||||
|
||||
// S/N 데이터 최종 정리 (콤마로 구분된 문자열로 변환)
|
||||
var serialNoValue = '';
|
||||
if(snList.length > 0) {
|
||||
serialNoValue = snList.map(function(item) { return item.value; }).join(',');
|
||||
// S/N 데이터 처리: JSON에서 값만 추출하여 콤마로 연결
|
||||
var serialNoListValue = $("#serialNoList").val();
|
||||
console.log("=== 저장 전 S/N 처리 시작 ===");
|
||||
console.log("serialNoList 값:", serialNoListValue);
|
||||
|
||||
if(serialNoListValue && serialNoListValue.trim() != '') {
|
||||
try {
|
||||
var snArray = JSON.parse(serialNoListValue);
|
||||
console.log("파싱된 배열:", snArray);
|
||||
var snValues = [];
|
||||
for(var i = 0; i < snArray.length; i++) {
|
||||
if(snArray[i].value) {
|
||||
snValues.push(snArray[i].value);
|
||||
}
|
||||
}
|
||||
console.log("추출된 값들:", snValues);
|
||||
// 콤마로 구분된 문자열로 변환 (서버 저장용, 띄어쓰기 없이)
|
||||
var finalSnString = snValues.join(',');
|
||||
console.log("최종 S/N 문자열:", finalSnString);
|
||||
$("#serialNo").val(finalSnString);
|
||||
console.log("설정 후 serialNo 필드 값:", $("#serialNo").val());
|
||||
} catch(e) {
|
||||
console.error("S/N JSON 파싱 오류:", e);
|
||||
}
|
||||
} else {
|
||||
console.log("serialNoList가 비어있음");
|
||||
}
|
||||
$("#serialNo").val(serialNoValue);
|
||||
console.log("=== S/N 처리 완료 ===");
|
||||
|
||||
if(confirm("저장하시겠습니까?")) {
|
||||
$.ajax({
|
||||
@@ -500,7 +487,8 @@
|
||||
<form name="form1" id="form1" action="" method="post">
|
||||
<input type="hidden" name="orderNo" value="${param.orderNo}">
|
||||
<input type="hidden" name="saleNo" value="${param.saleNo}">
|
||||
<input type="hidden" name="serialNoList" id="serialNoList" value="${saleInfo.SERIAL_NO_LIST}" />
|
||||
<!-- serialNoList는 name 속성 없이 id만 사용 (클라이언트 전용) -->
|
||||
<input type="hidden" id="serialNoList" value="${saleInfo.SERIAL_NO_LIST}" />
|
||||
<section>
|
||||
<div class="plm_menu_name">
|
||||
<h2>
|
||||
@@ -597,11 +585,7 @@
|
||||
<td class="input_sub_title">
|
||||
<select name="salesCurrency" id="salesCurrency" style="width:100%;" class="select2" onchange="fn_recalculateByExchangeRate()">
|
||||
<option value="">선택</option>
|
||||
<option value="KRW" ${saleInfo.SALES_CURRENCY == 'KRW' || empty saleInfo.SALES_CURRENCY ? 'selected' : ''}>KRW</option>
|
||||
<option value="USD" ${saleInfo.SALES_CURRENCY == 'USD' ? 'selected' : ''}>USD</option>
|
||||
<option value="EUR" ${saleInfo.SALES_CURRENCY == 'EUR' ? 'selected' : ''}>EUR</option>
|
||||
<option value="JPY" ${saleInfo.SALES_CURRENCY == 'JPY' ? 'selected' : ''}>JPY</option>
|
||||
<option value="CNY" ${saleInfo.SALES_CURRENCY == 'CNY' ? 'selected' : ''}>CNY</option>
|
||||
${codeMap.salesCurrency}
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="salesExchangeRate">판매환율</label></td>
|
||||
|
||||
@@ -258,19 +258,26 @@ public class SalesNcollectMgmtController {
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, Object> codeMap = new HashMap<String, Object>();
|
||||
|
||||
// 담당자
|
||||
codeMap.put("managerList",
|
||||
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
|
||||
|
||||
// 기존 판매 정보 조회
|
||||
if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
|
||||
Map<String, Object> saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
|
||||
request.setAttribute("saleInfo", saleInfo);
|
||||
}
|
||||
|
||||
request.setAttribute("codeMap", codeMap);
|
||||
Map<String, Object> codeMap = new HashMap<String, Object>();
|
||||
|
||||
// 담당자
|
||||
codeMap.put("managerList",
|
||||
salesMgmtCommonService.bizMakeOptionList("", "", "salesMgmtCommon.getSalesmanList"));
|
||||
|
||||
// 기존 판매 정보 조회 후 환종(통화) 공통코드 세팅
|
||||
Map<String, Object> saleInfo = null;
|
||||
String salesCurrency = "";
|
||||
if(paramMap.get("orderNo") != null && !paramMap.get("orderNo").equals("")) {
|
||||
saleInfo = salesNcollectMgmtService.getSaleInfo(paramMap);
|
||||
salesCurrency = CommonUtils.nullToEmpty((String)saleInfo.get("SALES_CURRENCY"));
|
||||
request.setAttribute("saleInfo", saleInfo);
|
||||
}
|
||||
|
||||
// 환종(통화) - 공통코드 0001533
|
||||
codeMap.put("salesCurrency",
|
||||
commonService.bizMakeOptionList("0001533", salesCurrency, "common.getCodeselect"));
|
||||
|
||||
request.setAttribute("codeMap", codeMap);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -814,9 +814,10 @@
|
||||
|
||||
<!-- 매출관리 그리드 목록 - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) -->
|
||||
<select id="getSalesMgmtGridList" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList - project_mgmt 테이블 기반 조회 (S/N, 유무상 포함) */
|
||||
/* salesNcollectMgmt.getSalesMgmtGridList - sales_registration LEFT JOIN으로 최적화 */
|
||||
SELECT
|
||||
T.PROJECT_NO,
|
||||
T.CONTRACT_OBJID,
|
||||
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
|
||||
CODE_NAME(T.PRODUCT) AS PRODUCT_TYPE,
|
||||
CODE_NAME(T.AREA_CD) AS NATION,
|
||||
@@ -831,143 +832,68 @@
|
||||
FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PAYMENT_TYPE,
|
||||
T.PART_NO AS PRODUCT_NO,
|
||||
T.PART_NAME AS PRODUCT_NAME,
|
||||
-- S/N: sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL (모두 "외 몇건" 형태로 표시)
|
||||
COALESCE(
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN SR.serial_no IS NULL OR SR.serial_no = '' THEN ''
|
||||
ELSE
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN array_length(string_to_array(SR.serial_no, ','), 1) = 1 THEN SR.serial_no
|
||||
ELSE (string_to_array(SR.serial_no, ','))[1] || ' 외 ' || (array_length(string_to_array(SR.serial_no, ','), 1) - 1)::TEXT || '건'
|
||||
END
|
||||
)
|
||||
END
|
||||
FROM sales_registration SR WHERE SR.project_no = T.PROJECT_NO
|
||||
),
|
||||
(SELECT
|
||||
CASE
|
||||
WHEN COUNT(*) = 0 THEN ''
|
||||
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
|
||||
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
|
||||
END
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
|
||||
AND UPPER(CIS.STATUS) = 'ACTIVE'
|
||||
), ''
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE' AND CIS.SERIAL_NO IS NOT NULL),
|
||||
''
|
||||
) AS SERIAL_NO,
|
||||
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
|
||||
T.DUE_DATE AS REQUEST_DATE,
|
||||
T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST,
|
||||
COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE,
|
||||
COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST,
|
||||
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
|
||||
T.PO_NO,
|
||||
T.CONTRACT_DATE AS ORDER_DATE,
|
||||
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
|
||||
CASE WHEN EXISTS(
|
||||
SELECT 1 FROM ATTACH_FILE_INFO
|
||||
WHERE TARGET_OBJID = T.OBJID::VARCHAR
|
||||
WHERE TARGET_OBJID = T.CONTRACT_OBJID
|
||||
AND DOC_TYPE='ORDER_DOC'
|
||||
AND UPPER(STATUS) = 'ACTIVE'
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
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,
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (sales_registration 테이블에서 한 번에 가져오기)
|
||||
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
|
||||
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
|
||||
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
|
||||
COALESCE(
|
||||
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SR.manager_user_id),
|
||||
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.PM_USER_ID)
|
||||
) AS MANAGER,
|
||||
COALESCE(SR.incoterms, '') 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
|
||||
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
|
||||
WHERE 1 = 1
|
||||
<if test="orderType != null and orderType != ''">
|
||||
AND T.CATEGORY_CD = #{orderType}
|
||||
@@ -1289,56 +1215,51 @@
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!--
|
||||
<!--
|
||||
/**
|
||||
* 판매 등록 저장 (shipment_log 테이블 사용)
|
||||
* 판매 등록 저장 (sales_registration 테이블 사용)
|
||||
* INSERT 또는 UPDATE (ON CONFLICT로 중복 방지)
|
||||
* @since 2025.10.22
|
||||
* @author johngreen
|
||||
* @version 1.0
|
||||
* @version 1.1
|
||||
**/
|
||||
-->
|
||||
<insert id="insertSaleRegistration" parameterType="map">
|
||||
/* salesNcollectMgmt.insertSaleRegistration - shipment_log에 판매 데이터 저장 */
|
||||
INSERT INTO shipment_log (
|
||||
target_objid,
|
||||
log_type,
|
||||
log_message,
|
||||
split_quantity,
|
||||
shipping_status,
|
||||
/* salesNcollectMgmt.insertSaleRegistration - sales_registration에 판매 데이터 저장 */
|
||||
INSERT INTO sales_registration (
|
||||
project_no,
|
||||
shipping_order_status,
|
||||
serial_no,
|
||||
sales_quantity,
|
||||
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>
|
||||
<choose>
|
||||
<when test="shippingOrderStatus != null and shippingOrderStatus != ''">
|
||||
#{shippingOrderStatus},
|
||||
</when>
|
||||
<otherwise>
|
||||
'',
|
||||
</otherwise>
|
||||
</choose>
|
||||
#{serialNo},
|
||||
#{salesQuantity}::integer,
|
||||
#{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'),
|
||||
@@ -1350,10 +1271,25 @@
|
||||
#{shippingMethod},
|
||||
#{manager},
|
||||
#{incoterms},
|
||||
false,
|
||||
NOW(),
|
||||
#{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>
|
||||
|
||||
<!--
|
||||
@@ -1366,7 +1302,7 @@
|
||||
**/
|
||||
-->
|
||||
<select id="getSaleInfo" parameterType="map" resultType="map">
|
||||
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (리스트와 동일한 구조) */
|
||||
/* salesNcollectMgmt.getSaleInfo - 판매등록 팝업용 프로젝트 정보 조회 (sales_registration 테이블 사용) */
|
||||
SELECT
|
||||
T.PROJECT_NO,
|
||||
CODE_NAME(T.CATEGORY_CD) AS ORDER_TYPE,
|
||||
@@ -1383,160 +1319,47 @@
|
||||
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,
|
||||
-- S/N 정보 (sales_registration 우선, 없으면 CONTRACT_ITEM_SERIAL에서)
|
||||
COALESCE(
|
||||
SR.serial_no,
|
||||
(SELECT STRING_AGG(CIS.SERIAL_NO, ',' ORDER BY CIS.SERIAL_NO)
|
||||
FROM CONTRACT_ITEM CI
|
||||
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID
|
||||
WHERE CI.CONTRACT_OBJID = T.CONTRACT_OBJID
|
||||
AND UPPER(CIS.STATUS) = 'ACTIVE'
|
||||
AND CIS.SERIAL_NO IS NOT NULL
|
||||
),
|
||||
''
|
||||
) AS SERIAL_NO,
|
||||
COALESCE(T.QUANTITY::numeric, 0) AS ORDER_QUANTITY,
|
||||
T.DUE_DATE AS REQUEST_DATE,
|
||||
T.CUSTOMER_PROJECT_NAME AS CUSTOMER_REQUEST,
|
||||
COALESCE(T.DUE_DATE, (SELECT CM.due_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS REQUEST_DATE,
|
||||
COALESCE(T.CUSTOMER_PROJECT_NAME, (SELECT CM.customer_request FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS CUSTOMER_REQUEST,
|
||||
CODE_NAME(T.CONTRACT_RESULT) AS ORDER_STATUS,
|
||||
T.PO_NO,
|
||||
T.CONTRACT_DATE AS ORDER_DATE,
|
||||
COALESCE(T.CONTRACT_DATE, (SELECT CM.order_date FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID)) AS ORDER_DATE,
|
||||
CASE WHEN EXISTS(
|
||||
SELECT 1 FROM ATTACH_FILE_INFO
|
||||
WHERE TARGET_OBJID = T.OBJID::VARCHAR
|
||||
WHERE TARGET_OBJID = T.CONTRACT_OBJID
|
||||
AND DOC_TYPE='ORDER_DOC'
|
||||
AND UPPER(STATUS) = 'ACTIVE'
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (shipment_log에서 가져오기)
|
||||
COALESCE((
|
||||
SELECT SL.SHIPPING_STATUS
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE((
|
||||
SELECT SL.SPLIT_QUANTITY
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_QUANTITY,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_UNIT_PRICE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_SUPPLY_PRICE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_VAT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_VAT,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_TOTAL_AMOUNT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_TOTAL_AMOUNT
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_CURRENCY
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE((
|
||||
SELECT SL.SALES_EXCHANGE_RATE
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE((
|
||||
SELECT TO_CHAR(SL.SHIPPING_DATE, 'YYYY-MM-DD')
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_DATE,
|
||||
COALESCE((
|
||||
SELECT SL.SHIPPING_METHOD
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS SHIPPING_METHOD,
|
||||
COALESCE((
|
||||
SELECT SL.MANAGER_USER_ID
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), T.PM_USER_ID) AS MANAGER,
|
||||
COALESCE((
|
||||
SELECT SL.INCOTERMS
|
||||
FROM SHIPMENT_LOG SL
|
||||
WHERE SL.TARGET_OBJID = T.PROJECT_NO
|
||||
AND SL.LOG_TYPE = 'SALES_REGISTRATION'
|
||||
ORDER BY SL.REG_DATE DESC
|
||||
LIMIT 1
|
||||
), '') AS INCOTERMS
|
||||
) THEN 'Y' ELSE 'N' END AS ORDER_ATTACH,
|
||||
(SELECT CM.PRODUCTION_STATUS FROM CONTRACT_MGMT CM WHERE CM.OBJID = T.CONTRACT_OBJID) AS PRODUCTION_STATUS,
|
||||
-- 판매 관련 필드들 (sales_registration 테이블에서 가져오기)
|
||||
COALESCE(SR.shipping_order_status, '') AS SHIPPING_ORDER_STATUS,
|
||||
COALESCE(SR.sales_quantity, 0) AS SALES_QUANTITY,
|
||||
COALESCE(SR.sales_unit_price, 0) AS SALES_UNIT_PRICE,
|
||||
COALESCE(SR.sales_supply_price, 0) AS SALES_SUPPLY_PRICE,
|
||||
COALESCE(SR.sales_vat, 0) AS SALES_VAT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT,
|
||||
COALESCE(SR.sales_total_amount, 0) AS SALES_TOTAL_AMOUNT_KRW,
|
||||
COALESCE(SR.sales_currency, T.CONTRACT_CURRENCY) AS SALES_CURRENCY,
|
||||
COALESCE(SR.sales_exchange_rate, T.CONTRACT_PRICE_CURRENCY::numeric, 0) AS SALES_EXCHANGE_RATE,
|
||||
COALESCE(TO_CHAR(SR.shipping_date, 'YYYY-MM-DD'), '') AS SHIPPING_DATE,
|
||||
COALESCE(SR.shipping_method, '') AS SHIPPING_METHOD,
|
||||
COALESCE(SR.manager_user_id, T.PM_USER_ID) AS MANAGER,
|
||||
COALESCE(SR.incoterms, '') AS INCOTERMS
|
||||
FROM PROJECT_MGMT AS T
|
||||
LEFT JOIN sales_registration SR ON T.PROJECT_NO = SR.project_no
|
||||
WHERE T.PROJECT_NO = #{orderNo}
|
||||
</select>
|
||||
|
||||
|
||||
@@ -268,7 +268,7 @@ public class SalesNcollectMgmtService {
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
paramMap.put("cretEmpNo", person.getUserId());
|
||||
|
||||
// shipment_log 테이블에 판매 데이터 저장
|
||||
// sales_registration 테이블에 판매 데이터 저장 (ON CONFLICT로 자동 UPDATE)
|
||||
sqlSession.insert("salesNcollectMgmt.insertSaleRegistration", paramMap);
|
||||
|
||||
sqlSession.commit();
|
||||
|
||||
Reference in New Issue
Block a user