V2025101701 #5
@@ -10,6 +10,9 @@ COPY src /usr/local/tomcat/webapps/ROOT/WEB-INF/src
|
||||
# Copy custom Tomcat context configuration for JNDI
|
||||
COPY ./tomcat-conf/context.xml /usr/local/tomcat/conf/context.xml
|
||||
|
||||
# Copy custom Tomcat server configuration for URIEncoding
|
||||
COPY ./tomcat-conf/server.xml /usr/local/tomcat/conf/server.xml
|
||||
|
||||
# Copy database driver if needed (PostgreSQL driver is already in WEB-INF/lib)
|
||||
# COPY path/to/postgresql-driver.jar /usr/local/tomcat/lib/
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -131,14 +131,29 @@ var columns = [
|
||||
|
||||
//var grid;
|
||||
function fn_search(){
|
||||
var selectedValues = $("#project_no").val();
|
||||
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'project_nos',
|
||||
value: selectedValues
|
||||
}).appendTo('#form1');
|
||||
// 기존 project_nos hidden input 제거
|
||||
$('input[name="project_nos"]').remove();
|
||||
|
||||
var selectedValues = $("#project_no").val();
|
||||
console.log('선택된 프로젝트 번호:', selectedValues);
|
||||
|
||||
// 배열을 콤마로 구분된 문자열로 변환
|
||||
var projectNosValue = '';
|
||||
if(selectedValues && Array.isArray(selectedValues) && selectedValues.length > 0) {
|
||||
projectNosValue = selectedValues.join(',');
|
||||
}
|
||||
console.log('전송할 project_nos 값:', projectNosValue);
|
||||
|
||||
// hidden input 추가 (값이 있을 때만)
|
||||
if(projectNosValue) {
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'project_nos',
|
||||
value: projectNosValue
|
||||
}).appendTo('#form1');
|
||||
}
|
||||
|
||||
console.log('Form 데이터:', $('#form1').serializeObject());
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/project/projectMgmtWbsGridList.do", columns, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
<script type="text/javascript">
|
||||
var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '영업번호', field : 'PROJECT_NO', frozen : true,
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true,
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
var rowData = cell.getData();
|
||||
|
||||
@@ -38,17 +38,13 @@
|
||||
$("#btnBulkRegister").click(function(){
|
||||
fn_bulkRegister();
|
||||
});
|
||||
|
||||
// 분할출하 버튼
|
||||
$("#btnSplitShipment").click(function(){
|
||||
fn_splitShipment();
|
||||
});
|
||||
});
|
||||
|
||||
function fn_openSaleRegPopup(orderNo, saleNo){
|
||||
var popup_width = 600;
|
||||
var popup_height = 400;
|
||||
var url = "/salesMgmt/salesRegForm.do?orderNo=" + orderNo + "&saleNo=" + saleNo;
|
||||
var popup_width = 850;
|
||||
var popup_height = 550;
|
||||
// 한글 프로젝트 번호 인코딩 처리
|
||||
var url = "/salesMgmt/salesRegForm.do?orderNo=" + encodeURIComponent(orderNo) + "&saleNo=" + (saleNo ? encodeURIComponent(saleNo) : "");
|
||||
fn_centerPopup(popup_width, popup_height, url);
|
||||
}
|
||||
|
||||
@@ -66,13 +62,7 @@
|
||||
<script type="text/javascript">
|
||||
// 새로운 테이블 구조에 맞게 컬럼 정의 수정
|
||||
var columns = [
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '영업번호', field : 'PROJECT_NO', frozen : true,
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
var rowData = cell.getData();
|
||||
fn_openSaleRegPopup(rowData.PROJECT_NO, rowData.SALE_NO);
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '120', title : '프로젝트번호', field : 'PROJECT_NO', frozen : true},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '주문유형', field : 'ORDER_TYPE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '제품구분', field : 'PRODUCT_TYPE'},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', width : '100', title : '국내/해외', field : 'NATION'},
|
||||
@@ -134,7 +124,7 @@ function fn_search(){
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/salesMgmt/salesMgmtGridList.do", columns, true);
|
||||
}
|
||||
|
||||
// 일괄 출하지시/판매등록 함수
|
||||
// 출하지시/판매등록 함수 (1건만 선택 가능)
|
||||
function fn_bulkRegister(){
|
||||
if(!_tabulGrid){
|
||||
alert("그리드가 초기화되지 않았습니다.");
|
||||
@@ -149,87 +139,17 @@ function fn_bulkRegister(){
|
||||
return;
|
||||
}
|
||||
|
||||
// 판매완료된 항목 필터링
|
||||
var validRows = selectedRows.filter(function(row){
|
||||
return row.SALES_STATUS != 'Y';
|
||||
});
|
||||
|
||||
if(validRows.length === 0){
|
||||
alert("선택한 항목 중 출하지시/판매등록 가능한 항목이 없습니다.\n(판매완료된 항목은 제외됩니다)");
|
||||
return;
|
||||
}
|
||||
|
||||
if(validRows.length !== selectedRows.length){
|
||||
var excludedCount = selectedRows.length - validRows.length;
|
||||
if(!confirm("선택한 " + selectedRows.length + "개 항목 중 " + validRows.length + "개 항목만 등록 가능합니다.\n(" + excludedCount + "개는 이미 판매완료 상태입니다)\n\n진행하시겠습니까?")){
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if(!confirm("선택한 " + validRows.length + "개 항목을 출하지시/판매등록 하시겠습니까?")){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 각 항목에 대해 판매등록 팝업 열기
|
||||
var popupCount = 0;
|
||||
var maxPopups = 5; // 최대 동시 팝업 개수 제한
|
||||
|
||||
if(validRows.length > maxPopups){
|
||||
alert("한번에 최대 " + maxPopups + "개까지만 등록 가능합니다.\n선택한 " + validRows.length + "개 중 처음 " + maxPopups + "개만 팝업이 열립니다.");
|
||||
}
|
||||
|
||||
for(var i = 0; i < Math.min(validRows.length, maxPopups); i++){
|
||||
(function(index){
|
||||
setTimeout(function(){
|
||||
fn_openSaleRegPopup(validRows[index].PROJECT_NO, validRows[index].SALE_NO);
|
||||
}, index * 300); // 0.3초 간격으로 팝업 열기
|
||||
})(i);
|
||||
}
|
||||
}
|
||||
|
||||
// 분할출하 함수
|
||||
function fn_splitShipment(){
|
||||
if(!_tabulGrid){
|
||||
alert("그리드가 초기화되지 않았습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 선택된 행 가져오기
|
||||
var selectedRows = _tabulGrid.getSelectedData();
|
||||
|
||||
if(selectedRows.length === 0){
|
||||
alert("분할출하할 항목을 선택해주세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 1건만 선택 가능하도록 체크
|
||||
if(selectedRows.length > 1){
|
||||
alert("분할출하는 한 번에 하나의 항목만 선택 가능합니다.");
|
||||
alert("출하지시/판매등록은 1건만 선택 가능합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 선택한 1건의 항목 가져오기
|
||||
var selectedRow = selectedRows[0];
|
||||
|
||||
// 분할출하 레코드는 다시 분할 불가
|
||||
if(selectedRow.RECORD_TYPE === 'SPLIT'){
|
||||
alert("이미 분할된 항목은 다시 분할할 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 수량 확인
|
||||
var originalQty = selectedRow.ORDER_QUANTITY || 0;
|
||||
|
||||
if(originalQty <= 1){
|
||||
alert("분할할 수 있는 수량이 부족합니다.\n(현재 수량: " + originalQty + ")");
|
||||
return;
|
||||
}
|
||||
|
||||
// 분할출하 팝업 열기
|
||||
var params = "?objid=" + selectedRow.SALE_NO
|
||||
+ "&projectNo=" + encodeURIComponent(selectedRow.PROJECT_NO)
|
||||
+ "&originalQuantity=" + originalQty;
|
||||
var url = "/salesMgmt/splitShipmentForm.do" + params;
|
||||
|
||||
window.open(url, "splitShipmentPopup", "width=700, height=500, scrollbars=yes, resizable=yes");
|
||||
// 판매등록 팝업 열기
|
||||
fn_openSaleRegPopup(selectedRow.PROJECT_NO, selectedRow.SALE_NO);
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
@@ -247,7 +167,6 @@ function fn_splitShipment(){
|
||||
<div class="btnArea">
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
<input type="button" value="출하지시/판매등록" class="plm_btns" id="btnBulkRegister" style="background-color: #4CAF50; color: white;">
|
||||
<input type="button" value="분할출하" class="plm_btns" id="btnSplitShipment" style="background-color: #FF9800; color: white;">
|
||||
</div>
|
||||
</div>
|
||||
<div id="plmSearchZon">
|
||||
@@ -301,28 +220,31 @@ function fn_splitShipment(){
|
||||
<td><input type="text" name="poNo" /></td>
|
||||
<td class="label"><label for="">담당자</label></td>
|
||||
<td><select name="manager" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.managerList}</select></td>
|
||||
<td class="label"><label for="">인도조건</label></td>
|
||||
<td>
|
||||
<select name="incoterms" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="EXW">EXW</option>
|
||||
<option value="FOB">FOB</option>
|
||||
<option value="CIF">CIF</option>
|
||||
<option value="DDP">DDP</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label"><label for="">인도조건</label></td>
|
||||
<td>
|
||||
<select name="incoterms" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="FOB">FOB</option>
|
||||
<option value="EXW">EXW</option>
|
||||
<option value="CIF">CIF</option>
|
||||
<option value="DDP">DDP</option>
|
||||
<option value="DAP">DAP</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label"><label for="">출하대기 상태</label></td>
|
||||
<td><select name="shippingStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
|
||||
<td class="label"><label for="">출고방법</label></td>
|
||||
<td>
|
||||
<select name="shippingMethod" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="DIRECT">직납</option>
|
||||
<option value="PARCEL">택배</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label"><label for="">출하대기 상태</label></td>
|
||||
<td><select name="shippingStatus" class="select2" style="width:120px;"><option value="">전체</option>${codeMap.shippingStatusList}</select></td>
|
||||
<td class="label"><label for="">출하방법</label></td>
|
||||
<td>
|
||||
<select name="shippingMethod" class="select2" style="width:120px;">
|
||||
<option value="">전체</option>
|
||||
<option value="내수/직납">내수/직납</option>
|
||||
<option value="내수/택배">내수/택배</option>
|
||||
<option value="내수/기타">내수/기타</option>
|
||||
<option value="수출">수출</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="label"><label for="">요청납기</label></td>
|
||||
<td colspan="3"><input type="date" name="requestDateFrom" /> ~ <input type="date" name="requestDateTo" /></td>
|
||||
</tr>
|
||||
|
||||
@@ -7,13 +7,51 @@
|
||||
<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 = [];
|
||||
var snCounter = 1;
|
||||
|
||||
$(document).ready(function() {
|
||||
// select2 초기화
|
||||
$('.select2').select2();
|
||||
|
||||
// 달력 초기화
|
||||
fnc_makeDatepick();
|
||||
|
||||
// 기존 담당자 값 설정
|
||||
var managerValue = "${saleInfo.MANAGER}";
|
||||
if(managerValue) {
|
||||
$("#manager").val(managerValue).trigger('change');
|
||||
}
|
||||
|
||||
// S/N 필드 클릭 이벤트
|
||||
$("#serialNo").click(function() {
|
||||
fn_openSnManagePopup();
|
||||
});
|
||||
|
||||
// 초기 S/N 데이터 로드
|
||||
fn_loadSnList();
|
||||
|
||||
// 닫기 버튼
|
||||
$("#btnClose").click(function() {
|
||||
@@ -26,7 +64,416 @@
|
||||
});
|
||||
});
|
||||
|
||||
// 판매공급가액 계산 함수
|
||||
function fn_calculateSupplyPrice() {
|
||||
var currency = $("#salesCurrency").val();
|
||||
var exchangeRate = parseFloat($("#salesExchangeRate").val()) || 1;
|
||||
var quantity = parseFloat($("#salesQuantity").val()) || 0;
|
||||
var unitPrice = parseFloat($("#salesUnitPrice").val()) || 0;
|
||||
|
||||
// 외화 기준 금액 계산
|
||||
var foreignSupplyPrice = quantity * unitPrice;
|
||||
|
||||
// KRW가 아니고 환율이 있으면 환율 적용
|
||||
if(currency && currency !== 'KRW' && exchangeRate > 0) {
|
||||
var krwSupplyPrice = Math.round(foreignSupplyPrice * exchangeRate);
|
||||
$("#salesSupplyPrice").val(krwSupplyPrice);
|
||||
} else {
|
||||
$("#salesSupplyPrice").val(foreignSupplyPrice);
|
||||
}
|
||||
|
||||
fn_calculateVat();
|
||||
}
|
||||
|
||||
// 부가세 계산 함수
|
||||
function fn_calculateVat() {
|
||||
var supplyPrice = parseFloat($("#salesSupplyPrice").val()) || 0;
|
||||
var vat = Math.round(supplyPrice * 0.1);
|
||||
$("#salesVat").val(vat);
|
||||
fn_calculateTotalAmount();
|
||||
}
|
||||
|
||||
// 판매총액 계산 함수 (공급가액 + 부가세)
|
||||
function fn_calculateTotalAmount() {
|
||||
var supplyPrice = parseFloat($("#salesSupplyPrice").val()) || 0;
|
||||
var vat = parseFloat($("#salesVat").val()) || 0;
|
||||
var totalAmount = supplyPrice + vat;
|
||||
$("#salesTotalAmount").val(totalAmount);
|
||||
}
|
||||
|
||||
// 환율 변경 시 원화 금액 재계산
|
||||
function fn_recalculateByExchangeRate() {
|
||||
var currency = $("#salesCurrency").val();
|
||||
var exchangeRate = parseFloat($("#salesExchangeRate").val()) || 1;
|
||||
|
||||
// KRW가 아닌 경우에만 환율 적용
|
||||
if(currency && currency !== 'KRW' && exchangeRate > 0) {
|
||||
var quantity = parseFloat($("#salesQuantity").val()) || 0;
|
||||
var unitPrice = parseFloat($("#salesUnitPrice").val()) || 0;
|
||||
|
||||
// 외화 기준 금액 계산
|
||||
var foreignSupplyPrice = quantity * unitPrice;
|
||||
|
||||
// 원화 환산 금액 계산
|
||||
var krwSupplyPrice = Math.round(foreignSupplyPrice * exchangeRate);
|
||||
var krwVat = Math.round(krwSupplyPrice * 0.1);
|
||||
var krwTotalAmount = krwSupplyPrice + krwVat;
|
||||
|
||||
$("#salesSupplyPrice").val(krwSupplyPrice);
|
||||
$("#salesVat").val(krwVat);
|
||||
$("#salesTotalAmount").val(krwTotalAmount);
|
||||
} else {
|
||||
// KRW인 경우 일반 계산
|
||||
fn_calculateSupplyPrice();
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 목록 로드
|
||||
function fn_loadSnList() {
|
||||
var serialNoValue = $("#serialNo").val();
|
||||
var serialNoListValue = $("#serialNoList").val();
|
||||
|
||||
console.log("초기 로드 - serialNo:", serialNoValue);
|
||||
console.log("초기 로드 - serialNoList:", serialNoListValue);
|
||||
|
||||
snList = [];
|
||||
|
||||
if(serialNoListValue && serialNoListValue.trim() != '') {
|
||||
// JSON 형태로 저장된 데이터가 있으면 파싱
|
||||
try {
|
||||
var loadedList = JSON.parse(serialNoListValue);
|
||||
snList = loadedList;
|
||||
console.log("JSON 파싱 성공:", 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 파싱 성공, S/N 개수:", snList.length);
|
||||
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 필드 파싱
|
||||
snList = [];
|
||||
if(serialNoValue && serialNoValue.trim() != '') {
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
}
|
||||
}
|
||||
} else if(serialNoValue && serialNoValue.trim() != '') {
|
||||
// hidden 필드가 없으면 display 필드 파싱
|
||||
console.log("hidden 필드 없음, display 필드 파싱");
|
||||
snList = [];
|
||||
fn_parseSerialNoValue(serialNoValue);
|
||||
} else {
|
||||
console.log("데이터 없음, 빈 배열로 시작");
|
||||
snList = [];
|
||||
}
|
||||
|
||||
console.log("최종 snList:", snList);
|
||||
console.log("snList.length:", snList.length);
|
||||
|
||||
// 팝업 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>';
|
||||
popupHtml += ' <div id="snListContainer" style="margin-bottom:15px; max-height:300px; overflow-y:auto; color:#333;"></div>';
|
||||
popupHtml += ' <div style="margin-bottom:15px; display:flex; gap:5px;">';
|
||||
popupHtml += ' <input type="text" id="newSnInput" placeholder="S/N 입력" style="flex:1; padding:8px; border:1px solid #ddd; border-radius:4px; color:#333;">';
|
||||
popupHtml += ' <button type="button" onclick="fn_addSn()" class="plm_btns">추가</button>';
|
||||
popupHtml += ' </div>';
|
||||
popupHtml += ' <div style="text-align:center; margin-top:20px; display:flex; gap:10px; justify-content:center;">';
|
||||
popupHtml += ' <button type="button" onclick="fn_openSequentialSnPopup()" class="plm_btns">연속번호생성</button>';
|
||||
popupHtml += ' <button type="button" onclick="fn_confirmSnList()" class="plm_btns">확인</button>';
|
||||
popupHtml += ' <button type="button" onclick="fn_closeSnPopup()" class="plm_btns">취소</button>';
|
||||
popupHtml += ' </div>';
|
||||
popupHtml += '</div>';
|
||||
|
||||
// 팝업 오픈 (Swal 사용)
|
||||
Swal.fire({
|
||||
html: popupHtml,
|
||||
width: '700px',
|
||||
showConfirmButton: false,
|
||||
showCloseButton: true,
|
||||
customClass: {
|
||||
popup: 'sn-manage-popup'
|
||||
},
|
||||
didOpen: function() {
|
||||
setTimeout(function() {
|
||||
fn_renderSnList();
|
||||
// 엔터키로 추가
|
||||
$(".swal2-html-container #newSnInput").keypress(function(e) {
|
||||
if(e.which == 13) {
|
||||
fn_addSn();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}, 50);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// S/N 목록 렌더링
|
||||
function fn_renderSnList() {
|
||||
var container = $(".swal2-html-container #snListContainer");
|
||||
|
||||
if(snList.length === 0) {
|
||||
container.html('<div style="text-align:center; padding:20px; color:#999;">등록된 S/N이 없습니다.</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
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>';
|
||||
|
||||
container.html(html);
|
||||
}
|
||||
|
||||
// S/N 추가
|
||||
function fn_addSn() {
|
||||
var newSn = $(".swal2-html-container #newSnInput").val().trim();
|
||||
|
||||
if(newSn == '') {
|
||||
alert('S/N을 입력해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 중복 체크
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
if(snList[i].value == newSn) {
|
||||
alert('이미 등록된 S/N입니다.');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 추가
|
||||
snList.push({
|
||||
id: snCounter++,
|
||||
value: newSn
|
||||
});
|
||||
|
||||
$(".swal2-html-container #newSnInput").val('');
|
||||
fn_renderSnList();
|
||||
}
|
||||
|
||||
// S/N 삭제
|
||||
function fn_deleteSn(snId) {
|
||||
for(var i = 0; i < snList.length; i++) {
|
||||
if(snList[i].id == snId) {
|
||||
snList.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fn_renderSnList();
|
||||
}
|
||||
|
||||
// 연속번호 생성 팝업 열기
|
||||
function fn_openSequentialSnPopup() {
|
||||
Swal.fire({
|
||||
title: '연속번호 생성',
|
||||
html:
|
||||
'<div style="text-align:left; padding:5px; color:#333;">' +
|
||||
'<div style="margin-bottom:10px;">' +
|
||||
'<label style="display:block; margin-bottom:3px; font-size:13px; color:#333;">시작번호 <span style="color:red;">*</span></label>' +
|
||||
'<input type="text" id="seqStartNo" placeholder="예: ITEM-001" style="width:100%; padding:6px; border:1px solid #ddd; border-radius:3px; font-size:13px; color:#333;">' +
|
||||
'</div>' +
|
||||
'<div style="margin-bottom:10px;">' +
|
||||
'<label style="display:block; margin-bottom:3px; font-size:13px; color:#333;">생성개수 <span style="color:red;">*</span></label>' +
|
||||
'<input type="number" id="seqCount" placeholder="예: 10" min="1" max="100" style="width:100%; padding:6px; border:1px solid #ddd; border-radius:3px; font-size:13px; color:#333;">' +
|
||||
'</div>' +
|
||||
'<div style="background:#f8f9fa; padding:8px; border-radius:3px; color:#666; font-size:11px; line-height:1.5;">' +
|
||||
'예: ITEM-001, 개수 3 → ITEM-001, ITEM-002, ITEM-003<br>' +
|
||||
'※ 최대 100개까지 생성 가능' +
|
||||
'</div>' +
|
||||
'</div>',
|
||||
width: '400px',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '생성',
|
||||
cancelButtonText: '취소',
|
||||
preConfirm: () => {
|
||||
var startNo = $("#seqStartNo").val().trim();
|
||||
var count = parseInt($("#seqCount").val());
|
||||
|
||||
if(!startNo) {
|
||||
Swal.showValidationMessage('시작번호를 입력해주세요.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!count || count < 1) {
|
||||
Swal.showValidationMessage('생성개수를 입력해주세요.');
|
||||
return false;
|
||||
}
|
||||
|
||||
if(count > 100) {
|
||||
Swal.showValidationMessage('최대 100개까지 생성 가능합니다.');
|
||||
return false;
|
||||
}
|
||||
|
||||
return {startNo: startNo, count: count};
|
||||
}
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed && result.value) {
|
||||
fn_generateSequentialSn(result.value.startNo, result.value.count);
|
||||
} else {
|
||||
fn_openSnManagePopup();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 연속번호 생성 로직
|
||||
function fn_generateSequentialSn(startNo, count) {
|
||||
// 숫자 부분 추출 (마지막 연속된 숫자)
|
||||
var match = startNo.match(/^(.*?)(\d+)$/);
|
||||
|
||||
if(!match) {
|
||||
alert('올바른 형식이 아닙니다. 마지막에 숫자가 있어야 합니다. (예: ITEM-001)');
|
||||
fn_openSequentialSnPopup();
|
||||
return;
|
||||
}
|
||||
|
||||
var prefix = match[1]; // 접두사
|
||||
var startNum = parseInt(match[2]); // 시작 숫자
|
||||
var numLength = match[2].length; // 숫자 자릿수
|
||||
|
||||
// 연속번호 생성
|
||||
var addedCount = 0;
|
||||
for(var i = 0; i < count; i++) {
|
||||
var currentNum = startNum + i;
|
||||
var paddedNum = String(currentNum).padStart(numLength, '0');
|
||||
var newSn = prefix + paddedNum;
|
||||
|
||||
// 중복 체크
|
||||
var isDuplicate = false;
|
||||
for(var j = 0; j < snList.length; j++) {
|
||||
if(snList[j].value == newSn) {
|
||||
isDuplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 중복이 아니면 추가
|
||||
if(!isDuplicate) {
|
||||
snList.push({
|
||||
id: snCounter++,
|
||||
value: newSn
|
||||
});
|
||||
addedCount++;
|
||||
}
|
||||
}
|
||||
|
||||
// S/N 목록 다시 열기
|
||||
$("#serialNoList").val(JSON.stringify(snList));
|
||||
fn_openSnManagePopup();
|
||||
}
|
||||
|
||||
// S/N 목록 확인 및 적용
|
||||
function fn_confirmSnList() {
|
||||
// snList를 JSON 문자열로 변환하여 hidden 필드에 저장
|
||||
$("#serialNoList").val(JSON.stringify(snList));
|
||||
|
||||
// 화면 표시 업데이트
|
||||
fn_updateSnDisplay();
|
||||
|
||||
// 팝업 닫기
|
||||
Swal.close();
|
||||
}
|
||||
|
||||
// S/N 팝업 닫기 (취소)
|
||||
function fn_closeSnPopup() {
|
||||
Swal.close();
|
||||
}
|
||||
|
||||
function fn_save() {
|
||||
// 체크박스 상태에 따라 출하지시 상태 값 설정
|
||||
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(',');
|
||||
}
|
||||
$("#serialNo").val(serialNoValue);
|
||||
|
||||
if(confirm("저장하시겠습니까?")) {
|
||||
$.ajax({
|
||||
url: "/salesMgmt/saveSales.do",
|
||||
@@ -53,6 +500,7 @@
|
||||
<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}" />
|
||||
<section>
|
||||
<div class="plm_menu_name">
|
||||
<h2>
|
||||
@@ -73,50 +521,108 @@
|
||||
<td colspan="4" style="height:15px;"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="serialNo">S/N</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="text" name="serialNo" id="serialNo" style="width:100%;" />
|
||||
<td class="input_title">
|
||||
<label for="isShippingOrder">출하지시</label>
|
||||
</td>
|
||||
<td class="input_title"><label for="shippingDate">* 출고일</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="text" id="shippingDate" name="shippingDate" required reqTitle="출고일" class="date_icon" style="width: 100px !important;background-color:#fff;" autocomplete="off" />
|
||||
<td class="input_sub_title" colspan="3">
|
||||
<input type="checkbox" name="isShippingOrderCheck" id="isShippingOrder"
|
||||
${saleInfo.SHIPPING_ORDER_STATUS == '출하지시' ? 'checked' : ''} />
|
||||
<input type="hidden" name="shippingOrderStatus" id="shippingOrderStatus"
|
||||
value="${saleInfo.SHIPPING_ORDER_STATUS != null ? saleInfo.SHIPPING_ORDER_STATUS : ''}" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="shippingMethod">출고방법</label></td>
|
||||
<td class="input_title"><label for="serialNo">S/N</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="shippingMethod" id="shippingMethod" type="select" style="width:100%;" class="select2">
|
||||
<input type="text" name="serialNo" id="serialNo"
|
||||
placeholder="클릭하여 S/N 추가"
|
||||
style="width:100%; cursor:pointer; background-color:#f8f9fa; color:#333 !important;"
|
||||
value="${saleInfo.SERIAL_NO}"
|
||||
readonly />
|
||||
</td>
|
||||
<td class="input_title"></td>
|
||||
<td class="input_sub_title"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="salesQuantity">판매수량</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="number" name="salesQuantity" id="salesQuantity" style="width:100%;" value="${saleInfo.SALES_QUANTITY}" onchange="fn_calculateSupplyPrice()" />
|
||||
</td>
|
||||
<td class="input_title"><label for="shippingDate">출하일</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="text" id="shippingDate" name="shippingDate" class="date_icon" style="width:100%; background-color:#fff;" value="${saleInfo.SHIPPING_DATE}" autocomplete="off" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="shippingMethod">출하방법</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="shippingMethod" id="shippingMethod" style="width:100%;" class="select2">
|
||||
<option value="">선택</option>
|
||||
<option value="D_D">내수/직납</option>
|
||||
<option value="D_P">내수/택배</option>
|
||||
<option value="D_E">내수/기타</option>
|
||||
<option value="E">수출</option>
|
||||
<option value="내수/직납" ${saleInfo.SHIPPING_METHOD == '내수/직납' ? 'selected' : ''}>내수/직납</option>
|
||||
<option value="내수/택배" ${saleInfo.SHIPPING_METHOD == '내수/택배' ? 'selected' : ''}>내수/택배</option>
|
||||
<option value="내수/기타" ${saleInfo.SHIPPING_METHOD == '내수/기타' ? 'selected' : ''}>내수/기타</option>
|
||||
<option value="수출" ${saleInfo.SHIPPING_METHOD == '수출' ? 'selected' : ''}>수출</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="manager">담당자</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="manager" id="manager" type="select" style="width:100%;" class="select2">
|
||||
<select name="manager" id="manager" style="width:100%;" class="select2">
|
||||
<option value="">선택</option>
|
||||
${codeMap.managerList}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="salesQuantity">판매수량</label></td>
|
||||
<td class="input_title"><label for="salesUnitPrice">판매단가</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="number" name="salesQuantity" id="salesQuantity" style="width:100%;" />
|
||||
<input type="number" name="salesUnitPrice" id="salesUnitPrice" style="width:100%;" value="${saleInfo.SALES_UNIT_PRICE}" onchange="fn_calculateSupplyPrice()" />
|
||||
</td>
|
||||
<td class="input_title"><label for="incoterms">인도조건</label></td>
|
||||
<td class="input_title"><label for="salesSupplyPrice">판매공급가액</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="incoterms" id="incoterms" type="select" style="width:100%;" class="select2">
|
||||
<input type="number" name="salesSupplyPrice" id="salesSupplyPrice" style="width:100%; background-color: #f0f0f0;" value="${saleInfo.SALES_SUPPLY_PRICE}" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="salesVat">판매부가세</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="number" name="salesVat" id="salesVat" style="width:100%; background-color: #f0f0f0;" value="${saleInfo.SALES_VAT}" readonly />
|
||||
</td>
|
||||
<td class="input_title"><label for="salesTotalAmount">판매총액</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="number" name="salesTotalAmount" id="salesTotalAmount" style="width:100%; background-color: #f0f0f0;" value="${saleInfo.SALES_TOTAL_AMOUNT}" readonly />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="salesCurrency">판매환종</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="salesCurrency" id="salesCurrency" style="width:100%;" class="select2" onchange="fn_recalculateByExchangeRate()">
|
||||
<option value="">선택</option>
|
||||
<option value="FOB">FOB</option>
|
||||
<option value="EXW">EXW</option>
|
||||
<option value="CIF">CIF</option>
|
||||
<option value="DDP">DDP</option>
|
||||
<option value="DAP">DAP</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>
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"><label for="salesExchangeRate">판매환율</label></td>
|
||||
<td class="input_sub_title">
|
||||
<input type="number" name="salesExchangeRate" id="salesExchangeRate" style="width:100%;" step="0.01" value="${saleInfo.SALES_EXCHANGE_RATE}" onchange="fn_recalculateByExchangeRate()" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="input_title"><label for="incoterms">인도조건</label></td>
|
||||
<td class="input_sub_title">
|
||||
<select name="incoterms" id="incoterms" style="width:100%;" class="select2">
|
||||
<option value="">선택</option>
|
||||
<option value="FOB" ${saleInfo.INCOTERMS == 'FOB' ? 'selected' : ''}>FOB</option>
|
||||
<option value="EXW" ${saleInfo.INCOTERMS == 'EXW' ? 'selected' : ''}>EXW</option>
|
||||
<option value="CIF" ${saleInfo.INCOTERMS == 'CIF' ? 'selected' : ''}>CIF</option>
|
||||
<option value="DDP" ${saleInfo.INCOTERMS == 'DDP' ? 'selected' : ''}>DDP</option>
|
||||
<option value="DAP" ${saleInfo.INCOTERMS == 'DAP' ? 'selected' : ''}>DAP</option>
|
||||
</select>
|
||||
</td>
|
||||
<td class="input_title"></td>
|
||||
<td class="input_sub_title"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="4" style="height:15px;"></td>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>();
|
||||
|
||||
// 담당자
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
39
tomcat-conf/server.xml
Normal file
39
tomcat-conf/server.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Server port="8005" shutdown="SHUTDOWN">
|
||||
<Listener className="org.apache.catalina.core.JasperListener" />
|
||||
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
|
||||
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
|
||||
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
|
||||
|
||||
<GlobalNamingResources>
|
||||
<Resource name="UserDatabase" auth="Container"
|
||||
type="org.apache.catalina.UserDatabase"
|
||||
description="User database that can be updated and saved"
|
||||
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
|
||||
pathname="conf/tomcat-users.xml" />
|
||||
</GlobalNamingResources>
|
||||
|
||||
<Service name="Catalina">
|
||||
<!-- URIEncoding을 UTF-8로 설정하여 한글 파라미터 처리 -->
|
||||
<Connector port="8080"
|
||||
protocol="HTTP/1.1"
|
||||
connectionTimeout="20000"
|
||||
redirectPort="8443"
|
||||
URIEncoding="UTF-8" />
|
||||
|
||||
<Engine name="Catalina" defaultHost="localhost">
|
||||
<Realm className="org.apache.catalina.realm.LockOutRealm">
|
||||
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
|
||||
resourceName="UserDatabase"/>
|
||||
</Realm>
|
||||
|
||||
<Host name="localhost" appBase="webapps"
|
||||
unpackWARs="true" autoDeploy="true">
|
||||
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
|
||||
prefix="localhost_access_log." suffix=".txt"
|
||||
pattern="%h %l %u %t "%r" %s %b" />
|
||||
</Host>
|
||||
</Engine>
|
||||
</Service>
|
||||
</Server>
|
||||
|
||||
Reference in New Issue
Block a user