xml변경사항커밋

This commit is contained in:
Johngreen
2025-10-21 09:55:19 +09:00
parent 3350bf5d07
commit bb5013a619
2 changed files with 765 additions and 193 deletions

View File

@@ -7362,16 +7362,20 @@ SELECT
,EST_USER_ID
,EST_COMP_DATE
,EST_RESULT_CD
,AREA_CD
,MECHANICAL_TYPE
,OVERHAUL_ORDER
,IS_TEMP
)
,AREA_CD
,MECHANICAL_TYPE
,OVERHAUL_ORDER
,IS_TEMP
,PART_OBJID
,PART_NO
,PART_NAME
,QUANTITY
)
(
SELECT
#{OBJID}
,#{objId}
,#{objId}
,CATEGORY_CD
,CUSTOMER_OBJID
,PRODUCT
@@ -7390,29 +7394,71 @@ SELECT
,CHG_USER_ID
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
<choose>
<when test="overhaul_project_no != null and overhaul_project_no !='' ">
,#{overhaul_project_no}<!-- || '_' || #{overhaul_order} -->
</when>
<otherwise>
,MECHANICAL_TYPE || '-' ||
<!--
(SELECT (SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1))::integer+1 FROM PROJECT_MGMT WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\' ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC LIMIT 1)
-->
(SELECT CASE
WHEN PROJECT_NO ~ '[-\s][0-9]+$'
THEN REGEXP_REPLACE(PROJECT_NO, '.*[-\s]([0-9]+)$', '\1')::integer+1
ELSE NULL
END AS extracted_number
FROM PROJECT_MGMT
WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\'
ORDER BY extracted_number DESC NULLS LAST
LIMIT 1)
</otherwise>
</choose>
<!-- ,#{project_no} -->
<!-- ,(SELECT TITLE FROM PMS_WBS_TEMPLATE PWT WHERE PWT.OBJID = #{mechanical_type}) || '-' || (SELECT (SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1))::integer+1 FROM PROJECT_MGMT ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC LIMIT 1) -->
,RESULT_CD
<!-- 기존 PROJECT_NO 자동생성 로직 (주석처리)
<choose>
<when test="overhaul_project_no != null and overhaul_project_no !='' ">
,#{overhaul_project_no}
</when>
<otherwise>
,MECHANICAL_TYPE || '-' ||
(SELECT CASE
WHEN PROJECT_NO ~ '[-\s][0-9]+$'
THEN REGEXP_REPLACE(PROJECT_NO, '.*[-\s]([0-9]+)$', '\1')::integer+1
ELSE NULL
END AS extracted_number
FROM PROJECT_MGMT
WHERE PROJECT_NO NOT LIKE '%\_%' ESCAPE '\'
ORDER BY extracted_number DESC NULLS LAST
LIMIT 1)
</otherwise>
</choose>
-->
<!-- 신규 PROJECT_NO 생성 로직: 주문유형-제품구분-날짜-순번 형식 (예: R-AS-250302-001) -->
,(
SELECT
-- 주문유형 코드 (CATEGORY_CD를 영문 약어로 매핑)
CASE CODE_NAME(CATEGORY_CD)
WHEN '오버홀' THEN 'O'
WHEN '개조' THEN 'M'
WHEN '개발' THEN 'D'
WHEN '견적' THEN 'Q'
WHEN '수리' THEN 'R'
WHEN '판매' THEN 'S'
ELSE 'T'
END || '-' ||
-- 제품구분 코드 (PRODUCT의 CODE_NAME에서 슬래시 제거)
REPLACE(CODE_NAME(PRODUCT), '/', '') || '-' ||
-- 날짜 (YYMMDD)
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-' ||
-- 순번 (001, 002, ...)
LPAD(
COALESCE(
(
SELECT MAX(SUBSTRING(PROJECT_NO FROM '\d{3}$')::INTEGER) + 1
FROM PROJECT_MGMT
WHERE PROJECT_NO LIKE
CASE CODE_NAME(CATEGORY_CD)
WHEN '오버홀' THEN 'O'
WHEN '개조' THEN 'M'
WHEN '개발' THEN 'D'
WHEN '견적' THEN 'Q'
WHEN '수리' THEN 'R'
WHEN '판매' THEN 'S'
ELSE 'T'
END || '-' ||
REPLACE(CODE_NAME(PRODUCT), '/', '') || '-' ||
TO_CHAR(CURRENT_DATE, 'YYMMDD') || '-%'
),
1
)::TEXT,
3,
'0'
)
FROM CONTRACT_MGMT
WHERE OBJID = #{objId}
)
,PM_USER_ID
,#{contract_price}
,#{contract_price_currency}
@@ -7437,12 +7483,16 @@ SELECT
,EST_USER_ID
,EST_COMP_DATE
,EST_RESULT_CD
,AREA_CD
,MECHANICAL_TYPE
,#{overhaul_order}
,#{is_temp}
FROM CONTRACT_MGMT
WHERE OBJID=#{objId}
,AREA_CD
,MECHANICAL_TYPE
,#{overhaul_order}
,#{is_temp}
,#{part_objid}
,#{part_no}
,#{part_name}
,#{quantity}
FROM CONTRACT_MGMT
WHERE OBJID=#{objId}
)
</insert>
@@ -7549,7 +7599,12 @@ SELECT
,REQ_DEL_DATE = #{req_del_date}
,CONTRACT_COMPANY = #{contract_company}
,MANUFACTURE_PLANT = #{manufacture_plant}
,PART_OBJID = #{part_objid}
,PART_NO = #{part_no}
,PART_NAME = #{part_name}
,QUANTITY = #{quantity}
WHERE CONTRACT_OBJID = #{objId}
AND PART_OBJID = #{part_objid}
</update>
<delete id="deleteProjectMngInfo" parameterType="map">

View File

@@ -463,8 +463,9 @@
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='contractMgmt01' AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='contractMgmt02' AND UPPER(STATUS) = 'ACTIVE') AS CU02_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='ORDER_DOC' AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT
<!-- ,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='contractMgmt01' AND UPPER(STATUS) = 'ACTIVE') AS CU01_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='contractMgmt02' AND UPPER(STATUS) = 'ACTIVE') AS CU02_CNT -->
,(CASE WHEN (RESULT_CD is null or RESULT_CD ='') and (SPEC_RESULT_CD is null or RESULT_CD ='') and (EST_RESULT_CD is null or RESULT_CD ='') then '0'
ELSE 1
END
@@ -477,6 +478,7 @@
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,ORDER_DATE
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
@@ -500,11 +502,6 @@
,EXCHANGE_RATE
,EST_PRICE
,EST_SUPPLY_PRICE
,ORDER_DATE
,ORDER_UNIT_PRICE
,ORDER_SUPPLY_PRICE
,ORDER_VAT
,ORDER_TOTAL_AMOUNT
,(SELECT COUNT(1) FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID) AS EST_STATUS
,(
SELECT IS_SEND
@@ -525,6 +522,66 @@
,A.APPR_STATUS
,A.APPROVAL_OBJID
,A.ROUTE_OBJID
,(SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID order by regdate desc limit 1) AS EST_OBJID
-- 최근 차수 견적서 합계 정보
,(SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT
,(SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT_KRW
-- 수주 합계 정보 (CONTRACT_MGMT 테이블에 저장된 값 사용)
,T.ORDER_SUPPLY_PRICE AS ORDER_SUPPLY_PRICE_SUM
,T.ORDER_VAT AS ORDER_VAT_SUM
,T.ORDER_TOTAL_AMOUNT AS ORDER_TOTAL_AMOUNT_SUM
,CASE
WHEN T.ORDER_TOTAL_AMOUNT IS NOT NULL AND T.ORDER_TOTAL_AMOUNT != ''
AND T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != ''
THEN CAST(T.ORDER_TOTAL_AMOUNT AS NUMERIC) * CAST(T.EXCHANGE_RATE AS NUMERIC)
ELSE 0
END AS ORDER_TOTAL_AMOUNT_KRW
-- 품목 정보 요약
,(
WITH item_info AS (
SELECT
COALESCE(PM.PART_NAME, CI.PART_NAME) AS PART_NAME,
COUNT(*) OVER() AS total_count,
ROW_NUMBER() OVER(ORDER BY CI.SEQ) AS rn
FROM CONTRACT_ITEM CI
LEFT JOIN PART_MNG PM ON CI.PART_OBJID = PM.OBJID
WHERE CI.CONTRACT_OBJID = T.OBJID
AND CI.STATUS = 'ACTIVE'
)
SELECT
CASE
WHEN total_count = 1 THEN PART_NAME
WHEN total_count > 1 THEN PART_NAME || ' 외 ' || (total_count - 1) || '건'
ELSE ''
END
FROM item_info
WHERE rn = 1
) AS ITEM_SUMMARY
,(
SELECT MIN(DUE_DATE)
FROM CONTRACT_ITEM
WHERE CONTRACT_OBJID = T.OBJID
AND STATUS = 'ACTIVE'
AND DUE_DATE IS NOT NULL
AND DUE_DATE != ''
) AS EARLIEST_DUE_DATE
,(
SELECT COUNT(*) - 1
FROM CONTRACT_ITEM
WHERE CONTRACT_OBJID = T.OBJID
AND STATUS = 'ACTIVE'
AND DUE_DATE IS NOT NULL
AND DUE_DATE != ''
) AS OTHER_DUE_DATE_COUNT
,(
SELECT RETURN_REASON
FROM CONTRACT_ITEM
WHERE CONTRACT_OBJID = T.OBJID
AND STATUS = 'ACTIVE'
AND RETURN_REASON IS NOT NULL
AND RETURN_REASON != ''
LIMIT 1
) AS RETURN_REASON_SUMMARY
FROM
CONTRACT_MGMT AS T
LEFT OUTER JOIN
@@ -564,7 +621,7 @@
A.OBJID = B.APPROVAL_OBJID
AND TARGET_TYPE IN ('CONTRACT_ESTIMATE')
) A
ON T.OBJID::numeric = A.TARGET_OBJID
ON (SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID order by regdate desc limit 1)::numeric = A.TARGET_OBJID
)
</sql>
@@ -698,12 +755,15 @@
AND PAID_TYPE = #{paid_type}
</if>
<if test="search_partNo != null and search_partNo != ''">
AND UPPER(PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
<if test="search_partName != null and search_partName != ''">
AND UPPER(PART_NAME) LIKE UPPER('%${search_partName}%')
<!-- 품번/품명 검색: PART_OBJID로 정확하게 검색 -->
<if test="search_partObjId != null and search_partObjId != ''">
AND EXISTS (
SELECT 1
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = T.OBJID
AND CI.STATUS = 'ACTIVE'
AND CI.PART_OBJID = #{search_partObjId}
)
</if>
<if test="search_serialNo != null and search_serialNo != ''">
@@ -723,17 +783,10 @@
<if test="due_end_date != null and !''.equals(due_end_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{due_end_date}, 'YYYY-MM-DD')
</if>
<if test="order_start_date != null and !''.equals(order_start_date)">
AND TO_DATE(RECEIPT_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{order_start_date}, 'YYYY-MM-DD')
</if>
<if test="due_end_date != null and !''.equals(due_end_date)">
AND TO_DATE(ORDER_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{due_end_date}, 'YYYY-MM-DD')
</if>
ORDER BY REGDATE DESC
</select>
<select id="contractList_bak" parameterType="map" resultType="map">
</select>
<select id="contractList_bak" parameterType="map" resultType="map">
SELECT *
FROM (
SELECT CONTRACT_MGMT.*,ROW_NUMBER() OVER (ORDER BY CONTRACT_NO DESC) AS RNUM
@@ -889,7 +942,9 @@
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CONTRACT_RESULT
,PROJECT_NAME
,SPEC_USER_ID
,SPEC_PLAN_DATE
@@ -910,8 +965,14 @@
,PART_NO
,PART_NAME
,SERIAL_NO
,QUANTITY
,CUSTOMER_REQUEST
,EXCHANGE_RATE
,ORDER_DATE
,ORDER_UNIT_PRICE
,ORDER_SUPPLY_PRICE
,ORDER_VAT
,ORDER_TOTAL_AMOUNT
)
VALUES
(
@@ -948,7 +1009,9 @@
,#{contract_del_date}
,#{contract_company}
,#{contract_date}
,#{po_no}
,#{manufacture_plant}
,#{contract_result}
,#{project_name}
,#{spec_user_id}
,#{spec_plan_date}
@@ -969,8 +1032,14 @@
,#{part_no}
,#{part_name}
,#{serial_no}
,#{quantity}
,#{customer_request}
,#{exchange_rate}
,#{order_date}
,#{unit_price}
,#{supply_price}
,#{vat}
,#{total_amount}
)
ON CONFLICT (OBJID) DO
UPDATE
@@ -1003,8 +1072,10 @@
,REQ_DEL_DATE = #{req_del_date}
,CONTRACT_DEL_DATE = #{contract_del_date}
,CONTRACT_COMPANY = #{contract_company}
,CONTRACT_DATE = #{contract_date}
,CONTRACT_DATE = #{contract_date}
,PO_NO = #{po_no}
,MANUFACTURE_PLANT = #{manufacture_plant}
,CONTRACT_RESULT = #{contract_result}
,PROJECT_NAME = #{project_name}
,SPEC_USER_ID = #{spec_user_id}
,SPEC_PLAN_DATE = #{spec_plan_date}
@@ -1025,8 +1096,14 @@
,PART_NO = #{part_no}
,PART_NAME = #{part_name}
,SERIAL_NO = #{serial_no}
,QUANTITY = #{quantity}
,CUSTOMER_REQUEST = #{customer_request}
,EXCHANGE_RATE = #{exchange_rate}
,ORDER_DATE = #{order_date}
,ORDER_UNIT_PRICE = #{unit_price}
,ORDER_SUPPLY_PRICE = #{supply_price}
,ORDER_VAT = #{vat}
,ORDER_TOTAL_AMOUNT = #{total_amount}
</update>
<update id="saveContractMgmtInfo_old" parameterType="map">
@@ -3023,7 +3100,8 @@ SELECT
,#{writer}
FROM PMS_WBS_TASK_STANDARD AS T LEFT JOIN PMS_WBS_TEMPLATE AS T1
ON T.PARENT_OBJID = T1.OBJID
WHERE T1.TITLE=#{mechanical_type}
WHERE T1.OBJID = '1662715267'
<!-- WHERE T1.TITLE=#{mechanical_type} -->
<!-- WHERE T1.OBJID=#{mechanical_type} -->
<!-- WHERE T1.PRODUCT_OBJID=#{product} -->
)
@@ -3393,6 +3471,20 @@ ORDER BY ASM.SUPPLY_NAME
limit 1
</select>
<!-- 품목별 프로젝트 조회 (PART_OBJID 기준) -->
<select id="getProjectListByContractAndPartObjid" parameterType="map" resultType="map">
SELECT
PROJECT_NAME,
PART_OBJID,
PART_NO,
PART_NAME
FROM
PROJECT_MGMT
WHERE CONTRACT_OBJID = #{contractObjId}
AND PART_OBJID = #{part_objid}
LIMIT 1
</select>
<select id="overlapOrder" parameterType="map" resultType="map">
SELECT
T.*
@@ -3737,86 +3829,147 @@ ORDER BY ASM.SUPPLY_NAME
<!-- 견적서 템플릿 목록 조회 (CONTRACT_OBJID 기준) -->
<select id="getEstimateTemplateList" parameterType="map" resultType="map">
SELECT
OBJID AS "OBJID",
CONTRACT_OBJID AS "CONTRACT_OBJID",
TEMPLATE_TYPE AS "TEMPLATE_TYPE",
ET.OBJID AS "OBJID",
ET.CONTRACT_OBJID AS "CONTRACT_OBJID",
ET.TEMPLATE_TYPE AS "TEMPLATE_TYPE",
CASE
WHEN TEMPLATE_TYPE = '1' THEN '일반 견적서'
WHEN TEMPLATE_TYPE = '2' THEN '장비 견적서'
ELSE TEMPLATE_TYPE
WHEN ET.TEMPLATE_TYPE = '1' THEN '일반 견적서'
WHEN ET.TEMPLATE_TYPE = '2' THEN '장비 견적서'
ELSE ET.TEMPLATE_TYPE
END AS "TEMPLATE_TYPE_NAME",
ESTIMATE_NO AS "ESTIMATE_NO",
WRITER AS "WRITER",
TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') AS "REGDATE",
CHG_USER_ID AS "CHG_USER_ID",
TO_CHAR(CHGDATE, 'YYYY-MM-DD HH24:MI') AS "CHGDATE",
ROW_NUMBER() OVER (PARTITION BY TEMPLATE_TYPE ORDER BY REGDATE) AS "REVISION"
ET.ESTIMATE_NO AS "ESTIMATE_NO",
ET.WRITER AS "WRITER",
TO_CHAR(ET.REGDATE, 'YYYY-MM-DD HH24:MI') AS "REGDATE",
ET.CHG_USER_ID AS "CHG_USER_ID",
TO_CHAR(ET.CHGDATE, 'YYYY-MM-DD HH24:MI') AS "CHGDATE",
ROW_NUMBER() OVER (PARTITION BY ET.TEMPLATE_TYPE ORDER BY ET.REGDATE) AS "REVISION",
COALESCE(
(SELECT CASE
WHEN A.STATUS = 'complete' THEN '결재완료'
WHEN A.STATUS = 'cancel' THEN '취소'
WHEN A.STATUS = 'reject' THEN '반려'
WHEN A.STATUS = 'inProcess' THEN '결재중'
ELSE '작성중'
END
FROM APPROVAL A
WHERE A.TARGET_OBJID::VARCHAR = ET.OBJID
AND A.TARGET_TYPE = 'CONTRACT_ESTIMATE'
ORDER BY A.REGDATE DESC
LIMIT 1),
'작성중'
) AS "APPR_STATUS"
FROM
ESTIMATE_TEMPLATE
ESTIMATE_TEMPLATE ET
WHERE
CONTRACT_OBJID = #{objId}
ORDER BY TEMPLATE_TYPE, REGDATE DESC
ET.CONTRACT_OBJID = #{objId}
ORDER BY ET.TEMPLATE_TYPE, ET.REGDATE DESC
</select>
<!-- 견적서 템플릿 데이터 조회 (ESTIMATE_TEMPLATE 테이블) -->
<select id="getEstimateTemplateData" parameterType="map" resultType="map">
SELECT
OBJID,
CONTRACT_OBJID,
TEMPLATE_TYPE,
EXECUTOR,
RECIPIENT,
ESTIMATE_NO,
CONTACT_PERSON,
GREETING_TEXT,
MODEL_NAME,
MODEL_CODE,
EXECUTOR_DATE,
NOTE1,
NOTE2,
NOTE3,
NOTE4,
WRITER,
REGDATE,
CHG_USER_ID,
CHGDATE
ET.OBJID,
ET.CONTRACT_OBJID,
ET.TEMPLATE_TYPE,
ET.EXECUTOR,
ET.RECIPIENT,
ET.ESTIMATE_NO,
ET.CONTACT_PERSON,
ET.GREETING_TEXT,
ET.MODEL_NAME,
ET.MODEL_CODE,
ET.EXECUTOR_DATE,
ET.NOTE1,
ET.NOTE2,
ET.NOTE3,
ET.NOTE4,
ET.NOTE_REMARKS,
ET.TOTAL_AMOUNT,
ET.TOTAL_AMOUNT_KRW,
ET.MANAGER_NAME,
ET.MANAGER_CONTACT,
ET.WRITER,
ET.REGDATE,
ET.CHG_USER_ID,
ET.CHGDATE,
CM.EXCHANGE_RATE,
CODE_NAME(CM.CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME,
COALESCE(
(SELECT CASE
WHEN A.STATUS = 'complete' THEN '결재완료'
WHEN A.STATUS = 'cancel' THEN '취소'
WHEN A.STATUS = 'reject' THEN '반려'
WHEN A.STATUS = 'inProcess' THEN '결재중'
ELSE '작성중'
END
FROM APPROVAL A
WHERE A.TARGET_OBJID::VARCHAR = ET.OBJID
AND A.TARGET_TYPE = 'CONTRACT_ESTIMATE'
ORDER BY A.REGDATE DESC
LIMIT 1),
'작성중'
) AS APPR_STATUS
FROM
ESTIMATE_TEMPLATE
ESTIMATE_TEMPLATE ET
LEFT JOIN CONTRACT_MGMT CM ON ET.CONTRACT_OBJID = CM.OBJID
WHERE
CONTRACT_OBJID = #{objId}
<if test="template_type != null and template_type != ''">
AND TEMPLATE_TYPE = #{template_type}
</if>
ORDER BY REGDATE DESC
LIMIT 1
ET.CONTRACT_OBJID = #{objId}
<if test="template_type != null and template_type != ''">
AND ET.TEMPLATE_TYPE = #{template_type}
</if>
ORDER BY ET.REGDATE DESC
LIMIT 1
</select>
<!-- 견적서 템플릿 데이터 조회 (OBJID 기준) -->
<select id="getEstimateTemplateByObjId" parameterType="map" resultType="map">
SELECT
OBJID,
CONTRACT_OBJID,
TEMPLATE_TYPE,
EXECUTOR,
RECIPIENT,
ESTIMATE_NO,
CONTACT_PERSON,
GREETING_TEXT,
MODEL_NAME,
MODEL_CODE,
EXECUTOR_DATE,
NOTE1,
NOTE2,
NOTE3,
NOTE4,
WRITER,
TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') AS REGDATE,
CHG_USER_ID,
TO_CHAR(CHGDATE, 'YYYY-MM-DD HH24:MI') AS CHGDATE
ET.OBJID,
ET.CONTRACT_OBJID,
ET.TEMPLATE_TYPE,
ET.EXECUTOR,
ET.RECIPIENT,
ET.ESTIMATE_NO,
ET.CONTACT_PERSON,
ET.GREETING_TEXT,
ET.MODEL_NAME,
ET.MODEL_CODE,
ET.EXECUTOR_DATE,
ET.NOTE1,
ET.NOTE2,
ET.NOTE3,
ET.NOTE4,
ET.NOTE_REMARKS,
ET.TOTAL_AMOUNT,
ET.TOTAL_AMOUNT_KRW,
ET.MANAGER_NAME,
ET.MANAGER_CONTACT,
ET.WRITER,
TO_CHAR(ET.REGDATE, 'YYYY-MM-DD HH24:MI') AS REGDATE,
ET.CHG_USER_ID,
TO_CHAR(ET.CHGDATE, 'YYYY-MM-DD HH24:MI') AS CHGDATE,
CM.EXCHANGE_RATE,
CODE_NAME(CM.CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME,
COALESCE(
(SELECT CASE
WHEN A.STATUS = 'complete' THEN '결재완료'
WHEN A.STATUS = 'cancel' THEN '취소'
WHEN A.STATUS = 'reject' THEN '반려'
WHEN A.STATUS = 'inProcess' THEN '결재중'
ELSE '작성중'
END
FROM APPROVAL A
WHERE A.TARGET_OBJID::VARCHAR = ET.OBJID
AND A.TARGET_TYPE = 'CONTRACT_ESTIMATE'
ORDER BY A.REGDATE DESC
LIMIT 1),
'작성중'
) AS APPR_STATUS
FROM
ESTIMATE_TEMPLATE
ESTIMATE_TEMPLATE ET
LEFT JOIN CONTRACT_MGMT CM ON ET.CONTRACT_OBJID = CM.OBJID
WHERE
OBJID = #{templateObjId}
ET.OBJID = #{templateObjId}
</select>
<!-- 견적서 템플릿 품목 조회 (TEMPLATE_OBJID 기준) -->
@@ -3881,35 +4034,45 @@ ORDER BY ASM.SUPPLY_NAME
MODEL_NAME,
MODEL_CODE,
EXECUTOR_DATE,
NOTE1,
NOTE2,
NOTE3,
NOTE4,
WRITER,
REGDATE,
CHG_USER_ID,
CHGDATE
) VALUES (
#{template_objid},
#{objId},
#{template_type},
#{executor},
#{recipient},
#{estimate_no},
#{contact_person},
#{greeting_text},
#{model_name},
#{model_code},
#{executor_date},
#{note1},
#{note2},
#{note3},
#{note4},
#{writer},
NOW(),
#{chg_user_id},
NOW()
)
NOTE1,
NOTE2,
NOTE3,
NOTE4,
NOTE_REMARKS,
TOTAL_AMOUNT,
TOTAL_AMOUNT_KRW,
MANAGER_NAME,
MANAGER_CONTACT,
WRITER,
REGDATE,
CHG_USER_ID,
CHGDATE
) VALUES (
#{template_objid},
#{objId},
#{template_type},
#{executor},
#{recipient},
#{estimate_no},
#{contact_person},
#{greeting_text},
#{model_name},
#{model_code},
#{executor_date},
#{note1},
#{note2},
#{note3},
#{note4},
#{note_remarks},
#{total_amount},
#{total_amount_krw},
#{manager_name},
#{manager_contact},
#{writer},
NOW(),
#{chg_user_id},
NOW()
)
</insert>
<!-- 견적서 템플릿 수정 -->
@@ -3924,14 +4087,19 @@ ORDER BY ASM.SUPPLY_NAME
MODEL_NAME = #{model_name},
MODEL_CODE = #{model_code},
EXECUTOR_DATE = #{executor_date},
NOTE1 = #{note1},
NOTE2 = #{note2},
NOTE3 = #{note3},
NOTE4 = #{note4},
CHG_USER_ID = #{chg_user_id},
CHGDATE = NOW()
WHERE
OBJID = #{template_objid}
NOTE1 = #{note1},
NOTE2 = #{note2},
NOTE3 = #{note3},
NOTE4 = #{note4},
NOTE_REMARKS = #{note_remarks},
TOTAL_AMOUNT = #{total_amount},
TOTAL_AMOUNT_KRW = #{total_amount_krw},
MANAGER_NAME = #{manager_name},
MANAGER_CONTACT = #{manager_contact},
CHG_USER_ID = #{chg_user_id},
CHGDATE = NOW()
WHERE
OBJID = #{template_objid}
</update>
<!-- 견적서 템플릿 품목 삭제 -->
@@ -3992,33 +4160,41 @@ ORDER BY ASM.SUPPLY_NAME
<!-- 최종 차수 견적서 조회 (메일 발송용) -->
<select id="getLatestEstimateTemplate" parameterType="map" resultType="map">
SELECT
OBJID AS "OBJID",
CONTRACT_OBJID AS "CONTRACT_OBJID",
TEMPLATE_TYPE AS "TEMPLATE_TYPE",
EXECUTOR AS "EXECUTOR",
RECIPIENT AS "RECIPIENT",
ESTIMATE_NO AS "ESTIMATE_NO",
CONTACT_PERSON AS "CONTACT_PERSON",
GREETING_TEXT AS "GREETING_TEXT",
MODEL_NAME AS "MODEL_NAME",
MODEL_CODE AS "MODEL_CODE",
EXECUTOR_DATE AS "EXECUTOR_DATE",
NOTE1 AS "NOTE1",
NOTE2 AS "NOTE2",
NOTE3 AS "NOTE3",
NOTE4 AS "NOTE4",
WRITER AS "WRITER",
TO_CHAR(REGDATE, 'YYYY-MM-DD HH24:MI') AS "REGDATE",
CHG_USER_ID AS "CHG_USER_ID",
TO_CHAR(CHGDATE, 'YYYY-MM-DD HH24:MI') AS "CHGDATE",
CATEGORIES_JSON AS "CATEGORIES_JSON"
FROM
ESTIMATE_TEMPLATE
WHERE
CONTRACT_OBJID = #{objId}
ET.OBJID AS "OBJID",
ET.CONTRACT_OBJID AS "CONTRACT_OBJID",
ET.TEMPLATE_TYPE AS "TEMPLATE_TYPE",
ET.EXECUTOR AS "EXECUTOR",
ET.RECIPIENT AS "RECIPIENT",
ET.ESTIMATE_NO AS "ESTIMATE_NO",
ET.CONTACT_PERSON AS "CONTACT_PERSON",
ET.GREETING_TEXT AS "GREETING_TEXT",
ET.MODEL_NAME AS "MODEL_NAME",
ET.MODEL_CODE AS "MODEL_CODE",
ET.EXECUTOR_DATE AS "EXECUTOR_DATE",
ET.NOTE1 AS "NOTE1",
ET.NOTE2 AS "NOTE2",
ET.NOTE3 AS "NOTE3",
ET.NOTE4 AS "NOTE4",
ET.NOTE_REMARKS AS "NOTE_REMARKS",
ET.TOTAL_AMOUNT AS "TOTAL_AMOUNT",
ET.TOTAL_AMOUNT_KRW AS "TOTAL_AMOUNT_KRW",
ET.MANAGER_NAME AS "MANAGER_NAME",
ET.MANAGER_CONTACT AS "MANAGER_CONTACT",
ET.WRITER AS "WRITER",
TO_CHAR(ET.REGDATE, 'YYYY-MM-DD HH24:MI') AS "REGDATE",
ET.CHG_USER_ID AS "CHG_USER_ID",
TO_CHAR(ET.CHGDATE, 'YYYY-MM-DD HH24:MI') AS "CHGDATE",
ET.CATEGORIES_JSON AS "CATEGORIES_JSON",
CM.EXCHANGE_RATE AS "EXCHANGE_RATE",
CODE_NAME(CM.CONTRACT_CURRENCY) AS "CONTRACT_CURRENCY_NAME"
FROM
ESTIMATE_TEMPLATE ET
LEFT JOIN CONTRACT_MGMT CM ON ET.CONTRACT_OBJID = CM.OBJID
WHERE
ET.CONTRACT_OBJID = #{objId}
ORDER BY
TEMPLATE_TYPE,
REGDATE DESC
ET.TEMPLATE_TYPE,
ET.REGDATE DESC
LIMIT 1
</select>
@@ -4181,13 +4357,354 @@ ORDER BY ASM.SUPPLY_NAME
CONTRACT_RESULT = #{contract_result},
PO_NO = #{po_no},
ORDER_DATE = #{order_date},
QUANTITY = #{quantity},
ORDER_UNIT_PRICE = #{unit_price},
ORDER_SUPPLY_PRICE = #{supply_price},
ORDER_VAT = #{vat},
ORDER_TOTAL_AMOUNT = #{total_amount},
CONTRACT_CURRENCY = #{contract_currency},
EXCHANGE_RATE = #{exchange_rate}
WHERE OBJID = #{contractObjId}
EXCHANGE_RATE = #{exchange_rate},
ORDER_SUPPLY_PRICE = #{order_supply_price},
ORDER_VAT = #{order_vat},
ORDER_TOTAL_AMOUNT = #{order_total_amount}
WHERE OBJID = #{objId}
</update>
<!-- 계약 품목 조회 -->
<select id="getContractItems" parameterType="map" resultType="map">
SELECT
CI.OBJID,
CI.CONTRACT_OBJID,
CI.PART_OBJID,
COALESCE(PM.PART_NO, CI.PART_NO) AS PART_NO,
COALESCE(PM.PART_NAME, CI.PART_NAME) AS PART_NAME,
STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SEQ) AS SERIAL_NO,
CI.QUANTITY,
CI.DUE_DATE,
CI.CUSTOMER_REQUEST,
CI.RETURN_REASON,
CI.ORDER_QUANTITY,
CI.ORDER_UNIT_PRICE,
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT
FROM
CONTRACT_ITEM CI
LEFT JOIN PART_MNG PM ON CI.PART_OBJID = PM.OBJID
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID AND CIS.STATUS = 'ACTIVE'
WHERE
CI.CONTRACT_OBJID = #{contractObjId}
AND CI.STATUS = 'ACTIVE'
GROUP BY
CI.OBJID,
CI.CONTRACT_OBJID,
CI.PART_OBJID,
CI.SEQ,
PM.PART_NO,
PM.PART_NAME,
CI.PART_NO,
CI.PART_NAME,
CI.QUANTITY,
CI.DUE_DATE,
CI.CUSTOMER_REQUEST,
CI.RETURN_REASON,
CI.ORDER_QUANTITY,
CI.ORDER_UNIT_PRICE,
CI.ORDER_SUPPLY_PRICE,
CI.ORDER_VAT,
CI.ORDER_TOTAL_AMOUNT
ORDER BY CI.SEQ
</select>
<!-- 계약 품목별 수주 정보 업데이트 (단일 품목) -->
<update id="updateContractItemOrderInfo" parameterType="map">
UPDATE CONTRACT_ITEM
SET
ORDER_QUANTITY = #{orderQuantity},
ORDER_UNIT_PRICE = #{orderUnitPrice},
ORDER_SUPPLY_PRICE = #{orderSupplyPrice},
ORDER_VAT = #{orderVat},
ORDER_TOTAL_AMOUNT = #{orderTotalAmount}
WHERE OBJID = #{contractItemObjId}
</update>
<!-- ====================================
품목 관리 쿼리
==================================== -->
<!-- 품번 목록 조회 (is_last = 1) -->
<select id="getPartList" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC
FROM
PART_MNG
WHERE
IS_LAST = '1'
AND STATUS = 'release'
ORDER BY
PART_NO
</select>
<!-- 품번 검색 (AJAX용 - 검색어 기반 또는 OBJID 기반) -->
<select id="searchPartList" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC
FROM
PART_MNG
WHERE
IS_LAST = '1'
AND STATUS = 'release'
<if test="partObjId != null and partObjId != ''">
AND OBJID = #{partObjId}
</if>
<if test="searchTerm != null and searchTerm != ''">
AND (
UPPER(PART_NO) LIKE '%' || UPPER(#{searchTerm}) || '%'
OR UPPER(PART_NAME) LIKE '%' || UPPER(#{searchTerm}) || '%'
)
</if>
ORDER BY
PART_NO
LIMIT 100
</select>
<!-- 품목 저장 -->
<insert id="insertContractItem" parameterType="map">
INSERT INTO CONTRACT_ITEM (
OBJID,
CONTRACT_OBJID,
SEQ,
PART_OBJID,
PART_NO,
PART_NAME,
QUANTITY,
DUE_DATE,
CUSTOMER_REQUEST,
RETURN_REASON,
REGDATE,
WRITER,
STATUS
) VALUES (
#{objId},
#{contractObjId},
#{seq},
#{partObjId},
#{partNo},
#{partName},
#{quantity},
#{dueDate},
#{customerRequest},
#{returnReason},
NOW(),
#{writer},
'ACTIVE'
)
</insert>
<!-- 품목별 S/N 저장 -->
<insert id="insertContractItemSerial" parameterType="map">
INSERT INTO CONTRACT_ITEM_SERIAL (
OBJID,
ITEM_OBJID,
SEQ,
SERIAL_NO,
REGDATE,
WRITER,
STATUS
) VALUES (
#{objId},
#{itemObjId},
#{seq},
#{serialNo},
NOW(),
#{writer},
'ACTIVE'
)
</insert>
<!-- 견적의 품목 목록 조회 -->
<select id="getContractItemList" parameterType="map" resultType="map">
SELECT
CI.OBJID,
CI.CONTRACT_OBJID,
CI.SEQ,
CI.PART_OBJID,
CI.PART_NO,
CI.PART_NAME,
CI.QUANTITY,
CI.DUE_DATE,
CI.CUSTOMER_REQUEST,
CI.RETURN_REASON,
CI.REGDATE,
CI.WRITER,
STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SEQ) AS SERIAL_NOS,
COUNT(CIS.OBJID) AS SERIAL_COUNT
FROM
CONTRACT_ITEM CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS
ON CI.OBJID = CIS.ITEM_OBJID
AND CIS.STATUS = 'ACTIVE'
WHERE
CI.CONTRACT_OBJID = #{contractObjId}
AND CI.STATUS = 'ACTIVE'
GROUP BY
CI.OBJID,
CI.CONTRACT_OBJID,
CI.SEQ,
CI.PART_OBJID,
CI.PART_NO,
CI.PART_NAME,
CI.QUANTITY,
CI.DUE_DATE,
CI.CUSTOMER_REQUEST,
CI.REGDATE,
CI.WRITER
ORDER BY
CI.SEQ
</select>
<!-- 품목의 S/N 목록 조회 -->
<select id="getContractItemSerialList" parameterType="map" resultType="map">
SELECT
OBJID,
ITEM_OBJID,
SEQ,
SERIAL_NO,
REGDATE,
WRITER
FROM
CONTRACT_ITEM_SERIAL
WHERE
ITEM_OBJID = #{itemObjId}
AND STATUS = 'ACTIVE'
ORDER BY
SEQ
</select>
<!-- 품목 UPSERT (INSERT or UPDATE) -->
<insert id="upsertContractItem" parameterType="map">
INSERT INTO CONTRACT_ITEM (
OBJID,
CONTRACT_OBJID,
SEQ,
PART_OBJID,
PART_NO,
PART_NAME,
QUANTITY,
DUE_DATE,
CUSTOMER_REQUEST,
RETURN_REASON,
REGDATE,
WRITER,
STATUS
) VALUES (
#{objId},
#{contractObjId},
#{seq},
#{partObjId},
#{partNo},
#{partName},
#{quantity},
#{dueDate},
#{customerRequest},
#{returnReason},
NOW(),
#{writer},
'ACTIVE'
)
ON CONFLICT (OBJID) DO UPDATE
SET
SEQ = #{seq},
PART_OBJID = #{partObjId},
PART_NO = #{partNo},
PART_NAME = #{partName},
QUANTITY = #{quantity},
DUE_DATE = #{dueDate},
CUSTOMER_REQUEST = #{customerRequest},
RETURN_REASON = #{returnReason},
CHGDATE = NOW(),
CHG_USER_ID = #{writer},
STATUS = 'ACTIVE'
</insert>
<!-- S/N UPSERT (INSERT or UPDATE) -->
<insert id="upsertContractItemSerial" parameterType="map">
INSERT INTO CONTRACT_ITEM_SERIAL (
OBJID,
ITEM_OBJID,
SEQ,
SERIAL_NO,
REGDATE,
WRITER,
STATUS
) VALUES (
#{objId},
#{itemObjId},
#{seq},
#{serialNo},
NOW(),
#{writer},
'ACTIVE'
)
ON CONFLICT (ITEM_OBJID, SERIAL_NO) DO UPDATE
SET
SEQ = #{seq},
STATUS = 'ACTIVE'
</insert>
<!-- 프론트에서 전달되지 않은 품목들 INACTIVE 처리 -->
<update id="inactivateRemovedItems" parameterType="map">
UPDATE CONTRACT_ITEM
SET STATUS = 'INACTIVE',
CHGDATE = NOW(),
CHG_USER_ID = #{userId}
WHERE CONTRACT_OBJID = #{contractObjId}
AND STATUS = 'ACTIVE'
<if test="currentItemObjIds != null and currentItemObjIds.size() > 0">
AND OBJID NOT IN
<foreach collection="currentItemObjIds" item="objId" open="(" separator="," close=")">
#{objId}
</foreach>
</if>
</update>
<!-- 견적의 품목 전체 삭제 (상태 변경) - 기존 방식, 호환성 유지 -->
<update id="deleteContractItems" parameterType="map">
UPDATE CONTRACT_ITEM
SET STATUS = 'INACTIVE',
CHGDATE = NOW(),
CHG_USER_ID = #{userId}
WHERE CONTRACT_OBJID = #{contractObjId}
AND STATUS = 'ACTIVE'
</update>
<!-- 품목의 S/N 전체 삭제 (상태 변경) -->
<update id="deleteContractItemSerials" parameterType="map">
UPDATE CONTRACT_ITEM_SERIAL
SET STATUS = 'INACTIVE'
WHERE ITEM_OBJID IN (
SELECT OBJID
FROM CONTRACT_ITEM
WHERE CONTRACT_OBJID = #{contractObjId}
AND STATUS = 'ACTIVE'
)
</update>
<!-- 특정 품목 삭제 (상태 변경) -->
<update id="deleteContractItem" parameterType="map">
UPDATE CONTRACT_ITEM
SET STATUS = 'INACTIVE',
CHGDATE = NOW(),
CHG_USER_ID = #{userId}
WHERE OBJID = #{itemObjId}
</update>
<!-- 특정 품목의 S/N 전체 삭제 -->
<update id="deleteItemSerials" parameterType="map">
UPDATE CONTRACT_ITEM_SERIAL
SET STATUS = 'INACTIVE'
WHERE ITEM_OBJID = #{itemObjId}
</update>
</mapper>