Merge pull request 'V20260210' (#150) from V20260210 into main

Reviewed-on: #150
This commit was merged in pull request #150.
This commit is contained in:
2026-02-25 05:15:33 +00:00
11 changed files with 511 additions and 1717 deletions

View File

@@ -9383,7 +9383,7 @@ SELECT
<!-- 소재 관리 쿼리 -->
<!-- 소재 목록 조회 (전체) -->
<select id="getMaterialList_old" parameterType="map" resultType="map">
<select id="getMaterialList" parameterType="map" resultType="map">
SELECT
OBJID,
MATERIAL_CODE,
@@ -9394,21 +9394,8 @@ SELECT
ORDER BY MATERIAL_CODE
</select>
<select id="getMaterialList" parameterType="map" resultType="map">
select
OBJID,
PART_NAME as MATERIAL_CODE,
-- MATERIAL_NAME,
STATUS
from
PART_MNG
WHERE STATUS = 'release'
AND ODRFG = '2'
ORDER BY PART_NAME
</select>
<!-- 특정 소재의 사이즈 목록 조회 -->
<select id="getMaterialSizes_old" parameterType="map" resultType="map">
<select id="getMaterialSizes" parameterType="map" resultType="map">
SELECT
OBJID,
MATERIAL_CODE,
@@ -9420,21 +9407,8 @@ ORDER BY PART_NAME
ORDER BY SIZE_SPEC
</select>
<select id="getMaterialSizes" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NAME as MATERIAL_CODE,
SPEC as SIZE_SPEC,
PART_NO AS MATERIAL_PART_NO
FROM PART_MNG
WHERE PART_NAME = #{materialCode}
AND STATUS = 'release'
AND ODRFG = '2'
ORDER BY SPEC
</select>
<!-- 소재 코드 + 사이즈로 소재품번 조회 -->
<select id="getMaterialPartNo_old" parameterType="map" resultType="map">
<select id="getMaterialPartNo" parameterType="map" resultType="map">
SELECT
OBJID,
MATERIAL_CODE,
@@ -9448,22 +9422,6 @@ ORDER BY PART_NAME
LIMIT 1
</select>
<select id="getMaterialPartNo" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NAME as MATERIAL_CODE,
SPEC as SIZE_SPEC,
PART_NO as MATERIAL_PART_NO,
(select COALESCE(NULLIF(UNIT_QTY, '')::numeric, 0) from part_mng as o where o.part_no = #{PART_NO}) AS UNIT_QTY,
COALESCE(NULLIF(UNIT_LENGTH, '')::numeric, 0) AS UNIT_LENGTH
FROM PART_MNG
WHERE PART_NAME = #{materialCode}
AND SPEC = #{sizeSpec}
AND STATUS = 'release'
AND ODRFG = '2'
LIMIT 1
</select>
<!-- 공급업체 담당자 목록 조회 (발주서 메일 발송용) -->
<select id="getSupplyManagerList" parameterType="map" resultType="map">
SELECT
@@ -9570,71 +9528,4 @@ ORDER BY PART_NAME
WHERE OBJID = #{objid}
</delete>
<!-- 계정과목 목록 조회 -->
<select id="getAcctCodeList" parameterType="map" resultType="map">
SELECT *
FROM (
SELECT A.*, ROW_NUMBER() OVER (ORDER BY ACCT_CD ASC) RNUM
FROM (
SELECT CO_CD
, ACCT_CD
, ACCT_NM
, DRCR_FG
, CASE WHEN DRCR_FG = '1' THEN '차변' WHEN DRCR_FG = '2' THEN '대변' ELSE DRCR_FG END AS DRCR_FG_NM
, SUB_DISP
, SUB_DISP_NM
, CH_FG
, CH_FG_NM
, ACCT_NMK
, GROUP_CD
, GROUP_NM
, BUD_FG
, BUD_FG_NM
, ATTR_FG
, ATTR_FG_NM
, CTRL_CDS
, RACCT_CD
, RACCT_NM
FROM ERP_ACCT_CODE
WHERE 1=1
<if test="search_acctCd != null and !''.equals(search_acctCd)">
AND UPPER(ACCT_CD) LIKE UPPER('%${search_acctCd}%')
</if>
<if test="search_acctNm != null and !''.equals(search_acctNm)">
AND UPPER(ACCT_NM) LIKE UPPER('%${search_acctNm}%')
</if>
<if test="search_chFg != null and !''.equals(search_chFg)">
AND CH_FG = #{search_chFg}
</if>
) A
WHERE 1=1
) A
WHERE 1=1
AND <![CDATA[ RNUM::integer <= #{PAGE_END}::integer ]]>
AND <![CDATA[ RNUM::integer >= #{PAGE_START}::integer]]>
</select>
<!-- 계정과목 목록 COUNT -->
<select id="getAcctCodeListCnt" parameterType="map" resultType="map">
SELECT
CEIL(TOTAL_CNT/#{COUNT_PER_PAGE})::numeric::integer AS MAX_PAGE_SIZE,
TOTAL_CNT::numeric
FROM (
SELECT
COUNT(1)::float TOTAL_CNT
FROM ERP_ACCT_CODE
WHERE 1=1
<if test="search_acctCd != null and !''.equals(search_acctCd)">
AND UPPER(ACCT_CD) LIKE UPPER('%${search_acctCd}%')
</if>
<if test="search_acctNm != null and !''.equals(search_acctNm)">
AND UPPER(ACCT_NM) LIKE UPPER('%${search_acctNm}%')
</if>
<if test="search_chFg != null and !''.equals(search_chFg)">
AND CH_FG = #{search_chFg}
</if>
) A
WHERE 1=1
</select>
</mapper>

View File

@@ -603,156 +603,7 @@
SELECT
CONTRACT_OBJID
FROM ESTIMATE_TEMPLATE
WHERE OBJID::VARCHAR = #{estObjId}
WHERE OBJID = #{estObjId}::NUMERIC
</select>
<!-- =====================================================
Amaranth10 전자결재 SSO 연동 관련 SQL
[사전 작업] 아래 DDL을 DB에서 실행해야 합니다:
CREATE TABLE IF NOT EXISTS AMARANTH_APPROVAL (
OBJID SERIAL PRIMARY KEY,
APPRO_KEY VARCHAR(100) NOT NULL,
TARGET_TYPE VARCHAR(50),
TARGET_OBJID VARCHAR(50),
APPROVAL_TITLE VARCHAR(500),
WRITER VARCHAR(50),
AMARANTH_DOC_ID VARCHAR(50),
DOC_STS VARCHAR(10) DEFAULT '0',
STATUS VARCHAR(20) DEFAULT 'create',
REGDATE TIMESTAMP DEFAULT NOW(),
UPDATE_DATE TIMESTAMP
);
CREATE INDEX IF NOT EXISTS IDX_AMARANTH_APPROVAL_APPRO_KEY ON AMARANTH_APPROVAL(APPRO_KEY);
===================================================== -->
<!-- TARGET_OBJID + TARGET_TYPE으로 기존 매핑 조회 -->
<select id="selectAmaranthApprovalByTarget" parameterType="map" resultType="map">
SELECT
OBJID, APPRO_KEY, TARGET_TYPE, TARGET_OBJID, STATUS
FROM AMARANTH_APPROVAL
WHERE TARGET_OBJID = #{targetObjId} AND TARGET_TYPE = #{targetType}
</select>
<!-- Amaranth 결재 매핑 등록 (최초) -->
<insert id="insertAmaranthApproval" parameterType="map">
INSERT INTO AMARANTH_APPROVAL (
APPRO_KEY, TARGET_TYPE, TARGET_OBJID, APPROVAL_TITLE, WRITER, STATUS, REGDATE
) VALUES (
#{approKey}, #{targetType}, #{targetObjId}, #{approvalTitle}, #{writer}, 'create', NOW()
)
</insert>
<!-- 기존 매핑 갱신 (재상신 시 - approKey는 유지) -->
<update id="updateAmaranthApprovalResubmit" parameterType="map">
UPDATE AMARANTH_APPROVAL SET
APPROVAL_TITLE = #{approvalTitle},
WRITER = #{writer},
UPDATE_DATE = NOW()
WHERE TARGET_OBJID = #{targetObjId} AND TARGET_TYPE = #{targetType}
</update>
<!-- approKey로 Amaranth 결재 매핑 조회 -->
<select id="selectAmaranthApprovalByApproKey" parameterType="map" resultType="map">
SELECT
OBJID, APPRO_KEY, TARGET_TYPE, TARGET_OBJID, APPROVAL_TITLE,
WRITER, AMARANTH_DOC_ID, DOC_STS, STATUS, REGDATE, UPDATE_DATE
FROM AMARANTH_APPROVAL
WHERE APPRO_KEY = #{approKey}
</select>
<!-- Amaranth 콜백에 의한 상태 업데이트 -->
<update id="updateAmaranthApprovalByCallback" parameterType="map">
UPDATE AMARANTH_APPROVAL SET
AMARANTH_DOC_ID = #{amaranthDocId},
DOC_STS = #{docSts},
STATUS = #{status},
UPDATE_DATE = NOW()
WHERE APPRO_KEY = #{approKey}
</update>
<!-- 결재불필요 처리: AMARANTH_APPROVAL에 notRequired 상태로 등록 -->
<insert id="insertAmaranthApprovalNotRequired" parameterType="map">
INSERT INTO AMARANTH_APPROVAL (
APPRO_KEY, TARGET_TYPE, TARGET_OBJID, APPROVAL_TITLE, WRITER, STATUS, REGDATE
) VALUES (
#{approKey}, #{targetType}, #{targetObjId}, '결재불필요', #{writer}, 'notRequired', NOW()
)
</insert>
<!-- 결재불필요 처리: 기존 AMARANTH_APPROVAL 레코드 상태 변경 -->
<update id="updateAmaranthApprovalNotRequired" parameterType="map">
UPDATE AMARANTH_APPROVAL SET
STATUS = 'notRequired',
UPDATE_DATE = NOW()
WHERE TARGET_OBJID = #{targetObjId} AND TARGET_TYPE = #{targetType}
</update>
<!-- 품의서(SALES_REQUEST_MASTER) 결재 상태 변경 -->
<update id="changeProposalApprovalStatus" parameterType="map">
UPDATE SALES_REQUEST_MASTER SET
STATUS = #{status}
WHERE OBJID::VARCHAR = #{targetObjId}::VARCHAR
</update>
<!-- ECR(ECR_MNG) 결재 상태 변경 -->
<update id="changeEcrApprovalStatus" parameterType="map">
UPDATE ECR_MNG SET
STATUS_CD = #{statusCd}
WHERE OBJID::VARCHAR = #{targetObjId}::VARCHAR
</update>
<!-- 견적서 정보 조회 (결재 본문용) -->
<select id="getEstimateInfoForApproval" parameterType="map" resultType="map">
SELECT
ET.OBJID,
ET.CONTRACT_OBJID,
ET.ESTIMATE_NO,
ET.TEMPLATE_TYPE,
ET.EXECUTOR,
ET.RECIPIENT,
ET.CONTACT_PERSON,
ET.MODEL_NAME,
ET.TOTAL_AMOUNT,
ET.TOTAL_AMOUNT_KRW,
ET.MANAGER_NAME,
ET.MANAGER_CONTACT,
ET.PART_NAME,
ET.WRITER,
ET.NOTE1,
ET.NOTE2,
ET.NOTE3,
ET.NOTE4,
ET.NOTE_REMARKS,
ET.VALIDITY_PERIOD,
TO_CHAR(ET.REGDATE, 'YYYY-MM-DD') AS REGDATE,
CM.CONTRACT_NO,
(SELECT CLIENT_NM FROM CLIENT_MNG AS C WHERE 'C_' || C.OBJID::VARCHAR = CM.CUSTOMER_OBJID) AS CUSTOMER_NAME,
CM.AREA_CD,
CODE_NAME(CM.CONTRACT_CURRENCY) AS CURRENCY_NAME,
CM.EXCHANGE_RATE,
(SELECT DEPT_NAME || ' ' || USER_NAME FROM USER_INFO WHERE USER_ID = ET.WRITER) AS WRITER_NAME
FROM ESTIMATE_TEMPLATE ET
LEFT JOIN CONTRACT_MGMT CM ON ET.CONTRACT_OBJID = CM.OBJID
WHERE ET.OBJID::VARCHAR = #{targetObjId}
</select>
<!-- 견적서 품목 리스트 조회 (결재 본문용) -->
<select id="getEstimateItemsForApproval" parameterType="map" resultType="map">
SELECT
SEQ,
CATEGORY,
DESCRIPTION,
SPECIFICATION,
QUANTITY,
UNIT,
UNIT_PRICE,
AMOUNT,
NOTE,
REMARK
FROM ESTIMATE_TEMPLATE_ITEM
WHERE TEMPLATE_OBJID::VARCHAR = #{targetObjId}
ORDER BY SEQ
</select>
</mapper>

View File

@@ -3137,22 +3137,12 @@
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
PM.BOM_REPORT_OBJID,
PM.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SOURCE_BOM_TYPE,
PM.SOURCE_EBOM_OBJID,
PM.SOURCE_MBOM_OBJID,
PM.QUANTITY,
-- 총생산수량 = 수주수량 + 추가생산수량 (PRODUCTION_PLAN 테이블)
COALESCE(
(SELECT NULLIF(PP.TOTAL_PROD_QTY, '')::numeric
FROM PRODUCTION_PLAN PP
WHERE PP.PROJECT_OBJID = PM.OBJID
AND UPPER(PP.STATUS) = 'ACTIVE'
LIMIT 1),
COALESCE(NULLIF(PM.QUANTITY, '')::numeric, 0)
) AS TOTAL_PROD_QTY,
COALESCE(
(SELECT PBR.PART_NO
FROM PART_BOM_REPORT PBR
@@ -3303,11 +3293,7 @@
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS PROCESSING_UNIT_PRICE,
0 AS TOTAL_PRICE,
-- 소재소요량 계산용 (E-BOM 단계에서는 소재 미선택이므로 0)
0 AS PART_UNIT_QTY,
0 AS PART_UNIT_LENGTH,
1 AS LEVEL
FROM
BOM_PART_QTY BPQ
@@ -3387,11 +3373,7 @@
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS PROCESSING_UNIT_PRICE,
0 AS TOTAL_PRICE,
-- 소재소요량 계산용 (E-BOM 단계에서는 소재 미선택이므로 0)
0 AS PART_UNIT_QTY,
0 AS PART_UNIT_LENGTH,
1 AS LEVEL
FROM
PROJECT_MGMT PROJ
@@ -3406,25 +3388,31 @@
BPQ.SEQ
</select>
<!-- 품번으로 최신 M-BOM 조회 (MBOM_HEADER 기반, Machine 이외 제품용) -->
<!-- 품번으로 최신 M-BOM 조회 (Machine 이외 제품용) -->
<select id="getLatestMbomByPartNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID AS TEMPLATE_HEADER_OBJID,
MH.MBOM_NO,
MH.PROJECT_OBJID,
MH.PART_NO,
MH.PART_NAME,
TO_CHAR(MH.REGDATE, 'YYYY-MM-DD') AS SAVE_DATE
FROM
MBOM_HEADER MH
INNER JOIN PROJECT_MGMT PM ON MH.PROJECT_OBJID = PM.OBJID
SELECT
PM.OBJID,
COALESCE(
(SELECT PBR.PART_NO
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
LIMIT 1),
''
) AS MBOM_PART_NO,
PM.BOM_REPORT_OBJID,
PM.PART_NO,
PM.PART_NAME,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS SAVE_DATE
FROM
PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE
MH.PART_NO = #{partNo}
AND MH.STATUS = 'Y'
AND CM.PRODUCT != '0000928' <!-- Machine 제외 -->
ORDER BY
MH.REGDATE DESC
WHERE
PM.PART_NO = #{partNo}
AND PM.MBOM_STATUS = 'Y'
AND PM.BOM_REPORT_OBJID IS NOT NULL
AND CM.PRODUCT != '0001807' <!-- Machine 제외 -->
ORDER BY
PM.REGDATE DESC
LIMIT 1
</select>
@@ -3438,7 +3426,6 @@
MH.BEFORE_DATA,
MH.AFTER_DATA,
MH.CHANGE_USER,
USER_NAME(MH.CHANGE_USER) AS CHANGE_USER_NAME,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
-- MBOM_HEADER 정보 조인
MHD.MBOM_NO AS MBOM_PART_NO,
@@ -3756,21 +3743,6 @@
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
-- 소재소요량 계산용: 소재품번(RAW_MATERIAL_PART_NO)에 해당하는 PART_MNG의 UNIT_QTY / UNIT_LENGTH
COALESCE(
(SELECT NULLIF(MP.UNIT_QTY, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_QTY,
COALESCE(
(SELECT NULLIF(MP.UNIT_LENGTH, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_LENGTH,
V.LEV
FROM VIEW_BOM V
LEFT JOIN PART_MNG P ON V.PART_OBJID = P.OBJID
@@ -3876,7 +3848,7 @@
PROCESSING_VENDOR, PROCESSING_DEADLINE, GRINDING_DEADLINE,
REQUIRED_QTY, ORDER_QTY, PRODUCTION_QTY, STOCK_QTY, SHORTAGE_QTY,
NET_QTY, PO_QTY,
VENDOR, UNIT_PRICE, PROCESSING_UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY,
VENDOR, UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY,
<if test="proposalDate != null">
PROPOSAL_DATE,
</if>
@@ -3889,7 +3861,7 @@
#{processingVendor}, #{processingDeadline}, #{grindingDeadline},
#{requiredQty}, #{orderQty}, #{productionQty}, #{stockQty}, #{shortageQty},
#{netQty}, #{poQty},
#{vendor}, #{unitPrice}, #{processingUnitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty},
#{vendor}, #{unitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty},
<if test="proposalDate != null">
#{proposalDate},
</if>
@@ -4075,7 +4047,6 @@
MD.PO_QTY,
MD.VENDOR,
MD.UNIT_PRICE,
MD.PROCESSING_UNIT_PRICE,
MD.TOTAL_PRICE,
MD.CURRENCY,
MD.LEAD_TIME,
@@ -4129,7 +4100,6 @@
SHORTAGE_QTY,
VENDOR,
UNIT_PRICE,
PROCESSING_UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
@@ -4174,7 +4144,6 @@
A.SHORTAGE_QTY,
A.VENDOR,
A.UNIT_PRICE,
A.PROCESSING_UNIT_PRICE,
A.TOTAL_PRICE,
A.CURRENCY,
A.LEAD_TIME,
@@ -4227,7 +4196,6 @@
B.SHORTAGE_QTY,
B.VENDOR,
B.UNIT_PRICE,
B.PROCESSING_UNIT_PRICE,
B.TOTAL_PRICE,
B.CURRENCY,
B.LEAD_TIME,
@@ -4280,7 +4248,6 @@
V.VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
V.UNIT_PRICE,
V.PROCESSING_UNIT_PRICE,
V.TOTAL_PRICE,
V.CURRENCY,
V.LEAD_TIME,
@@ -4318,21 +4285,6 @@
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
-- 소재소요량 계산용: 소재품번(RAW_MATERIAL_PART_NO)에 해당하는 PART_MNG의 UNIT_QTY / UNIT_LENGTH
COALESCE(
(SELECT NULLIF(MP.UNIT_QTY, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_QTY,
COALESCE(
(SELECT NULLIF(MP.UNIT_LENGTH, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_LENGTH,
V.LEV
FROM VIEW_BOM V
INNER JOIN PART_MNG P ON P.OBJID = V.PART_OBJID
@@ -4362,8 +4314,7 @@
PATH2,
CYCLE,
UNIT,
WRITER,
RAW_MATERIAL_PART_NO
WRITER
) AS (
SELECT
A.MBOM_HEADER_OBJID,
@@ -4384,8 +4335,7 @@
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.WRITER,
A.RAW_MATERIAL_PART_NO
A.WRITER
FROM
MBOM_DETAIL A
WHERE 1=1
@@ -4414,8 +4364,7 @@
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.WRITER,
B.RAW_MATERIAL_PART_NO
B.WRITER
FROM
MBOM_DETAIL B
JOIN
@@ -4461,7 +4410,6 @@
NULL AS SHORTAGE_QTY,
NULL AS VENDOR,
NULL AS UNIT_PRICE,
NULL AS PROCESSING_UNIT_PRICE,
NULL AS TOTAL_PRICE,
NULL AS CURRENCY,
NULL AS LEAD_TIME,
@@ -4497,21 +4445,6 @@
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
-- 소재소요량 계산용: 소재품번(RAW_MATERIAL_PART_NO)에 해당하는 PART_MNG의 UNIT_QTY / UNIT_LENGTH
COALESCE(
(SELECT NULLIF(MP.UNIT_QTY, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_QTY,
COALESCE(
(SELECT NULLIF(MP.UNIT_LENGTH, '')::numeric
FROM PART_MNG MP
WHERE MP.PART_NO = V.RAW_MATERIAL_PART_NO
LIMIT 1),
0
) AS PART_UNIT_LENGTH,
V.LEV
FROM VIEW_BOM V
INNER JOIN PART_MNG P ON P.OBJID = V.PART_OBJID
@@ -4580,18 +4513,9 @@
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'ASSEMBLY' AND PR.STATUS = 'active'), 0) AS ASSEMBLY_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'INSPECTION' AND PR.STATUS = 'active'), 0) AS INSPECTION_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS SHIP_WAIT_QTY,
-- '' AS EQUIPMENT_WBS,
(SELECT COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = PM.OBJID AND (
O.PRODUCE_PLAN_START !='' OR O.PRODUCE_PLAN_END !='' OR O.PRODUCE_ACT_START!='' OR O.PRODUCE_ACT_END !='' OR O.PRODUCE_USER_ID !=''
OR O.DESIGN_USER_ID !='' OR O.DESIGN_PLAN_START !='' OR O.DESIGN_PLAN_END !='' OR O.DESIGN_ACT_START !='' OR O.DESIGN_ACT_END !=''
OR O.PURCHASE_USER_ID !='' OR O.PURCHASE_PLAN_START !='' OR O.PURCHASE_PLAN_END !='' OR O.PURCHASE_ACT_START !='' OR O.PURCHASE_ACT_END !=''
)) AS EQUIPMENT_WBS,
'' AS EQUIPMENT_WBS,
PP.OBJID AS PROD_PLAN_OBJID,
PM.REGDATE AS SORT_DATE,
PP.WRITER,
USER_NAME(PP.WRITER) AS WRITER_NAME,
TO_CHAR(PP.REGDATE, 'YYYY-MM-DD') AS REGDATE_TITLE,
PP.REGDATE
PM.REGDATE AS SORT_DATE
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
@@ -4639,13 +4563,9 @@
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'ASSEMBLY' AND PR.STATUS = 'active'), 0) AS ASSEMBLY_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'INSPECTION' AND PR.STATUS = 'active'), 0) AS INSPECTION_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS SHIP_WAIT_QTY,
0 AS EQUIPMENT_WBS,
'' AS EQUIPMENT_WBS,
PP.OBJID AS PROD_PLAN_OBJID,
PP.REGDATE AS SORT_DATE,
PP.WRITER,
USER_NAME(PP.WRITER) AS WRITER_NAME,
TO_CHAR(PP.REGDATE, 'YYYY-MM-DD') AS REGDATE_TITLE,
PP.REGDATE
PP.REGDATE AS SORT_DATE
FROM PRODUCTION_PLAN PP
WHERE PP.STATUS = 'active'
AND (PP.PROJECT_OBJID IS NULL OR PP.PROJECT_OBJID = '')
@@ -4697,17 +4617,6 @@
<if test="search_serial_no != null and search_serial_no != ''">
AND UPPER(T.SERIAL_NO) LIKE '%' || UPPER(#{search_serial_no}) || '%'
</if>
<!-- 등록자 검색 -->
<if test="search_writer != null and search_writer != ''">
AND T.WRITER = #{search_writer}
</if>
<!-- 등록일 검색 -->
<if test="search_regdate_from != null and search_regdate_from != ''">
AND T.REGDATE >= TO_DATE(#{search_regdate_from}, 'YYYY-MM-DD')
</if>
<if test="search_regdate_to != null and search_regdate_to != ''">
AND T.REGDATE &lt;= TO_DATE(#{search_regdate_to}, 'YYYY-MM-DD')
</if>
ORDER BY T.SORT_DATE DESC, T.PROJECT_NO DESC
</select>
@@ -4726,7 +4635,7 @@
COALESCE(CI.DUE_DATE, PM.DUE_DATE, CM.REQ_DEL_DATE, '') AS REQ_DEL_DATE,
COALESCE(NULLIF(PM.QUANTITY, '')::numeric, 0) AS ORDER_QTY,
COALESCE((SELECT NULLIF(PP.EXTRA_PROD_QTY, '')::numeric FROM PRODUCTION_PLAN PP WHERE PP.PROJECT_OBJID = PM.OBJID AND UPPER(PP.STATUS) = 'ACTIVE' LIMIT 1), 0) AS EXTRA_PROD_QTY,
COALESCE(CI.CUSTOMER_REQUEST, CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
COALESCE(CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
COALESCE((
SELECT STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SERIAL_NO)
FROM CONTRACT_ITEM_SERIAL CIS
@@ -4780,9 +4689,8 @@
PP.TOTAL_PROD_QTY,
PP.CUSTOMER_REQUEST,
PP.STATUS,
TO_CHAR(PP.REGDATE, 'YYYY-MM-DD') AS REGDATE,
PP.WRITER,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PP.WRITER) AS WRITER_NAME
PP.REGDATE,
PP.WRITER
FROM PRODUCTION_PLAN PP
WHERE PP.OBJID = #{objid}
</select>
@@ -5023,93 +4931,4 @@
WHERE PROJECT_OBJID = #{projectObjid}
</delete>
<!-- M-BOM 변경이력 목록 조회 (MBOM_HISTORY 기준) -->
<select id="getMbomHistoryGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID AS HISTORY_OBJID,
MH.MBOM_HEADER_OBJID,
MH.CHANGE_TYPE,
--TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD') AS CHANGE_DATE,
MH.CHANGE_USER,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MH.CHANGE_USER LIMIT 1),
MH.CHANGE_USER
) AS CHANGE_USER_NAME,
PM.OBJID AS PROJECT_OBJID,
PM.PROJECT_NO,
PM.PART_NO,
PM.PART_NAME,
COALESCE(PM.QUANTITY::numeric, 0) AS QUANTITY,
COALESCE(PM.DUE_DATE, CM.REQ_DEL_DATE) AS REQ_DEL_DATE,
CM.OBJID AS CONTRACT_OBJID,
COALESCE((SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.CATEGORY_CD LIMIT 1), '') AS CATEGORY_NAME,
COALESCE((SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PRODUCT LIMIT 1), '') AS PRODUCT_NAME,
COALESCE((SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.AREA_CD LIMIT 1), '') AS AREA_NAME,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
COALESCE(
CASE WHEN CM.CUSTOMER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG AS C WHERE 'C_' || C.OBJID::VARCHAR = CM.CUSTOMER_OBJID LIMIT 1) ELSE (SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = CM.CUSTOMER_OBJID::VARCHAR LIMIT 1) END,
''
) AS CUSTOMER_NAME,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PAID_TYPE LIMIT 1),
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE ''
END
) AS PAID_TYPE_NAME,
COALESCE(CI.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST
FROM MBOM_HISTORY MH
INNER JOIN MBOM_HEADER MHD ON MH.MBOM_HEADER_OBJID = MHD.OBJID
INNER JOIN PROJECT_MGMT PM ON MHD.PROJECT_OBJID = PM.OBJID::VARCHAR
LEFT OUTER JOIN CONTRACT_ITEM CI ON PM.CONTRACT_OBJID = CI.CONTRACT_OBJID
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE 1=1
<if test="search_category_cd != null and search_category_cd != ''">
AND CM.CATEGORY_CD = #{search_category_cd}
</if>
<if test="search_product_cd != null and search_product_cd != ''">
AND CM.PRODUCT = #{search_product_cd}
</if>
<if test="search_area_cd != null and search_area_cd != ''">
AND CM.AREA_CD = #{search_area_cd}
</if>
<if test="search_customer_objid != null and search_customer_objid != ''">
AND CM.CUSTOMER_OBJID = #{search_customer_objid}
</if>
<if test="search_change_date_from != null and search_change_date_from != ''">
AND MH.CHANGE_DATE >= TO_DATE(#{search_change_date_from}, 'YYYY-MM-DD')
</if>
<if test="search_change_date_to != null and search_change_date_to != ''">
AND MH.CHANGE_DATE &lt;= TO_DATE(#{search_change_date_to}, 'YYYY-MM-DD') + INTERVAL '1 day'
</if>
ORDER BY MH.CHANGE_DATE DESC
</select>
<!-- M-BOM 변경이력 상세 조회 (개별 히스토리 건) -->
<select id="getMbomHistoryDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID AS HISTORY_OBJID,
MH.MBOM_HEADER_OBJID,
MH.CHANGE_TYPE,
MH.CHANGE_DESCRIPTION,
MH.BEFORE_DATA::TEXT AS BEFORE_DATA,
MH.AFTER_DATA::TEXT AS AFTER_DATA,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
MH.CHANGE_USER,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MH.CHANGE_USER LIMIT 1),
MH.CHANGE_USER
) AS CHANGE_USER_NAME,
-- PROJECT 정보
PM.PROJECT_NO,
PM.PART_NO,
PM.PART_NAME
FROM MBOM_HISTORY MH
INNER JOIN MBOM_HEADER MHD ON MH.MBOM_HEADER_OBJID = MHD.OBJID
INNER JOIN PROJECT_MGMT PM ON MHD.PROJECT_OBJID = PM.OBJID::VARCHAR
WHERE MH.OBJID::VARCHAR = #{historyObjId}
</select>
</mapper>

View File

@@ -879,10 +879,10 @@
SELECT
SRP.OBJID,
SRP.PART_OBJID,
COALESCE(NULLIF(SRP.QTY::VARCHAR, ''), '0') AS QTY,
COALESCE(NULLIF(SRP.QTY::VARCHAR, ''), '0') AS ORDER_QTY,
COALESCE(SRP.UNIT_PRICE, 0) AS PARTNER_PRICE,
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
SRP.QTY,
COALESCE(SRP.PO_QTY, SRP.QTY::NUMERIC, 0) AS ORDER_QTY, -- 발주수량 (PO_QTY 우선, 없으면 QTY)
SRP.UNIT_PRICE AS PARTNER_PRICE,
SRP.TOTAL_PRICE,
SRP.VENDOR_PM AS PARTNER_OBJID,
PM.PART_NO,
PM.PART_NAME,
@@ -1193,7 +1193,7 @@
#{PART_OBJID},
REPLACE(#{BOM_QTY}::VARCHAR, ',', ''),
REPLACE(#{QTY}::VARCHAR, ',', ''),
COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0),
REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''),
#{PARTNER_PRICE},
#{REMARK},
#{WRITER},
@@ -1231,7 +1231,7 @@
) ON CONFLICT (OBJID) DO
UPDATE
SET
ORDER_QTY = COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0)
ORDER_QTY = REPLACE(#{ORDER_QTY} ::VARCHAR, ',', '')
,PARTNER_PRICE = REPLACE(#{PARTNER_PRICE} ::VARCHAR, ',', '')
,REMARK = #{REMARK}
<!--
@@ -1836,7 +1836,8 @@
<select id="getPurchaseOrderDeliveryTargetPartList" parameterType="map" resultType="map">
SELECT
P.*,
(ORDER_QTY::NUMERIC - TOTAL_DELIVERY_QTY::NUMERIC) AS NON_ARRIVAL_QTY
(REAL_ORDER_QTY::NUMERIC -TOTAL_DELIVERY_QTY::NUMERIC) AS NON_ARRIVAL_QTY
<!-- (ORDER_QTY::NUMERIC -(TOTAL_DELIVERY_QTY::NUMERIC - TOTAL_DEFECT_QTY::NUMERIC)) AS NON_ARRIVAL_QTY -->
FROM(
SELECT
ROW_NUMBER() OVER(ORDER BY PM.PART_NO, POP.REGDATE DESC) AS RNUM,
@@ -1854,7 +1855,7 @@
WHEN POM.PARTNER_OBJID LIKE 'C_%' THEN (SELECT CLIENT_NM FROM CLIENT_MNG WHERE 'C_' || OBJID::VARCHAR = POM.PARTNER_OBJID)
ELSE (SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE 1=1 AND OBJID::VARCHAR = POM.PARTNER_OBJID)
END AS PARTNER_NAME,
COALESCE(NULLIF(POP.ORDER_QTY::VARCHAR, '')::NUMERIC::INTEGER, 0) AS ORDER_QTY,
POP.ORDER_QTY,
POP.REAL_ORDER_QTY,
POP.OBJID AS ORDER_PART_OBJID,
POP.PURCHASE_ORDER_MASTER_OBJID,
@@ -3230,8 +3231,6 @@ SELECT POM.OBJID
,POM.TOTAL_SUPPLY_UNIT_PRICE
,POM.TOTAL_REAL_SUPPLY_PRICE
,POM.NEGO_RATE
,POM.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME
<!--
,POM.TOTAL_SUPPLY_UNIT_PRICE::NUMERIC - POM.DISCOUNT_PRICE::NUMERIC as TOTAL_SUPPLY_UNIT_PRICE_NEGO
-->
@@ -3318,7 +3317,7 @@ SELECT POM.OBJID
ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
left outer join SALES_REQUEST_MASTER as SRM
on POM.SALES_REQUEST_OBJID = SRM.OBJID
and SRM.DOC_TYPE IN ('PROPOSAL', 'PURCHASE_REG_PROPOSAL')
and SRM.DOC_TYPE = 'PROPOSAL'
<!-- 230907 outer join으로 변경
,PROJECT_MGMT AS CM
WHERE POM.CONTRACT_MGMT_OBJID = CM.OBJID
@@ -3451,30 +3450,6 @@ WHERE 1=1
AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%'
)
</if>
<!-- 구매유형 필터 -->
<if test="purchase_type != null and purchase_type != ''">
AND SRM.PURCHASE_TYPE = #{purchase_type}
</if>
<!-- 발주자(구매담당자) 필터 -->
<if test="writer != null and writer != ''">
AND POM.WRITER = #{writer}
</if>
<!-- 메일발송 필터 -->
<if test="mail_send_yn != null and mail_send_yn != ''">
<choose>
<when test='mail_send_yn == "Y"'>
AND POM.MAIL_SEND_YN = 'Y'
AND (POM.STATUS IS NULL OR POM.STATUS != 'orderCancel')
</when>
<when test='mail_send_yn == "orderCancel"'>
AND POM.STATUS = 'orderCancel'
</when>
<otherwise>
AND (POM.MAIL_SEND_YN IS NULL OR POM.MAIL_SEND_YN = '' OR POM.MAIL_SEND_YN = 'N')
AND (POM.STATUS IS NULL OR POM.STATUS != 'orderCancel')
</otherwise>
</choose>
</if>
ORDER BY SPLIT_PART( PURCHASE_ORDER_NO, '-', 3)::NUMERIC DESC
</select>
@@ -4271,7 +4246,6 @@ SELECT T.*
<select id="deliveryMngList_new" parameterType="map" resultType="map">
SELECT POM.OBJID
,POM.STATUS
<!-- ,TO_CHAR(CM.REGDATE, 'YYYY') AS CM_YEAR -->
,TO_CHAR(POM.REGDATE,'YYYY') AS POM_YEAR
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = CM.CUSTOMER_OBJID) AS CUSTOMER_NAME
@@ -4315,8 +4289,6 @@ SELECT POM.OBJID
,POM.SALES_MNG_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.SALES_MNG_USER_ID) AS SALES_MNG_USER_NAME
,POM.WRITER
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME
,TO_CHAR(POM.REGDATE,'YYYY-MM-DD') AS REGDATE
,POM.TOTAL_PRICE
,POM.DISCOUNT_PRICE
@@ -4457,15 +4429,8 @@ SELECT POM.OBJID
<!-- <if test="sales_mng_user_id !=null and sales_mng_user_id != '' ">
AND POM.SALES_MNG_USER_ID = #{sales_mng_user_id}
</if> -->
<!-- <if test="sales_mng_user_ids != null and sales_mng_user_ids != ''">
AND POM.SALES_MNG_USER_ID IN
<foreach item="value" collection="sales_mng_user_ids.split(',')"
open="(" separator="," close=")">
#{value}
</foreach>
</if> -->
<if test="sales_mng_user_ids != null and sales_mng_user_ids != ''">
AND POM.WRITER IN
AND POM.SALES_MNG_USER_ID IN
<foreach item="value" collection="sales_mng_user_ids.split(',')"
open="(" separator="," close=")">
#{value}
@@ -6158,208 +6123,4 @@ FROM(
ORDER BY PART_NO
</select>
<!-- 발주 취소를 위한 입고 수량 조회 (ARRIVAL_PLAN 테이블) -->
<select id="getTotalReceiptQtyForCancel" parameterType="map" resultType="map">
SELECT
COALESCE(SUM(
CASE
WHEN AP.RECEIPT_QTY IS NULL OR AP.RECEIPT_QTY = '' THEN 0
ELSE AP.RECEIPT_QTY::NUMERIC
END
), 0) AS TOTAL_RECEIPT_QTY
FROM ARRIVAL_PLAN AP
WHERE AP.PARENT_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
</select>
<!-- 발주 취소 상태 업데이트 -->
<update id="updateOrderCancelStatus" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER
SET STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<!-- 동시발주 하위건 발주 취소 상태 업데이트 -->
<update id="updateOrderCancelStatusMulti" parameterType="map">
UPDATE PURCHASE_ORDER_MASTER
SET STATUS = #{STATUS}
WHERE MULTI_MASTER_OBJID = #{OBJID}
</update>
<!-- =====================================================
품목별 입고 관리 리스트 조회
===================================================== -->
<select id="deliveryMngPartList" parameterType="map" resultType="map">
SELECT
POP.OBJID AS PURCHASE_ORDER_PART_OBJID
,POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
,POM.STATUS
,COALESCE(POM.FORM_TYPE, '') AS FORM_TYPE
<!-- 품의서 정보 -->
,POM.SALES_REQUEST_OBJID
,(SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER SRM
WHERE SRM.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID
AND SRM.DOC_TYPE IN ('PROPOSAL', 'PURCHASE_REG_PROPOSAL')) AS PROPOSAL_NO
<!-- 발주서 정보 -->
,POM.PURCHASE_ORDER_NO
,CM.PROJECT_NO
<!-- 품목 정보 -->
,POP.PART_NO
,POP.PART_NAME
<!-- 공급업체 -->
,(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
<!-- 구매담당자 -->
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = POM.WRITER) AS WRITER_NAME
<!-- 발주수량 -->
,COALESCE(POP.ORDER_QTY::NUMERIC, 0) AS ORDER_QTY
<!-- 입고수량 (ARRIVAL_PLAN에서 합계) -->
,COALESCE(AP_AGG.DELIVERY_QTY, 0) AS DELIVERY_QTY
<!-- 미입고수량 = 발주수량 - 입고수량 -->
,(COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.DELIVERY_QTY, 0)) AS NON_DELIVERY_QTY
<!-- 발주금액 = 단가 × 발주수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * COALESCE(POP.ORDER_QTY::NUMERIC, 0) AS TOTAL_SUPPLY_PRICE
<!-- 입고금액 = 단가 × 입고수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * COALESCE(AP_AGG.DELIVERY_QTY, 0) AS TOTAL_DELIVERY_PRICE
<!-- 미입고금액 = 단가 × 미입고수량 -->
,COALESCE(POP.PARTNER_PRICE::NUMERIC, 0) * (COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.DELIVERY_QTY, 0)) AS TOTAL_NOT_DELIVERY_PRICE
<!-- 수입검사 검사현황 (품목별: INVENTORY_MGMT_IN → INVENTORY_MGMT → PART_MNG 연결) -->
,(CASE
WHEN IID_AGG.TOTAL_COUNT > 0 AND IID_AGG.TOTAL_COUNT = IID_AGG.COMPLETED_COUNT THEN '완료'
WHEN IID_AGG.COMPLETED_COUNT > 0 THEN '진행중'
ELSE ''
END) AS INSPECTION_STATUS
<!-- 반품 처리결과 폐기수량 (품목별) -->
,COALESCE(DEFECT_AGG.DEFECT_QTY, 0) AS DEFECT_QTY
<!-- 매입마감수량 확정입고수량 = 입고수량 - 폐기수량 -->
,(COALESCE(AP_AGG.DELIVERY_QTY, 0) - COALESCE(DEFECT_AGG.DEFECT_QTY, 0)) AS CONFIRMED_QTY
<!-- 품목별 입고요청일 (BOM → 품의서 → 발주서 품목으로 전달된 값) -->
,POP.DELIVERY_REQUEST_DATE
<!-- 매입마감일 -->
,POM.PURCHASE_CLOSE_DATE
<!-- 입고결과 -->
,(CASE
WHEN COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.DELIVERY_QTY, 0) <![CDATA[ <= ]]> 0 THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) AS DELIVERY_STATUS
FROM PURCHASE_ORDER_PART POP
INNER JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID::VARCHAR = POP.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN PROJECT_MGMT CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
<!-- 입고 수량 집계 (ARRIVAL_PLAN) -->
LEFT OUTER JOIN (
SELECT ORDER_PART_OBJID
,SUM(COALESCE(RECEIPT_QTY::NUMERIC, 0)) AS DELIVERY_QTY
FROM ARRIVAL_PLAN
GROUP BY ORDER_PART_OBJID
) AP_AGG ON POP.OBJID = AP_AGG.ORDER_PART_OBJID
<!-- 수입검사 현황 집계 (발주마스터+품목 기준: 불량상세가 있는 건만 카운트) -->
LEFT OUTER JOIN (
SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
,IM.PART_OBJID
,COUNT(IDF.OBJID) AS TOTAL_COUNT /* 불량상세가 있는 건수 */
,COUNT(CASE WHEN IDF.ACTION_RESULT IS NOT NULL AND IDF.ACTION_RESULT != '' THEN 1 END) AS COMPLETED_COUNT
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID, IM.PART_OBJID
) IID_AGG ON POM.OBJID::VARCHAR = IID_AGG.PURCHASE_ORDER_MASTER_OBJID
AND POP.PART_OBJID = IID_AGG.PART_OBJID
<!-- 폐기수량 집계 (발주마스터+품목 기준) -->
LEFT OUTER JOIN (
SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
,IM.PART_OBJID
,SUM(COALESCE(NULLIF(IDF.DEFECT_QTY, '')::NUMERIC, 0)) AS DEFECT_QTY
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
AND IDF.ACTION_RESULT IN ('폐기', 'SCRAP')
GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID, IM.PART_OBJID
) DEFECT_AGG ON POM.OBJID::VARCHAR = DEFECT_AGG.PURCHASE_ORDER_MASTER_OBJID
AND POP.PART_OBJID = DEFECT_AGG.PART_OBJID
WHERE 1=1
AND POM.MAIL_SEND_DATE IS NOT NULL
AND pom.status = 'create'
AND (POM.MULTI_MASTER_YN = 'Y' OR NVL(POM.MULTI_MASTER_YN, '') != 'Y' AND NVL(POM.MULTI_YN, '') != 'Y')
<if test="Year != null and Year != ''">
AND TO_CHAR(POM.REGDATE, 'YYYY') = #{Year}
</if>
<if test="customer_cd != null and customer_cd != ''">
AND CM.CUSTOMER_OBJID = REPLACE(#{customer_cd}, 'C_', '')
</if>
<if test="project_nos != null and project_nos != ''">
AND CM.OBJID IN
<foreach item="state" collection="project_nos.split(',')" open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="purchase_order_no != null and purchase_order_no != ''">
AND TRIM(UPPER(POM.PURCHASE_ORDER_NO)) LIKE '%'||TRIM(UPPER(#{purchase_order_no}))||'%'
</if>
<!-- 입고요청일 검색: 품목별 입고요청일(POP) 기준 -->
<if test="delivery_start_date != null and delivery_start_date != ''">
AND TO_DATE(POP.DELIVERY_REQUEST_DATE, 'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{delivery_start_date}, 'YYYY-MM-DD')
</if>
<if test="delivery_end_date != null and delivery_end_date != ''">
AND TO_DATE(POP.DELIVERY_REQUEST_DATE, 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{delivery_end_date}, 'YYYY-MM-DD')
</if>
<if test="partner_objid != null and partner_objid != ''">
AND POM.PARTNER_OBJID = REPLACE(#{partner_objid}, 'C_', '')
</if>
<if test="sales_mng_user_ids != null and sales_mng_user_ids != ''">
AND POM.SALES_MNG_USER_ID IN
<foreach item="value" collection="sales_mng_user_ids.split(',')" open="(" separator="," close=")">
#{value}
</foreach>
</if>
<if test="reg_start_date != null and reg_start_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{reg_start_date}, 'YYYY-MM-DD')
</if>
<if test="reg_end_date != null and reg_end_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{reg_end_date}, 'YYYY-MM-DD')
</if>
<if test="delivery_status != null and delivery_status != ''">
AND (CASE
WHEN COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.DELIVERY_QTY, 0) <![CDATA[ <= ]]> 0 THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) = #{delivery_status}
</if>
<if test="SEARCH_PART_NO != null and SEARCH_PART_NO != ''">
AND TRIM(UPPER(POP.PART_NO)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NO}))||'%'
</if>
<if test="SEARCH_PART_NAME != null and SEARCH_PART_NAME != ''">
AND TRIM(UPPER(POP.PART_NAME)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NAME}))||'%'
</if>
<if test="SEARCH_PART_SPEC != null and SEARCH_PART_SPEC != ''">
AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%'
</if>
ORDER BY POM.REGDATE DESC, POP.OBJID
</select>
</mapper>

View File

@@ -1208,12 +1208,6 @@
AND (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) = #{search_inspection_result}
</if>
/* 진행공정 */
<if test="search_process_cd != null and search_process_cd != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.PROCESS_CD = #{search_process_cd})
</if>
ORDER BY PIM.REG_DATE DESC
</select>
@@ -1417,10 +1411,6 @@
<if test="search_inspection_result != null and search_inspection_result != ''">
AND PID.INSPECTION_RESULT = #{search_inspection_result}
</if>
/* 진행공정 */
<if test="search_process_cd != null and search_process_cd != ''">
AND PID.PROCESS_CD = #{search_process_cd}
</if>
ORDER BY PIM.INSPECTION_DATE DESC, PIM.REG_DATE DESC, PID.REG_DATE
</select>
@@ -1428,96 +1418,8 @@
반제품검사 관리
===================================================== -->
<!-- 반제품검사 목록 조회 (개별 행으로 표시, 양품 데이터 기준) -->
<!-- 반제품검사 목록 조회 (영업관리 방식: 작업지시번호 기준 그룹화, 나머지는 "외 N건") -->
<select id="getSemiProductInspectionList" parameterType="map" resultType="map">
SELECT SPI.OBJID
, COALESCE(SPI.INSPECTION_GROUP_ID::VARCHAR, SPI.OBJID::VARCHAR) AS INSPECTION_GROUP_ID
, COALESCE(TO_CHAR(SPI.INSPECTION_DATE, 'YYYY-MM-DD'), TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD')) AS INSPECTION_DATE
, COALESCE((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPI.INSPECTOR),
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPI.WRITER), '') AS WRITER_NAME
, COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME
, COALESCE(SPI.PRODUCT_TYPE, '') AS PRODUCT_TYPE
, COALESCE(SPI.WORK_ORDER_NO, '') AS WORK_ORDER_NO
, COALESCE(SPI.PART_NO, '') AS PART_NO
, COALESCE(SPI.PART_NAME, '') AS PART_NAME
, COALESCE(SPI.RECEIPT_QTY, 0) AS RECEIPT_QTY
, COALESCE(SPI.GOOD_QTY, 0) AS GOOD_QTY
<!-- 불량수량: 해당 양품에 연결된 불량 데이터의 합계 (PART_NO 기준) -->
, COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO), 0) AS DEFECTIVE_QTY
<!-- 불량율 계산 -->
, CASE
WHEN COALESCE(SPI.RECEIPT_QTY, 0) > 0
THEN ROUND(COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO), 0) * 100.0 / SPI.RECEIPT_QTY, 2)
ELSE 0
END AS DEFECT_RATE
<!-- 재생수량: 처리결과가 '수정완료'인 불량수량 -->
, COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO
AND D.DISPOSITION_TYPE = '수정완료'), 0) AS REGENERATION_QTY
<!-- 최종양품수량: 양품수량 + 재생수량 -->
, COALESCE(SPI.GOOD_QTY, 0) + COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO
AND D.DISPOSITION_TYPE = '수정완료'), 0) AS FINAL_GOOD_QTY
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE SPI.DATA_TYPE = 'GOOD' <!-- 양품 데이터만 조회 (불량은 서브쿼리로 집계) -->
<!-- 품명(모델명) 검색 -->
<if test="search_model_name != null and search_model_name != ''">
AND UPPER(SPI.MODEL_NAME) LIKE UPPER('%' || #{search_model_name} || '%')
</if>
<!-- 작업지시번호 검색 -->
<if test="search_work_order_no != null and search_work_order_no != ''">
AND UPPER(SPI.WORK_ORDER_NO) LIKE UPPER('%' || #{search_work_order_no} || '%')
</if>
<!-- 부품품번 검색 -->
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(SPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<!-- 부품명 검색 -->
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(SPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<!-- 검사일 검색 -->
<if test="inspection_start_date != null and inspection_start_date != ''">
AND COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) <![CDATA[>=]]> #{inspection_start_date}::DATE
</if>
<if test="inspection_end_date != null and inspection_end_date != ''">
AND COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) <![CDATA[<=]]> #{inspection_end_date}::DATE
</if>
<!-- 검사자 검색 -->
<if test="search_writer != null and search_writer != ''">
AND SPI.WRITER = #{search_writer}
</if>
<!-- 불량유형 검색 (불량 데이터에서 검색) -->
<if test="search_defect_type != null and search_defect_type != ''">
AND EXISTS (SELECT 1 FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO
AND UPPER(D.DEFECT_TYPE) LIKE UPPER('%' || #{search_defect_type} || '%'))
</if>
<!-- 귀책부서 검색 (불량 데이터에서 검색) -->
<if test="search_responsible_dept != null and search_responsible_dept != ''">
AND EXISTS (SELECT 1 FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
AND D.DATA_TYPE = 'DEFECT'
AND D.PART_NO = SPI.PART_NO
AND UPPER(D.RESPONSIBLE_DEPT) LIKE UPPER('%' || #{search_responsible_dept} || '%'))
</if>
ORDER BY COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) DESC, SPI.OBJID DESC
</select>
<!-- 반제품검사 목록 조회 (그룹화 버전 - 백업용) -->
<select id="getSemiProductInspectionList_old" parameterType="map" resultType="map">
SELECT T.INSPECTION_GROUP_ID
, MIN(T.OBJID) AS OBJID
<!-- 작업지시번호: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
@@ -1540,16 +1442,6 @@
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND T2.MODEL_NAME IS NOT NULL AND T2.MODEL_NAME != '') sub
) AS MODEL_NAME
<!-- 제품구분: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
, (SELECT CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MAX(val)
ELSE MAX(val) || ' 외 ' || (COUNT(*) - 1) || '건'
END
FROM (SELECT DISTINCT T2.PRODUCT_TYPE AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND T2.PRODUCT_TYPE IS NOT NULL AND T2.PRODUCT_TYPE != '') sub
) AS PRODUCT_TYPE
<!-- 부품품번: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
, (SELECT CASE
WHEN COUNT(*) = 0 THEN ''
@@ -1594,17 +1486,17 @@
AND (T2.INSPECTOR IS NOT NULL OR T2.WRITER IS NOT NULL)) sub
WHERE val IS NOT NULL AND val != ''
) AS WRITER_NAME
<!-- 수량 집계 (입고수량은 양품 데이터에서만 합산) -->
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) AS RECEIPT_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) AS GOOD_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) AS DEFECTIVE_QTY
<!-- 수량 집계 -->
, SUM(T.RECEIPT_QTY) AS RECEIPT_QTY
, SUM(T.GOOD_QTY) AS GOOD_QTY
, SUM(T.DEFECT_QTY) AS DEFECTIVE_QTY
, CASE
WHEN SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) > 0
THEN ROUND(SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) * 100.0 / SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END), 2)
WHEN SUM(T.RECEIPT_QTY) > 0
THEN ROUND(SUM(T.DEFECT_QTY) * 100.0 / SUM(T.RECEIPT_QTY), 2)
ELSE 0
END AS DEFECT_RATE
, SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS REGENERATION_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) + SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS FINAL_GOOD_QTY
, SUM(CASE WHEN T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS REGENERATION_QTY
, SUM(T.GOOD_QTY) + SUM(CASE WHEN T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS FINAL_GOOD_QTY
FROM (
SELECT SPI.OBJID
, COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME
@@ -1629,33 +1521,22 @@
<if test="search_work_order_no != null and search_work_order_no != ''">
AND UPPER(SPI.WORK_ORDER_NO) LIKE UPPER('%' || #{search_work_order_no} || '%')
</if>
<!-- 부품품번 검색 -->
<!-- 부품품번 검색 (LIKE 검색 - 외 N건 항목도 검색 가능) -->
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(SPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<!-- 부품명 검색 -->
<!-- 부품명 검색 (LIKE 검색 - 외 N건 항목도 검색 가능) -->
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(SPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<!-- 검사일 검색 -->
<if test="inspection_start_date != null and inspection_start_date != ''">
AND SPI.INSPECTION_DATE <![CDATA[>=]]> #{inspection_start_date}
</if>
<if test="inspection_end_date != null and inspection_end_date != ''">
AND SPI.INSPECTION_DATE <![CDATA[<=]]> #{inspection_end_date}
<if test="search_inspection_date != null and search_inspection_date != ''">
AND TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD') = #{search_inspection_date}
</if>
<!-- 검사자 검색 -->
<if test="search_writer != null and search_writer != ''">
AND SPI.WRITER = #{search_writer}
</if>
<!-- 불량유형 검색 -->
<if test="search_defect_type != null and search_defect_type != ''">
AND UPPER(SPI.DEFECT_TYPE) LIKE UPPER('%' || #{search_defect_type} || '%')
</if>
<!-- 귀책부서 검색 -->
<if test="search_responsible_dept != null and search_responsible_dept != ''">
AND UPPER(SPI.RESPONSIBLE_DEPT) LIKE UPPER('%' || #{search_responsible_dept} || '%')
</if>
) T
GROUP BY T.INSPECTION_GROUP_ID
ORDER BY MIN(T.INSPECTION_DATE) DESC, T.INSPECTION_GROUP_ID
@@ -1764,24 +1645,6 @@
ORDER BY NAME
</select>
<!-- 반제품검사 불량유형 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductDefectTypeList" parameterType="map" resultType="map">
SELECT DISTINCT SPI.DEFECT_TYPE AS CODE
, SPI.DEFECT_TYPE AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE SPI.DEFECT_TYPE IS NOT NULL AND SPI.DEFECT_TYPE != ''
ORDER BY NAME
</select>
<!-- 반제품검사 귀책부서 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductResponsibleDeptList" parameterType="map" resultType="map">
SELECT DISTINCT SPI.RESPONSIBLE_DEPT AS CODE
, SPI.RESPONSIBLE_DEPT AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE SPI.RESPONSIBLE_DEPT IS NOT NULL AND SPI.RESPONSIBLE_DEPT != ''
ORDER BY NAME
</select>
<!-- 반제품검사 상세 조회 -->
<select id="getSemiProductInspectionInfo" parameterType="map" resultType="map">
SELECT SPI.OBJID
@@ -1815,7 +1678,6 @@
, COALESCE(SPI.DEFECT_TYPE, '') AS "DEFECT_TYPE"
, COALESCE(SPI.DEFECT_CAUSE, '') AS "DEFECT_CAUSE"
, COALESCE(SPI.RESPONSIBLE_DEPT, '') AS "RESPONSIBLE_DEPT"
, COALESCE(SPI.WORKER, '') AS "WORKER"
, COALESCE(SPI.PROCESS_STATUS, '') AS "PROCESS_STATUS"
, COALESCE(TO_CHAR(SPI.INSPECTION_DATE, 'YYYY-MM-DD'), '') AS "INSPECTION_DATE"
, COALESCE(SPI.INSPECTOR, '') AS "INSPECTOR"
@@ -1909,7 +1771,6 @@
, DEFECT_TYPE
, DEFECT_CAUSE
, RESPONSIBLE_DEPT
, WORKER
, PROCESS_STATUS
, INSPECTION_DATE
, INSPECTOR
@@ -1933,7 +1794,6 @@
, #{DEFECT_TYPE}
, #{DEFECT_CAUSE}
, #{RESPONSIBLE_DEPT}
, #{WORKER}
, #{PROCESS_STATUS}
, CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
, #{INSPECTOR}
@@ -1961,7 +1821,6 @@
, DEFECT_TYPE = #{DEFECT_TYPE}
, DEFECT_CAUSE = #{DEFECT_CAUSE}
, RESPONSIBLE_DEPT = #{RESPONSIBLE_DEPT}
, WORKER = #{WORKER}
, PROCESS_STATUS = #{PROCESS_STATUS}
, INSPECTION_DATE = CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
, INSPECTOR = #{INSPECTOR}
@@ -2043,15 +1902,11 @@
, CODE_NAME(CCS.ACTION_TYPE) AS ACTION_TYPE_NAME
, CCS.ACTION_CONTENT
, CCS.BLAME_DECISION
, CASE CCS.BLAME_DECISION WHEN 'R' THEN 'RPS' WHEN 'C' THEN '고객사' WHEN 'O' THEN '외주업체' WHEN 'E' THEN '단순문의' ELSE CCS.BLAME_DECISION END AS BLAME_DECISION_NAME
, CASE CCS.BLAME_DECISION WHEN 'R' THEN 'RPS' WHEN 'C' THEN '고객사' WHEN 'O' THEN '외주업체' ELSE CCS.BLAME_DECISION END AS BLAME_DECISION_NAME
, CCS.STATUS
, CCS.REMARK
, CCS.ACTION_DATE
, CCS.ACTION_USER_ID
, CCS.WRITER
, USER_NAME(CCS.WRITER) as WRITER_NAME
, CCS.RECEIPT_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.RECEIPT_USER_ID) AS RECEIPT_USER_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = CCS.OBJID AND AFI.DOC_TYPE = 'CUSTOMER_CS_ACTION' AND STATUS = 'Active') AS ATTACH_FILE
@@ -2139,21 +1994,14 @@
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
, CCS.ATTACH_FILE_OBJID
, CCS.WRITER
, USER_NAME(CCS.WRITER) AS WRITER_NAME
, CCS.RECEIPT_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.RECEIPT_USER_ID) AS RECEIPT_USER_NAME
, TO_CHAR(CCS.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM CUSTOMER_CS CCS
WHERE CCS.OBJID = #{OBJID}
</select>
<!-- 고객 CS 날짜별 순번 조회 (해당 날짜의 다음 순번 반환) -->
<select id="getCustomerCsSeqByDate" parameterType="map" resultType="int">
SELECT COALESCE(MAX(
CAST(SPLIT_PART(RECEIPT_NO, '-', 3) AS INTEGER)
), 0) + 1
FROM CUSTOMER_CS
WHERE RECEIPT_NO LIKE 'CS-' || #{TARGET_DATE} || '-%'
<!-- 고객 CS 시퀀스 조회 -->
<select id="getCustomerCsSeq" resultType="int">
SELECT NEXTVAL('SEQ_CUSTOMER_CS_RECEIPT_NO')
</select>
<!-- 고객 CS 등록 -->
@@ -2178,7 +2026,6 @@
, STATUS
, REMARK
, WRITER
, RECEIPT_USER_ID
, REG_DATE
) VALUES (
#{OBJID}
@@ -2200,7 +2047,6 @@
, #{STATUS}
, #{REMARK}
, #{WRITER}
, #{RECEIPT_USER_ID}
, NOW()
)
</insert>
@@ -2221,7 +2067,6 @@
, SERIAL_NO = #{SERIAL_NO}
, MANUFACTURER = #{MANUFACTURER}
, COMPLAINT_CONTENT = #{COMPLAINT_CONTENT}
, RECEIPT_USER_ID = #{RECEIPT_USER_ID}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
@@ -2240,18 +2085,6 @@
WHERE OBJID = #{OBJID}
</update>
<!-- 고객 CS 삭제 -->
<delete id="deleteCustomerCs" parameterType="map">
DELETE FROM CUSTOMER_CS WHERE OBJID = #{OBJID}
</delete>
<!-- 고객 CS 첨부파일 삭제 (이미지, 조치첨부) -->
<delete id="deleteCustomerCsAttachFiles" parameterType="map">
DELETE FROM ATTACH_FILE_INFO
WHERE TARGET_OBJID = #{OBJID}
AND DOC_TYPE IN ('CUSTOMER_CS_IMAGE', 'CUSTOMER_CS_ACTION')
</delete>
<!-- =====================================================
ECR 관리
===================================================== -->
@@ -2279,19 +2112,7 @@
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT' AND STATUS = 'Active') AS ATTACH_FILE
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_DOC' AND STATUS = 'Active') AS ECR_DOC_FILE
, CASE WHEN (ECR.ECR_DOC_SUMMARY IS NOT NULL AND ECR.ECR_DOC_SUMMARY != '') OR (ECR.ECR_DOC_REASON IS NOT NULL AND ECR.ECR_DOC_REASON != '') THEN 1 ELSE 0 END AS ECR_DOC_CNT
, ECR.CHANGE_TYPE
, CODE_NAME(ECR.CHANGE_TYPE) AS CHANGE_TYPE_NAME
, COALESCE(AMR.STATUS, '') AS AMARANTH_STATUS
, CASE
WHEN AMR.STATUS = 'complete' THEN '결재완료'
WHEN AMR.STATUS = 'inProcess' THEN '결재 상신중'
WHEN AMR.STATUS = 'reject' THEN '반려'
ELSE ''
END AS AMARANTH_STATUS_TITLE
FROM PMS_QUALITY_ECR ECR
LEFT OUTER JOIN AMARANTH_APPROVAL AMR
ON ECR.OBJID::VARCHAR = AMR.TARGET_OBJID
AND AMR.TARGET_TYPE = 'ECR'
WHERE 1=1
<if test="search_request_date_from != null and search_request_date_from != ''">
AND ECR.REQUEST_DATE >= #{search_request_date_from}
@@ -2338,9 +2159,6 @@
<if test="search_complete_date_to != null and search_complete_date_to != ''">
AND ECR.COMPLETE_DATE <![CDATA[<=]]> #{search_complete_date_to}
</if>
<if test="search_change_type != null and search_change_type != ''">
AND ECR.CHANGE_TYPE = #{search_change_type}
</if>
ORDER BY ECR.REQUEST_DATE DESC, ECR.REG_DATE DESC
</select>
@@ -2374,8 +2192,6 @@
, ECR.ECR_REV_DATE
, ECR.ECR_DOC_FORM_NO
, ECR.ECR_DOC_AUTHOR
, ECR.CHANGE_TYPE
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = ECR.CHANGE_TYPE) AS CHANGE_TYPE_NAME
FROM PMS_QUALITY_ECR ECR
WHERE ECR.OBJID = #{OBJID}
</select>
@@ -2401,7 +2217,6 @@
, DUE_DATE
, ACTION_DEPT
, ACTION_MANAGER_ID
, CHANGE_TYPE
, ATTACH_FILE_OBJID
, REMARK
, WRITER
@@ -2418,7 +2233,6 @@
, #{DUE_DATE}
, #{ACTION_DEPT}
, #{ACTION_MANAGER_ID}
, #{CHANGE_TYPE}
, #{ATTACH_FILE_OBJID}
, #{REMARK}
, #{WRITER}
@@ -2438,7 +2252,6 @@
, DUE_DATE = #{DUE_DATE}
, ACTION_DEPT = #{ACTION_DEPT}
, ACTION_MANAGER_ID = #{ACTION_MANAGER_ID}
, CHANGE_TYPE = #{CHANGE_TYPE}
, REMARK = #{REMARK}
, MODIFIER = #{WRITER}
, MOD_DATE = NOW()
@@ -2479,14 +2292,6 @@
SELECT IMI.OBJID
, IMI.PARENT_OBJID
, IM.PART_OBJID
/* 제품구분: PROJECT_MGMT.PRODUCT (코드명 조회) */
, COALESCE((SELECT CODE_NAME(PJM.PRODUCT) FROM SALES_REQUEST_MASTER SRM2
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM2.PROJECT_NO
WHERE SRM2.OBJID = POM.SALES_REQUEST_OBJID), '') AS PRODUCT_TYPE
/* 품명(모델명): PROJECT_MGMT.PART_NAME */
, COALESCE((SELECT PJM.PART_NAME FROM SALES_REQUEST_MASTER SRM2
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM2.PROJECT_NO
WHERE SRM2.OBJID = POM.SALES_REQUEST_OBJID), '') AS MODEL_NAME
, PM.PART_NO
, PM.PART_NAME
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
@@ -2538,7 +2343,7 @@
ORDER BY IMI.REGDATE, PM.PART_NO
</select>
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) - 팝업용 (기존) -->
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) -->
<select id="getIncomingInspectionProgressDetailList" parameterType="map" resultType="map">
SELECT IMI.OBJID
, IMI.PARENT_OBJID
@@ -2583,135 +2388,7 @@
ORDER BY IMI.REGDATE, PM.PART_NO
</select>
<!-- =====================================================
수입검사 진행 리스트 (입고품목 상세 기준) - 신규
===================================================== -->
<select id="getIncomingInspectionProgressList" parameterType="map" resultType="map">
SELECT IID.OBJID
/* 발주서 정보 */
, POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
, POM.PURCHASE_ORDER_NO
, (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
/* 프로젝트 정보 */
, PJM.PROJECT_NO
, CODE_NAME(PJM.PRODUCT) AS PRODUCT_NAME
, PJM.PART_NAME AS MODEL_NAME
/* 품목 정보 */
, IM.PART_OBJID
, PM.PART_NO
, PM.PART_NAME
/* 공급업체 */
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
/* 입고 정보 */
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
, IMI.RECEIPT_QTY AS DELIVERY_QTY
/* 입고결과 */
, (CASE
WHEN 0 <![CDATA[>=]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[>]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) AS DELIVERY_STATUS
/* 검사 정보 */
, IID.INSPECTION_YN
/* 검사수량 합계 (INCOMING_INSPECTION_DEFECT 테이블에서 집계) */
, COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) AS INSPECTION_QTY
/* 불량수량 합계 (INCOMING_INSPECTION_DEFECT 테이블에서 집계) */
, COALESCE((SELECT SUM(COALESCE(NULLIF(DEFECT_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) AS DEFECT_QTY_SUM
/* 불량율 (불량수량합계 / 검사수량합계 * 100) */
, CASE WHEN COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) > 0
THEN ROUND(COALESCE((SELECT SUM(COALESCE(NULLIF(DEFECT_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0)
/ COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 1) * 100, 2)
ELSE NULL END AS DEFECT_RATE
/* 검사일/검사자 (불량상세에서 최신 값) */
, (SELECT TO_CHAR(MAX(INSPECTION_DATE), 'YYYY-MM-DD') FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) AS INSPECTION_DATE
, (SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = (SELECT INSPECTOR_ID FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID ORDER BY INSPECTION_DATE DESC LIMIT 1)) AS INSPECTOR_NAME
/* 검사현황: 불량상세가 있고 전부 처리결과 입력 = 완료, 일부만 = 진행중, 없으면 미검사 */
, (CASE
WHEN (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) > 0
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
= (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
THEN '완료'
WHEN (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '') > 0
THEN '진행중'
ELSE ''
END) AS INSPECTION_RESULT
/* 검사성적서 파일 수 */
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = IID.OBJID AND DOC_TYPE = 'INSPECTION_REPORT' AND UPPER(STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = IM.PART_OBJID
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM.PROJECT_NO
WHERE 1=1
/* 검사여부가 '검사'인 항목만 조회 */
AND IID.INSPECTION_YN = '검사'
/* 검색 조건 */
<if test="search_proposal_no != null and search_proposal_no != ''">
AND (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) LIKE '%' || #{search_proposal_no} || '%'
</if>
<if test="search_purchase_order_no != null and search_purchase_order_no != ''">
AND TRIM(UPPER(POM.PURCHASE_ORDER_NO)) LIKE '%' || TRIM(UPPER(#{search_purchase_order_no})) || '%'
</if>
<if test="project_nos != null and project_nos != ''">
AND PJM.PROJECT_NO IN
<foreach item="item" collection="project_nos.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="search_part_objid != null and search_part_objid != ''">
AND PM.OBJID::VARCHAR = #{search_part_objid}
</if>
<if test="search_partner != null and search_partner != ''">
AND POM.PARTNER_OBJID = #{search_partner}
</if>
<if test="search_delivery_status != null and search_delivery_status != ''">
<if test="search_delivery_status == '입고완료'">
AND 0 <![CDATA[>=]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
</if>
<if test="search_delivery_status == '입고중'">
AND 0 <![CDATA[<]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
AND (TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[<=]]> POM.DELIVERY_DATE OR POM.DELIVERY_DATE IS NULL)
</if>
<if test="search_delivery_status == '지연'">
AND 0 <![CDATA[<]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
AND TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[>]]> POM.DELIVERY_DATE
</if>
</if>
<if test="search_product_cd != null and search_product_cd != ''">
AND PJM.PRODUCT = #{search_product_cd}
</if>
<if test="inspector_id != null and inspector_id != ''">
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTOR_ID = #{inspector_id})
</if>
<if test="inspection_start_date != null and inspection_start_date != ''">
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTION_DATE <![CDATA[>=]]> #{inspection_start_date}::DATE)
</if>
<if test="inspection_end_date != null and inspection_end_date != ''">
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTION_DATE <![CDATA[<=]]> #{inspection_end_date}::DATE)
</if>
<if test="search_inspection_status != null and search_inspection_status != ''">
<if test="search_inspection_status == '완료'">
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) > 0
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
= (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
</if>
<if test="search_inspection_status == '진행중'">
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '') > 0
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
> (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
</if>
</if>
ORDER BY IID.REG_DATE DESC, PM.PART_NO
</select>
<!-- 수입검사 상세 정보 조회 (발주서 기준 첫번째 검사 정보) - 기존 -->
<!-- 수입검사 상세 정보 조회 (발주서 기준 첫번째 검사 정보) -->
<select id="getIncomingInspectionDetailInfo" parameterType="map" resultType="map">
SELECT IID.INSPECTION_DATE
, IID.INSPECTOR_ID
@@ -2721,39 +2398,6 @@
LIMIT 1
</select>
<!-- 수입검사 진행 팝업용 상세 정보 조회 (INCOMING_INSPECTION_DETAIL.OBJID 기준) - 신규 -->
<select id="getIncomingInspectionProgressDetailInfo" parameterType="map" resultType="map">
SELECT IID.OBJID AS INSPECTION_DETAIL_OBJID
/* 발주서 정보 */
, POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
, POM.PURCHASE_ORDER_NO
, (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
/* 프로젝트 정보 */
, PJM.PROJECT_NO
, CODE_NAME(PJM.PRODUCT) AS PRODUCT_NAME
, PJM.PART_NAME AS MODEL_NAME
/* 품목 정보 */
, IM.PART_OBJID
, PM.PART_NO
, PM.PART_NAME
/* 공급업체 */
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
/* 입고 정보 */
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
, IMI.RECEIPT_QTY AS DELIVERY_QTY
/* 검사 정보 */
, IID.INSPECTION_YN
, IID.INSPECTION_QTY
FROM INCOMING_INSPECTION_DETAIL IID
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = IM.PART_OBJID
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM.PROJECT_NO
WHERE IID.OBJID = #{OBJID}
</select>
<!-- 수입검사 상세 저장 (UPSERT) -->
<update id="saveIncomingInspectionDetail" parameterType="map">
INSERT INTO INCOMING_INSPECTION_DETAIL (
@@ -2914,12 +2558,4 @@
WHERE INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID}
</delete>
<!-- 수입검사 상세 불량수량 합계 업데이트 -->
<update id="updateIncomingInspectionDetailDefectQty" parameterType="map">
UPDATE INCOMING_INSPECTION_DETAIL
SET DEFECT_QTY = #{DEFECT_QTY}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
</mapper>

View File

@@ -3161,8 +3161,7 @@ UPDATE SET
COALESCE(PM.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(PM.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(PM.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT,
COALESCE(PM.MAKER, '') AS MAKER,
'' AS VENDOR,
COALESCE(PM.MAKER, '') AS VENDOR,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
@@ -3172,7 +3171,7 @@ UPDATE SET
0 AS ORDER_QTY,
0 AS ITEM_QTY2,
0 AS PRODUCTION_QTY,
CASE WHEN SRP.PROCESSING_VENDOR IS NULL THEN '0000008377' ELSE SRP.PROCESSING_VENDOR END AS PROCESSING_VENDOR,
COALESCE(SRP.PROCESSING_VENDOR, '') AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
-- 구매 관련 컬럼 (SALES_REQUEST_PART에서 조회)
@@ -3463,7 +3462,7 @@ SELECT
G.RAW_MATERIAL_SPEC,
G.RAW_MATERIAL,
G.RAW_MATERIAL_SIZE AS SIZE,
CASE WHEN G.PROCESSING_VENDOR IS NULL THEN '0000008377' ELSE G.PROCESSING_VENDOR END AS PROCESSING_VENDOR,
G.PROCESSING_VENDOR,
G.PROCESSING_DEADLINE,
G.GRINDING_DEADLINE,
G.REQUIRED_QTY,
@@ -3472,7 +3471,7 @@ SELECT
G.STOCK_QTY,
G.SHORTAGE_QTY,
G.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
G.UNIT_PRICE,
G.TOTAL_PRICE,
G.CURRENCY,
@@ -3493,8 +3492,7 @@ SELECT
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, '') AS MAKER,
G.VENDOR AS VENDOR,
COALESCE(P.MAKER, G.VENDOR) AS VENDOR,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
@@ -3736,7 +3734,7 @@ SELECT
V.STOCK_QTY,
V.SHORTAGE_QTY,
V.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
V.UNIT_PRICE,
V.TOTAL_PRICE,
V.CURRENCY,
@@ -3759,8 +3757,7 @@ SELECT
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, '') AS MAKER,
V.VENDOR AS VENDOR,
COALESCE(P.MAKER, V.VENDOR) AS VENDOR,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
@@ -3900,43 +3897,21 @@ ORDER BY V.PATH2
<!-- ==================== 품의서 관리 ==================== -->
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 공급업체 기준 -->
<!-- 소재단가+공급업체가 입력된 품목 대상 (소재 유무에 따라 수량/합계 분기) -->
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 (PART_OBJID + SUPPLY_TYPE + RAW_MATERIAL + RAW_MATERIAL_SIZE) -->
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 소재단가 기준 -->
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MIN(MD.OBJID) AS OBJID,
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
MD.OBJID,
MD.PART_OBJID,
/* 소재 있으면 소재 PART_OBJID, 없으면 부품 PART_OBJID */
CASE WHEN COALESCE(MIN(MD.RAW_MATERIAL_PART_NO), '') != ''
THEN COALESCE(
(SELECT PM2.OBJID::VARCHAR FROM PART_MNG PM2 WHERE PM2.PART_NO = MIN(MD.RAW_MATERIAL_PART_NO) LIMIT 1),
MD.PART_OBJID::VARCHAR
)
ELSE MD.PART_OBJID::VARCHAR
END AS PROPOSAL_PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
CASE WHEN COALESCE(MIN(MD.RAW_MATERIAL_PART_NO), '') != ''
THEN SUM(COALESCE(MD.PO_QTY, 0))
ELSE SUM(COALESCE(MD.PRODUCTION_QTY, 0))
END AS QTY,
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
CASE WHEN COALESCE(MIN(MD.RAW_MATERIAL_PART_NO), '') != ''
THEN COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.PO_QTY, 0))
ELSE COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.PRODUCTION_QTY, 0))
END AS TOTAL_PRICE,
MIN(MD.VENDOR) AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.VENDOR)) AS VENDOR_NAME,
SUM(COALESCE(MD.NET_QTY, 0)) AS NET_QTY,
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
MIN(MD.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_NO,
COALESCE(MIN(MD.RAW_MATERIAL), '') AS RAW_MATERIAL,
COALESCE(MIN(MD.RAW_MATERIAL_SIZE), '') AS SIZE,
MIN(MD.UNIT) AS UNIT,
COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.UNIT_PRICE,
MD.TOTAL_PRICE,
MD.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
MD.NET_QTY,
MD.PO_QTY,
MD.PRODUCTION_QTY,
'MBOM' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
@@ -3952,33 +3927,24 @@ ORDER BY V.PATH2
AND MD.VENDOR != ''
-- 소재 품의서가 생성되지 않은 품목만
AND MD.PROPOSAL_DATE IS NULL
GROUP BY MD.PART_OBJID,
COALESCE(MD.SUPPLY_TYPE, ''),
COALESCE(MD.RAW_MATERIAL, ''),
COALESCE(MD.RAW_MATERIAL_SIZE, '')
ORDER BY MIN(MD.REGDATE)
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공업체 기준 -->
<!-- 가공단가+가공업체가 입력된 품목 대상 (부품, 제작수량) -->
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 -->
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공단가 기준 -->
<select id="getProposalTargetPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MIN(MD.OBJID) AS OBJID,
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
MD.OBJID,
MD.PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS QTY,
MIN(MD.PROCESSING_UNIT_PRICE) AS UNIT_PRICE,
COALESCE(MIN(MD.PROCESSING_UNIT_PRICE), 0) * SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS TOTAL_PRICE,
MIN(MD.PROCESSING_VENDOR) AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.PROCESSING_VENDOR)) AS VENDOR_NAME,
SUM(COALESCE(MD.NET_QTY, 0)) AS NET_QTY,
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
MIN(MD.UNIT) AS UNIT,
COALESCE(MIN(MD.USE_YN), 'Y') AS USE_YN,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
MD.PROCESSING_VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS VENDOR_NAME,
MD.NET_QTY,
MD.PO_QTY,
MD.PRODUCTION_QTY,
'MBOM' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
@@ -3994,24 +3960,19 @@ ORDER BY V.PATH2
AND MD.PROCESSING_VENDOR != ''
-- 가공 품의서가 생성되지 않은 품목만
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
GROUP BY MD.PART_OBJID,
COALESCE(MD.SUPPLY_TYPE, ''),
COALESCE(MD.RAW_MATERIAL, ''),
COALESCE(MD.RAW_MATERIAL_SIZE, '')
ORDER BY MIN(MD.REGDATE)
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (소재단가O, 공급업체X) -->
<!-- 동일 품번 그룹핑 -->
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MIN(MD.OBJID) AS OBJID,
MD.OBJID,
MD.PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
SUM(COALESCE(MD.QTY, 0)) AS QTY,
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
COALESCE(MIN(MD.UNIT_PRICE), 0) * SUM(COALESCE(MD.QTY, 0)) AS TOTAL_PRICE,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.UNIT_PRICE,
MD.TOTAL_PRICE,
'MBOM' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
@@ -4026,24 +3987,19 @@ ORDER BY V.PATH2
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
-- 소재 품의서가 생성되지 않은 품목만
AND MD.PROPOSAL_DATE IS NULL
GROUP BY MD.PART_OBJID,
COALESCE(MD.SUPPLY_TYPE, ''),
COALESCE(MD.RAW_MATERIAL, ''),
COALESCE(MD.RAW_MATERIAL_SIZE, '')
ORDER BY MIN(MD.REGDATE)
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (가공단가O, 가공업체X) -->
<!-- 동일 품번 그룹핑 -->
<select id="getProposalExcludedPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MIN(MD.OBJID) AS OBJID,
MD.OBJID,
MD.PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
SUM(COALESCE(MD.QTY, 0)) AS QTY,
MIN(MD.PROCESSING_UNIT_PRICE) AS UNIT_PRICE,
COALESCE(MIN(MD.PROCESSING_UNIT_PRICE), 0) * SUM(COALESCE(MD.QTY, 0)) AS TOTAL_PRICE,
PM.PART_NO,
PM.PART_NAME,
MD.QTY,
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
'MBOM' AS DATA_SOURCE,
'PROCESSING' AS PROPOSAL_TYPE
FROM
@@ -4058,38 +4014,24 @@ ORDER BY V.PATH2
AND (MD.PROCESSING_VENDOR IS NULL OR MD.PROCESSING_VENDOR = '')
-- 가공 품의서가 생성되지 않은 품목만
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
GROUP BY MD.PART_OBJID,
COALESCE(MD.SUPPLY_TYPE, ''),
COALESCE(MD.RAW_MATERIAL, ''),
COALESCE(MD.RAW_MATERIAL_SIZE, '')
ORDER BY MIN(MD.REGDATE)
ORDER BY MD.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 공급업체 기준 -->
<!-- 소재단가+공급업체가 입력된 품목 대상 (소재 유무에 따라 수량/합계 분기) -->
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 소재단가 기준 -->
<select id="getProposalTargetPartsFromManual" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
CASE WHEN SRP.RAW_MATERIAL_NO IS NOT NULL AND SRP.RAW_MATERIAL_NO != ''
THEN SRP.PO_QTY
ELSE SRP.PRODUCTION_QTY
END AS QTY,
SRP.QTY,
SRP.UNIT_PRICE,
CASE WHEN SRP.RAW_MATERIAL_NO IS NOT NULL AND SRP.RAW_MATERIAL_NO != ''
THEN COALESCE(SRP.UNIT_PRICE, 0) * COALESCE(SRP.PO_QTY, 0)
ELSE COALESCE(SRP.UNIT_PRICE, 0) * COALESCE(SRP.PRODUCTION_QTY, 0)
END AS TOTAL_PRICE,
SRP.TOTAL_PRICE,
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.NET_QTY,
SRP.PO_QTY,
SRP.PRODUCTION_QTY,
SRP.RAW_MATERIAL_NO,
SRP.RAW_MATERIAL,
SRP.SIZE,
'MANUAL' AS DATA_SOURCE,
'MATERIAL' AS PROPOSAL_TYPE
FROM
@@ -4108,15 +4050,14 @@ ORDER BY V.PATH2
ORDER BY SRP.REGDATE
</select>
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공업체 기준 -->
<!-- 가공단가+가공업체가 입력된 품목 대상 (부품, 제작수량) -->
<!-- 품의서 대상 품목 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) - 가공단가 기준 -->
<select id="getProposalTargetPartsFromManualProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
SRP.PRODUCTION_QTY AS QTY,
SRP.QTY,
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
SRP.PROCESSING_VENDOR AS VENDOR_PM,
@@ -4233,95 +4174,13 @@ ORDER BY V.PATH2
)
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 공급업체 -->
<!-- 그룹핑된 합산 데이터를 직접 INSERT (동일 품번 합산 대응) -->
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 소재 -->
<insert id="insertProposalPartFromMBom" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
PRODUCTION_QTY,
USE_YN,
MATERIAL_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
) VALUES (
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
#{PART_OBJID},
#{QTY},
#{UNIT},
#{UNIT_PRICE},
#{TOTAL_PRICE},
#{VENDOR_PM},
#{NET_QTY},
#{PO_QTY},
#{PRODUCTION_QTY},
#{USE_YN},
#{MATERIAL_YN},
NOW(),
#{WRITER},
NOW()
)
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 가공 -->
<!-- 그룹핑된 합산 데이터를 직접 INSERT (동일 품번 합산 대응) -->
<insert id="insertProposalPartFromMBomProcessing" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
PRODUCTION_QTY,
USE_YN,
MATERIAL_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
) VALUES (
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
#{PART_OBJID},
#{QTY},
#{UNIT},
#{UNIT_PRICE},
#{TOTAL_PRICE},
#{VENDOR_PM},
#{NET_QTY},
#{PO_QTY},
#{PRODUCTION_QTY},
#{USE_YN},
#{MATERIAL_YN},
NOW(),
#{WRITER},
NOW()
)
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 공급업체 -->
<!-- 소재 유무에 따라 QTY/TOTAL_PRICE 분기 -->
<insert id="insertProposalPartFromManual" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
@@ -4336,16 +4195,79 @@ ORDER BY V.PATH2
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
CASE WHEN RAW_MATERIAL_NO IS NOT NULL AND RAW_MATERIAL_NO != ''
THEN PO_QTY
ELSE PRODUCTION_QTY
END AS QTY,
UNIT,
QTY,
UNIT_PRICE,
CASE WHEN RAW_MATERIAL_NO IS NOT NULL AND RAW_MATERIAL_NO != ''
THEN COALESCE(UNIT_PRICE, 0) * COALESCE(PO_QTY, 0)
ELSE COALESCE(UNIT_PRICE, 0) * COALESCE(PRODUCTION_QTY, 0)
END AS TOTAL_PRICE,
TOTAL_PRICE,
VENDOR AS VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM MBOM_DETAIL
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 가공 -->
<insert id="insertProposalPartFromMBomProcessing" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
PRODUCTION_QTY AS QTY,
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
PROCESSING_VENDOR AS VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
NOW() AS PROPOSAL_DATE,
#{WRITER},
NOW()
FROM MBOM_DETAIL
WHERE OBJID = #{SOURCE_OBJID}
</insert>
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 소재 -->
<insert id="insertProposalPartFromManual" parameterType="map">
INSERT INTO SALES_REQUEST_PART (
OBJID,
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
USE_YN,
PROPOSAL_DATE,
WRITER,
REGDATE
)
SELECT
#{NEW_OBJID},
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
QTY,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
NET_QTY,
PO_QTY,
@@ -4364,7 +4286,6 @@ ORDER BY V.PATH2
SALES_REQUEST_MASTER_OBJID,
PART_OBJID,
QTY,
UNIT,
UNIT_PRICE,
TOTAL_PRICE,
VENDOR_PM,
@@ -4380,7 +4301,6 @@ ORDER BY V.PATH2
#{PROPOSAL_MASTER_OBJID},
PART_OBJID,
PRODUCTION_QTY AS QTY,
UNIT,
PROCESSING_UNIT_PRICE AS UNIT_PRICE,
PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
PROCESSING_VENDOR AS VENDOR_PM,
@@ -4689,22 +4609,16 @@ ORDER BY V.PATH2
WHERE SALES_REQUEST_MASTER_OBJID = SRM.OBJID
) AS PART_NAME,
CASE
WHEN AMR.STATUS = 'complete' THEN 'approvalComplete'
WHEN AMR.STATUS = 'inProcess' THEN 'inProcess'
WHEN AMR.STATUS = 'reject' THEN 'reject'
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
ELSE SRM.STATUS
END AS STATUS,
CASE
WHEN AMR.STATUS = 'complete' THEN '결재완료'
WHEN AMR.STATUS = 'inProcess' THEN '결재 상신중'
WHEN AMR.STATUS = 'reject' THEN '반려'
WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS
ELSE '등록중'
WHEN SRM.STATUS = 'create' THEN '작성중'
ELSE ''
END AS STATUS_TITLE,
COALESCE(AMR.STATUS, '') AS AMARANTH_STATUS,
SRM.WRITER,
(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME,
SRM.REGDATE,
@@ -4713,9 +4627,6 @@ ORDER BY V.PATH2
A.ROUTE_OBJID
FROM
SALES_REQUEST_MASTER SRM
LEFT OUTER JOIN AMARANTH_APPROVAL AMR
ON SRM.OBJID::VARCHAR = AMR.TARGET_OBJID
AND AMR.TARGET_TYPE = 'PROPOSAL'
LEFT OUTER JOIN (
SELECT
B.OBJID AS ROUTE_OBJID,
@@ -4764,9 +4675,6 @@ ORDER BY V.PATH2
<if test="SEARCH_STATUS != null and !''.equals(SEARCH_STATUS)">
AND (
CASE
WHEN AMR.STATUS = 'complete' THEN 'approvalComplete'
WHEN AMR.STATUS = 'inProcess' THEN 'inProcess'
WHEN AMR.STATUS = 'reject' THEN 'reject'
WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete'
WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess'
WHEN A.ROUTE_STATUS = 'reject' THEN 'reject'
@@ -4892,7 +4800,7 @@ ORDER BY V.PATH2
</select>
<!-- 품의서 품목 리스트 조회 -->
<select id="getProposalPartList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
<select id="getProposalPartList" parameterType="map" resultType="map">
SELECT
ROW_NUMBER() OVER(ORDER BY SRP.REGDATE) AS RNUM,
SRP.OBJID,
@@ -4901,17 +4809,14 @@ ORDER BY V.PATH2
PM.PART_NAME,
PM.SPEC,
PM.MATERIAL,
COALESCE(SRP.UNIT, PM.UNIT) AS UNIT,
SRP.UNIT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRP.UNIT),
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT)
) AS UNIT_TITLE,
SRP.QTY,
COALESCE(SRP.UNIT_PRICE, 0) AS UNIT_PRICE,
CASE
WHEN COALESCE(SRP.TOTAL_PRICE::NUMERIC, 0) > 0 THEN SRP.TOTAL_PRICE::NUMERIC
ELSE COALESCE(SRP.QTY::NUMERIC, 0) * COALESCE(SRP.UNIT_PRICE::NUMERIC, 0)
END AS TOTAL_PRICE,
SRP.UNIT_PRICE,
SRP.TOTAL_PRICE,
SRP.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
SRP.REMARK,
@@ -4968,35 +4873,6 @@ ORDER BY V.PATH2
WHERE MD.OBJID = #{OBJID}
</select>
<!-- 구매리스트 품목 정보 조회 (그룹핑된 OBJID 목록 합산) - 견적요청서 생성용 -->
<select id="getGroupedSalesRequestPartInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MIN(MD.OBJID) AS OBJID,
MIN(MD.MBOM_HEADER_OBJID) AS MBOM_HEADER_OBJID,
MD.PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
COALESCE(MIN(MD.RAW_MATERIAL), '') AS RAW_MATERIAL,
MIN(MD.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_NO,
COALESCE(MIN(MD.RAW_MATERIAL_SIZE), '') AS SIZE,
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
MIN(MD.PROCESSING_UNIT_PRICE) AS PROCESSING_UNIT_PRICE,
MIN(MD.VENDOR) AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.VENDOR)) AS VENDOR_NAME,
MIN(MD.PROCESSING_VENDOR) AS PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MIN(MD.PROCESSING_VENDOR)) AS PROCESSING_VENDOR_NAME,
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS
FROM MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE MD.OBJID::VARCHAR IN
<foreach item="objid" collection="OBJID_LIST" open="(" separator="," close=")">
#{objid}
</foreach>
GROUP BY MD.PART_OBJID
</select>
<!-- =====================================================
견적요청서 관리 쿼리
===================================================== -->
@@ -5097,7 +4973,7 @@ ORDER BY V.PATH2
LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON PM.OBJID = SRM.PROJECT_NO
LEFT JOIN CONTRACT_MGMT CTM ON CTM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID = CM.OBJID::VARCHAR
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID::VARCHAR = CM.OBJID::VARCHAR
WHERE 1=1
<if test="SALES_REQUEST_MASTER_OBJID != null and SALES_REQUEST_MASTER_OBJID != ''">
AND QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = #{SALES_REQUEST_MASTER_OBJID}
@@ -5116,16 +4992,8 @@ ORDER BY V.PATH2
<if test="VENDOR_OBJID != null and VENDOR_OBJID != ''">
AND QRM.VENDOR_OBJID::VARCHAR = #{VENDOR_OBJID}
</if>
<!-- 메일발송 여부 검색 (날짜 유무 기준) -->
<if test="MAIL_SEND_YN != null and MAIL_SEND_YN != ''">
<choose>
<when test="MAIL_SEND_YN == 'Y'.toString()">
AND QRM.MAIL_SEND_DATE IS NOT NULL
</when>
<otherwise>
AND QRM.MAIL_SEND_DATE IS NULL
</otherwise>
</choose>
<if test="STATUS != null and STATUS != ''">
AND QRM.STATUS = #{STATUS}
</if>
<!-- 작성자 검색 -->
<if test="writer != null and writer != ''">
@@ -5181,7 +5049,7 @@ ORDER BY V.PATH2
LEFT JOIN SALES_REQUEST_MASTER SRM ON QRM.SALES_REQUEST_MASTER_OBJID::VARCHAR = SRM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON PM.OBJID = SRM.PROJECT_NO
LEFT JOIN CONTRACT_MGMT CTM ON CTM.OBJID = PM.CONTRACT_OBJID
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID = CM.OBJID::VARCHAR
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID::VARCHAR = CM.OBJID::VARCHAR
WHERE QRM.OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
</select>
@@ -5200,25 +5068,16 @@ ORDER BY V.PATH2
QRD.UNIT_PRICE,
QRD.REMARK,
QRD.REG_DATE,
QRD.DELIVERY_REQUEST_DATE,
-- 마스터 정보
QRM.VENDOR_TYPE,
QRM.VENDOR_OBJID,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID) AS VENDOR_NAME
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID::VARCHAR) AS VENDOR_NAME
FROM QUOTATION_REQUEST_DETAIL QRD
LEFT JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
ORDER BY QRD.OBJID
</select>
<!-- 견적요청서 번호 셀렉트 목록 -->
<select id="getQuotationRequestNoList" parameterType="map" resultType="map">
SELECT DISTINCT QUOTATION_REQUEST_NO AS "CODE", QUOTATION_REQUEST_NO AS "NAME"
FROM QUOTATION_REQUEST_MASTER
WHERE QUOTATION_REQUEST_NO IS NOT NULL AND QUOTATION_REQUEST_NO != ''
ORDER BY QUOTATION_REQUEST_NO DESC
</select>
<!-- 견적요청서 번호 생성 -->
<select id="getNextQuotationRequestNo" parameterType="map" resultType="string">
SELECT 'Q' || TO_CHAR(NOW(), 'YYYYMMDD') || '-' || LPAD(NEXTVAL('SEQ_QUOTATION_REQUEST_NO')::VARCHAR, 3, '0')
@@ -5243,7 +5102,7 @@ ORDER BY V.PATH2
#{QUOTATION_REQUEST_NO},
#{SALES_REQUEST_MASTER_OBJID}::NUMERIC,
#{PROJECT_MGMT_OBJID}::NUMERIC,
#{VENDOR_OBJID},
#{VENDOR_OBJID}::NUMERIC,
#{VENDOR_TYPE},
'create',
<if test="DUE_DATE != null and DUE_DATE != ''">#{DUE_DATE}::DATE</if>
@@ -5285,12 +5144,11 @@ ORDER BY V.PATH2
)
</insert>
<!-- 견적요청서 상세 단가/입고요청일 업데이트 -->
<!-- 견적요청서 상세 단가 업데이트 -->
<update id="updateQuotationRequestDetailPrice" parameterType="map">
UPDATE QUOTATION_REQUEST_DETAIL SET
UNIT_PRICE = #{UNIT_PRICE}::NUMERIC,
TOTAL_PRICE = #{QTY}::NUMERIC * #{UNIT_PRICE}::NUMERIC,
DELIVERY_REQUEST_DATE = CASE WHEN #{DELIVERY_REQUEST_DATE} IS NOT NULL AND #{DELIVERY_REQUEST_DATE} != '' THEN #{DELIVERY_REQUEST_DATE} ELSE NULL END,
EDIT_DATE = NOW()
WHERE OBJID = #{OBJID}::NUMERIC
</update>
@@ -5317,9 +5175,6 @@ ORDER BY V.PATH2
<if test="VENDOR_TYPE == 'PROCESSING'">
PROCESSING_UNIT_PRICE = #{UNIT_PRICE}::NUMERIC
</if>
<if test="DELIVERY_REQUEST_DATE != null and DELIVERY_REQUEST_DATE != ''">
, DELIVERY_REQUEST_DATE = #{DELIVERY_REQUEST_DATE}
</if>
, EDIT_DATE = NOW()
WHERE OBJID IN (
SELECT MD2.OBJID
@@ -5342,89 +5197,71 @@ ORDER BY V.PATH2
WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
</update>
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (동일 품번 그룹핑) -->
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) -->
<!-- 공급업체/가공업체별로 견적요청서 생성 가능 여부 플래그 포함 -->
<select id="getPurchaseListForQuotationFromMBom" parameterType="map" resultType="map">
WITH GROUPED_MBOM AS (
SELECT
MIN(MD.OBJID) AS OBJID,
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
MD.PART_OBJID,
MIN(PM.PART_NO) AS PART_NO,
MIN(PM.PART_NAME) AS PART_NAME,
COALESCE(MIN(MD.RAW_MATERIAL), '') AS RAW_MATERIAL,
COALESCE(MIN(MD.RAW_MATERIAL_SIZE), '') AS SIZE,
SUM(COALESCE(MD.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(MD.PRODUCTION_QTY, 0)) AS PRODUCTION_QTY,
MIN(MD.UNIT_PRICE) AS UNIT_PRICE,
MIN(MD.PROCESSING_UNIT_PRICE) AS PROCESSING_UNIT_PRICE,
MIN(MD.VENDOR) AS VENDOR_PM,
MIN(MD.PROCESSING_VENDOR) AS PROCESSING_VENDOR,
MIN(MD.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_NO
FROM MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
AND (
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '')
OR (MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '')
)
GROUP BY MD.PART_OBJID,
COALESCE(MD.SUPPLY_TYPE, ''),
COALESCE(MD.RAW_MATERIAL, ''),
COALESCE(MD.RAW_MATERIAL_SIZE, '')
)
SELECT
G.OBJID,
G.ORIGINAL_OBJIDS,
MD.OBJID,
#{SALES_REQUEST_MASTER_OBJID} AS SALES_REQUEST_MASTER_OBJID,
G.PART_OBJID,
G.PART_NO,
G.PART_NAME,
G.RAW_MATERIAL,
G.SIZE,
G.PO_QTY,
G.PRODUCTION_QTY,
G.UNIT_PRICE,
G.PROCESSING_UNIT_PRICE,
G.VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = G.VENDOR_PM) AS VENDOR_NAME,
G.PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = G.PROCESSING_VENDOR) AS PROCESSING_VENDOR_NAME,
G.RAW_MATERIAL_NO,
MD.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
MD.RAW_MATERIAL,
MD.RAW_MATERIAL_SIZE AS SIZE,
MD.PO_QTY,
MD.PRODUCTION_QTY,
MD.UNIT_PRICE,
MD.PROCESSING_UNIT_PRICE,
MD.VENDOR AS VENDOR_PM,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.VENDOR) AS VENDOR_NAME,
MD.PROCESSING_VENDOR,
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = MD.PROCESSING_VENDOR) AS PROCESSING_VENDOR_NAME,
MD.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
'MBOM' AS DATA_SOURCE,
CASE WHEN G.VENDOR_PM IS NOT NULL AND G.VENDOR_PM != '' AND NOT EXISTS (
-- 공급업체 견적요청서 생성 가능 여부
CASE WHEN MD.VENDOR IS NOT NULL AND MD.VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'SUPPLY'
AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_SUPPLY,
CASE WHEN G.PROCESSING_VENDOR IS NOT NULL AND G.PROCESSING_VENDOR != '' AND NOT EXISTS (
-- 가공업체 견적요청서 생성 가능 여부
CASE WHEN MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'PROCESSING'
AND QRM.VENDOR_OBJID::VARCHAR = G.PROCESSING_VENDOR
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_PROCESSING
FROM GROUPED_MBOM G
WHERE (
(G.VENDOR_PM IS NOT NULL AND G.VENDOR_PM != '' AND NOT EXISTS (
FROM MBOM_DETAIL MD
LEFT JOIN PART_MNG PM ON MD.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE MD.MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
AND (
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '')
OR (MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '')
)
-- 공급업체 또는 가공업체 중 하나라도 견적요청서 생성 가능해야 함
AND (
-- 공급업체 견적요청서 생성 가능
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'SUPPLY'
AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
))
OR
(G.PROCESSING_VENDOR IS NOT NULL AND G.PROCESSING_VENDOR != '' AND NOT EXISTS (
-- 가공업체 견적요청서 생성 가능
(MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '' AND NOT EXISTS (
SELECT 1 FROM QUOTATION_REQUEST_DETAIL QRD
INNER JOIN QUOTATION_REQUEST_MASTER QRM ON QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
WHERE QRD.SALES_REQUEST_PART_OBJID::VARCHAR = MD.OBJID::VARCHAR
AND QRM.VENDOR_TYPE = 'PROCESSING'
AND QRM.VENDOR_OBJID::VARCHAR = G.PROCESSING_VENDOR
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
))
)
ORDER BY G.PART_NO
ORDER BY MD.REGDATE
</select>
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) -->

View File

@@ -3556,56 +3556,54 @@ SELECT (CASE WHEN GROUPING(cc.code_id) = 1 THEN '소계' ELSE cc.CODE_ID END) AS
</select>
<select id="getContractDashBoard" parameterType="map" resultType="map">
/* contractMgmt.getContractDashBoard - 수주현황 대시보드 (ORDER_TOTAL_AMOUNT 기준) */
WITH WITH_BASE_DATA AS (
SELECT *
, CAST(DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) AS DATE) AS MONTH_FIRST_DAY
, (DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) + INTERVAL '1 MONTH - 1 DAY')::DATE AS MONTH_LAST_DAY
, (DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) + INTERVAL '1 MONTH - 1 DAY')::DATE AS MONTH_LAST_DAY
FROM
(
(SELECT
OBJID
, CODE_ID
, CODE_NAME
FROM COMM_CODE CC
WHERE PARENT_CODE_ID = '0000001'
) CD
INNER JOIN (
SELECT #{Year}|| RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH
,#{Year}|| '-'||RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH2
,LINE_VALUE MM
FROM GENERATE_SERIES(1,12) AS TBL(LINE_VALUE)
) YEAR_MONTH
ON 1=1
) CD
LEFT OUTER JOIN(
SELECT
CM.PRODUCT
,TO_CHAR(TO_DATE(CM.ORDER_DATE,'YYYY-MM-DD'),'YYYYMM') AS CONTRACT_YEAR_MONTH
,SUM(COALESCE(NULLIF(CM.ORDER_SUPPLY_PRICE,'')::NUMERIC, 0)) ORDER_SUPPLY_PRICE
,SUM(COALESCE(NULLIF(CM.ORDER_VAT,'')::NUMERIC, 0)) ORDER_VAT
,SUM(COALESCE(NULLIF(CM.ORDER_TOTAL_AMOUNT,'')::NUMERIC, 0)) ORDER_TOTAL_AMOUNT
,COUNT(1) CONTRACT_CNT
,SUM(CM.QTY) QTY
FROM
(SELECT CM.PRODUCT
,CM.ORDER_DATE
,CM.ORDER_SUPPLY_PRICE
,CM.ORDER_VAT
,CM.ORDER_TOTAL_AMOUNT
,( SELECT COUNT(1) QTY
FROM PROJECT_MGMT AS PM
RIGHT JOIN RELEASE_MGMT AS RM
ON PM.OBJID = RM.PARENT_OBJID
WHERE CM.OBJID = PM.CONTRACT_OBJID
) QTY
FROM CONTRACT_MGMT CM
LEFT OUTER JOIN SUPPLY_MNG SM
(
(SELECT
OBJID
, CODE_ID
, CODE_NAME
FROM COMM_CODE CC
WHERE PARENT_CODE_ID = '0000001'
) CD
INNER JOIN (SELECT #{Year}|| RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH
,#{Year}|| '-'||RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH2
,LINE_VALUE MM
FROM GENERATE_SERIES(1,12) AS TBL(LINE_VALUE)) YEAR_MONTH
ON 1=1
) CD
LEFT OUTER JOIN(
SELECT
CM.PRODUCT
,TO_CHAR(TO_DATE(CM.CONTRACT_DATE,'YYYY-MM-DD'),'YYYYMM') AS CONTRACT_YEAR_MONTH
,SUM(COALESCE(CM.CONTRACT_PRICE::FLOAT,0)) CONTRACT_COST
,COUNT(1) CONTRACT_CNT
,SUM(CM.QTY) QTY
FROM
(SELECT CM.PRODUCT
,CM.CONTRACT_DATE
,(CASE WHEN NVL(CM.CONTRACT_PRICE, '0') != '0' THEN NVL(CM.CONTRACT_PRICE, '0')
WHEN CONTRACT_CURRENCY = '0001566' AND NVL(CM.CONTRACT_PRICE_CURRENCY, '0') != '0' THEN NVL(CM.CONTRACT_PRICE_CURRENCY, '0')
ELSE NVL(CM.CONTRACT_PRICE, '0')
END) CONTRACT_PRICE
,( SELECT COUNT(1) QTY
FROM PROJECT_MGMT AS PM
RIGHT JOIN RELEASE_MGMT AS RM
ON PM.OBJID = RM.PARENT_OBJID
WHERE CM.OBJID = PM.CONTRACT_OBJID
) QTY
FROM CONTRACT_MGMT CM
LEFT OUTER JOIN SUPPLY_MNG SM
ON CM.CUSTOMER_OBJID = SM.OBJID::VARCHAR
WHERE CM.ORDER_DATE IS NOT NULL
AND CM.CONTRACT_RESULT = '0000964'
WHERE CM.CONTRACT_DATE IS NOT NULL
AND CM.CONTRACT_RESULT = '0000964'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
<!-- AND TO_CHAR(CM.REGDATE,'YYYY') = #{Year} -->
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND UPPER(CUSTOMER_OBJID) LIKE UPPER('%${customer_objid}%')
@@ -3614,36 +3612,58 @@ SELECT (CASE WHEN GROUPING(cc.code_id) = 1 THEN '소계' ELSE cc.CODE_ID END) AS
AND PRODUCER_CD = #{producer_cd}
</if>
<if test="category_cd !=null and category_cd != '' ">
AND CATEGORY_CD = #{category_cd}
</if>
<if test="product !=null and product != '' ">
AND CATEGORY_CD = #{category_cd}
</if>
<if test="product !=null and product != '' ">
AND CM.PRODUCT = #{product}
</if>
) CM
GROUP BY CM.PRODUCT
,TO_CHAR(TO_DATE(CM.ORDER_DATE,'YYYY-MM-DD'),'YYYYMM')
) CT
ON CD.CODE_ID = CT.PRODUCT
AND CD.YEAR_MONTH = CT.CONTRACT_YEAR_MONTH
GROUP BY CM.PRODUCT
,TO_CHAR(TO_DATE(CM.CONTRACT_DATE,'YYYY-MM-DD'),'YYYYMM')
) CT
ON CD.CODE_ID = CT.PRODUCT
AND CD.YEAR_MONTH = CT.CONTRACT_YEAR_MONTH
<!-- 240822 아래쿼리는 문제 있어서 위 서브쿼리로 이동(QTY 출고수량)
LEFT OUTER JOIN(
SELECT RM1.PRODUCT
,TO_CHAR(TO_DATE(RM1.RELEASE_DATE,'YYYY-MM-DD'),'MM') AS RELEASE_YEAR_MONTH
,1 AS QTY
FROM CONTRACT_MGMT CM1,(SELECT RM.*,PM.CONTRACT_OBJID FROM PROJECT_MGMT AS PM RIGHT JOIN RELEASE_MGMT AS RM
ON PM.OBJID = RM.PARENT_OBJID) AS RM1
WHERE CM1.OBJID = RM1.CONTRACT_OBJID
<if test="Year !=null and Year != '' ">
AND TO_CHAR(TO_DATE(RM1.RELEASE_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
</if>
<if test="category_cd !=null and category_cd != '' ">
AND CATEGORY_CD = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product !=null and product != '' ">
AND RM1.PRODUCT = #{product}
</if>
) AS RM
ON CD.CODE_ID = RM.PRODUCT
AND CD.YEAR_MONTH = RM.RELEASE_YEAR_MONTH
-->
)
SELECT
'1' ORDER_NO
,YEAR_MONTH
,MM
,SUM(COALESCE(CONTRACT_CNT, 0)) CONTRACT_CNT_YEAR
,SUM(COALESCE(ORDER_SUPPLY_PRICE, 0)) ORDER_SUPPLY_PRICE_YEAR
,SUM(COALESCE(ORDER_VAT, 0)) ORDER_VAT_YEAR
,SUM(COALESCE(ORDER_TOTAL_AMOUNT, 0)) CONTRACT_COST_YEAR_ORG
,SUM(COALESCE(ORDER_TOTAL_AMOUNT, 0))/100000000 CONTRACT_COST_YEAR
,SUM(COALESCE(QTY, 0)) RELEASE_CNT_YEAR
<foreach collection="moldKindCdList" item="obj">
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_CNT ELSE 0 END) CONTRACT_CNT_MONTH_${obj.CODE}
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN ORDER_TOTAL_AMOUNT ELSE 0 END) CONTRACT_COST_MONTH_${obj.CODE}
'1' ORDER_NO
,YEAR_MONTH
,MM
,SUM(COALESCE(CONTRACT_CNT, 0)) CONTRACT_CNT_YEAR
,SUM(COALESCE(CONTRACT_COST, 0)) CONTRACT_COST_YEAR_ORG
,SUM(COALESCE(CONTRACT_COST, 0))/100000000 CONTRACT_COST_YEAR
,SUM(COALESCE(QTY, 0)) RELEASE_CNT_YEAR
<foreach collection="moldKindCdList" item="obj">
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_CNT ELSE 0 END) CONTRACT_CNT_MONTH_${obj.CODE}
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_COST ELSE 0 END) CONTRACT_COST_MONTH_${obj.CODE}
</foreach>
,#{Year} AS TARGET_YEAR
FROM WITH_BASE_DATA
GROUP BY ROLLUP (
(YEAR_MONTH, MM) )
(YEAR_MONTH, MM) )
ORDER BY YEAR_MONTH
</select>
@@ -3662,20 +3682,23 @@ SELECT year, annual, five
<!-- 영업목표 -->
<select id="getYearGoalInfo" parameterType="map" resultType="map">
/* contractMgmt.getYearGoalInfo - 연간 목표 대비 실적 (ORDER_TOTAL_AMOUNT 기준) */
WITH W_CM AS (
SELECT
AREA_CD,
COALESCE(NULLIF(CM.ORDER_TOTAL_AMOUNT, '')::NUMERIC, 0) AS ORDER_TOTAL_AMOUNT
FROM CONTRACT_MGMT CM
WHERE (CM.CONTRACT_RESULT = '0000964' or CM.CONTRACT_RESULT = '0000968')
AND CM.ORDER_DATE IS NOT NULL
AND TO_CHAR(TO_DATE(ORDER_DATE, 'YYYY-MM-DD'), 'YYYY') = #{Year}
)
SELECT
AREA_CD,
<!-- (SUM(COALESCE( -->
(CASE WHEN NVL(CM.CONTRACT_PRICE, '0') != '0' THEN NVL(CM.CONTRACT_PRICE, '0')
WHEN CONTRACT_CURRENCY = '0001566' AND NVL(CM.CONTRACT_PRICE_CURRENCY, '0') != '0' THEN NVL(CM.CONTRACT_PRICE_CURRENCY, '0')
ELSE NVL(CM.CONTRACT_PRICE, '0')
END) CONTRACT_PRICE
<!-- ::FLOAT, 0))) CONTRACT_PRICE -->
FROM CONTRACT_MGMT CM
WHERE CM.CONTRACT_RESULT = '0000964'
AND TO_CHAR(TO_DATE(CONTRACT_DATE, 'YYYY-MM-DD'), 'YYYY') = #{Year}
)
SELECT
*
,CASE WHEN CONTRACT_CNT_YEAR_ALL IS NULL OR CONTRACT_CNT_YEAR_ALL = 0 THEN NULL
ELSE CONTRACT_CNT_YEAR / CONTRACT_CNT_YEAR_ALL * 100 END AS CONTRACT_CNT_YEAR_RATE
ELSE CONTRACT_CNT_YEAR / CONTRACT_CNT_YEAR_ALL * 100 END AS CONTRACT_CNT_YEAR_RATE
FROM(
SELECT
OBJID YEAR_GOAL_OBJID
@@ -3683,19 +3706,23 @@ SELECT year, annual, five
,PRICE::integer
,WRITER
,REGDATE
,(SELECT count(1) FROM CONTRACT_MGMT WHERE ORDER_DATE IS NOT NULL AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year} ) AS CONTRACT_CNT_YEAR_ALL
,(SELECT count(1) FROM CONTRACT_MGMT WHERE TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year} ) AS CONTRACT_CNT_YEAR_ALL
,(SELECT count(1) FROM W_CM CM ) AS CONTRACT_CNT_YEAR
,(SELECT count(1) FROM W_CM CM WHERE AREA_CD = '0001220' ) AS CONTRACT_CNT_YEAR_IN
,(SELECT count(1) FROM W_CM CM WHERE AREA_CD = '0001221' ) AS CONTRACT_CNT_YEAR_OUT
,COALESCE((SELECT SUM(ORDER_TOTAL_AMOUNT)/100000000 FROM W_CM CM)::integer, 0) AS CONTRACT_COST_YEAR
,coalesce((SELECT (SUM(coalesce(NVL(CM.CONTRACT_PRICE, '0')::FLOAT, 0)))/100000000 FROM W_CM CM )::integer,0) AS CONTRACT_COST_YEAR
<!-- ,(SELECT ROUND(SUM(CASE WHEN CONTRACT_PRICE IS NULL OR CONTRACT_PRICE = '' THEN '0' ELSE CONTRACT_PRICE::INTEGER END) / 100000000.0, 1) FROM CONTRACT_MGMT WHERE TO_CHAR(CONTRACT_DATE::DATE, 'YYYY') = #{Year}) AS CONTRACT_COST_YEAR-->
,CASE
WHEN PRICE IS NULL OR PRICE::integer = 0
THEN 0
ELSE COALESCE((((SELECT SUM(ORDER_TOTAL_AMOUNT)/100000000 FROM W_CM CM) / price::integer) * 100), 0)
END AS GOAL_RATE
WHEN PRICE IS NULL OR PRICE::integer = 0
THEN 0
ELSE coalesce((((select (SUM(coalesce(NVL(CM.CONTRACT_PRICE, '0')::FLOAT, 0)))/100000000 FROM W_CM CM) / price::integer) * 100),0)
END AS GOAL_RATE
FROM
PMS_PJT_YEAR_GOAL FMB
WHERE 1=1
<!--
AND OBJID = #{OBJID}
-->
<if test="YEAR_GOAL_OBJID != null and !''.equals(YEAR_GOAL_OBJID)">
AND OBJID = #{YEAR_GOAL_OBJID}
</if>
@@ -3745,10 +3772,10 @@ SELECT year, annual, five
<select id="getContractCNTBySupply" parameterType="map" resultType="map">
SELECT
ASM.OBJID
,ASM.CLIENT_NM
,ASM.SUPPLY_NAME
,S1.*
FROM
CLIENT_MNG ASM
SUPPLY_MNG ASM
,(
SELECT
CM.CUSTOMER_OBJID
@@ -3757,12 +3784,12 @@ FROM
FROM
CONTRACT_MGMT CM
WHERE CM.CONTRACT_RESULT = '0000964'
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
GROUP BY CM.CUSTOMER_OBJID
) AS S1
WHERE 1=1
AND 'C_' || ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
ORDER BY ASM.CLIENT_NM
AND ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
ORDER BY ASM.SUPPLY_NAME
</select>

View File

@@ -2142,102 +2142,6 @@ ORDER BY T.REGDATE DESC, T.PROJECT_NO DESC
LOADING_DATE = #{loadingDate}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!--
/**
* 매출마감 전표연동용 데이터 조회
* OBJID 리스트로 전표 생성에 필요한 모든 정보를 일괄 조회한다.
* @since 2026.02.24
* @author system
* @version 1.0
**/
-->
<select id="getErpAccountCode" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* salesNcollectMgmt.getErpAccountCode - ERP 계정과목코드 조회 */
SELECT acct_cd AS ACCT_CD, acct_nm AS ACCT_NM
FROM erp_acct_code
WHERE co_cd = #{coCd}
AND acct_nm = #{acctNm}
LIMIT 1
</select>
<select id="getSlipDataForDeadline" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* salesNcollectMgmt.getSlipDataForDeadline - 매출마감 전표연동용 데이터 조회 */
SELECT
PM.OBJID,
PM.PROJECT_NO,
PM.AREA_CD,
PM.CUSTOMER_OBJID,
PM.PART_NO,
PM.PART_NAME,
COALESCE(PM.TAX_TYPE, '') AS TAX_TYPE,
COALESCE(PM.TAX_INVOICE_DATE, '') AS TAX_INVOICE_DATE,
COALESCE(PM.EXPORT_DECL_NO, '') AS EXPORT_DECL_NO,
COALESCE(PM.LOADING_DATE, '') AS LOADING_DATE,
COALESCE(PM.SALES_STATUS, '') AS SALES_STATUS,
/* 거래처 정보: ERP 연동 거래처(C_ 접두어)에서 client_cd 조회 */
CASE WHEN PM.CUSTOMER_OBJID LIKE 'C_%' THEN
(SELECT C.CLIENT_CD FROM CLIENT_MNG C WHERE 'C_' || C.OBJID::VARCHAR = PM.CUSTOMER_OBJID)
ELSE NULL END AS ERP_CLIENT_CD,
CASE WHEN PM.CUSTOMER_OBJID LIKE 'C_%' THEN
(SELECT C.CLIENT_NM FROM CLIENT_MNG C WHERE 'C_' || C.OBJID::VARCHAR = PM.CUSTOMER_OBJID)
ELSE
(SELECT S.SUPPLY_NAME FROM SUPPLY_MNG S WHERE S.OBJID::VARCHAR = PM.CUSTOMER_OBJID::VARCHAR)
END AS CUSTOMER_NAME,
CASE WHEN PM.CUSTOMER_OBJID LIKE 'C_%' THEN
(SELECT C.BUS_REG_NO FROM CLIENT_MNG C WHERE 'C_' || C.OBJID::VARCHAR = PM.CUSTOMER_OBJID)
ELSE NULL END AS BUS_REG_NO,
/* 판매 금액 정보 */
COALESCE(SR.SALES_SUPPLY_PRICE, 0) AS SALES_SUPPLY_PRICE,
COALESCE(SR.SALES_VAT, 0) AS SALES_VAT,
COALESCE(SR.SALES_TOTAL_AMOUNT, 0) AS SALES_TOTAL_AMOUNT,
/* 환종/환율 (해외) */
COALESCE(SR.SALES_CURRENCY, PM.CONTRACT_CURRENCY) AS SALES_CURRENCY,
COALESCE(SR.SALES_EXCHANGE_RATE, 0) AS SALES_EXCHANGE_RATE,
/* 외화 총액 계산: 원화총액 / 환율 (환율이 0이 아닐 때) */
CASE WHEN COALESCE(SR.SALES_EXCHANGE_RATE, 0) > 0 THEN
ROUND(COALESCE(SR.SALES_TOTAL_AMOUNT, 0)::NUMERIC / SR.SALES_EXCHANGE_RATE::NUMERIC, 2)
ELSE 0 END AS FOREIGN_AMOUNT
FROM PROJECT_MGMT PM
LEFT JOIN SALES_REGISTRATION SR ON PM.PROJECT_NO = SR.PROJECT_NO
WHERE PM.OBJID::VARCHAR = #{OBJID}
</select>
<!--
/**
* 매출마감 전표번호 시퀀스 조회
* 동일 일자의 최대 작성번호를 조회하여 다음 번호를 부여한다.
* @since 2026.02.24
* @author system
* @version 1.0
**/
-->
<select id="getNextSlipMenuSq" parameterType="map" resultType="int">
/* salesNcollectMgmt.getNextSlipMenuSq - 다음 전표 작성번호 조회 */
SELECT COALESCE(MAX(SLIP_MENU_SQ), 0) + 1
FROM PROJECT_MGMT
WHERE SALES_SLIP_DATE = #{slipDate}
AND SALES_SLIP_MENU_SQ IS NOT NULL
</select>
<!--
/**
* 매출마감 완료 후 전표 정보 저장
* @since 2026.02.24
* @author system
* @version 1.0
**/
-->
<update id="updateSlipInfo" parameterType="map">
/* salesNcollectMgmt.updateSlipInfo - 전표 연동 정보 저장 */
UPDATE PROJECT_MGMT
SET
SALES_STATUS = '완료',
SALES_DEADLINE_DATE = #{deadlineDate},
SALES_SLIP_DATE = #{slipDate},
SALES_SLIP_MENU_SQ = #{slipMenuSq}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
</mapper>

View File

@@ -724,6 +724,7 @@
ET.NOTE3,
ET.NOTE4,
ET.NOTE_REMARKS,
ET.NOTES_CONTENT,
ET.VALIDITY_PERIOD,
TO_CHAR(ET.REGDATE, 'YYYY-MM-DD') AS REGDATE,
CM.CONTRACT_NO,

View File

@@ -3476,7 +3476,7 @@ WHERE 1=1
</choose>
</if>
ORDER BY SPLIT_PART( PURCHASE_ORDER_NO, '-', 3)::NUMERIC DESC
ORDER BY POM.REGDATE DESC
</select>
<select id="purchaseOrderMasterList_new_old" parameterType="map" resultType="map">

View File

@@ -2167,6 +2167,7 @@ public class ApprovalService {
* 견적서 데이터를 HTML 파일로 구성 (결재 첨부파일용)
*/
private String buildEstimateFormFileHtml(Map estimateInfo, List<Map> itemList){
String templateType = CommonUtils.checkNull(estimateInfo.get("TEMPLATE_TYPE"));
String estimateNo = CommonUtils.checkNull(estimateInfo.get("ESTIMATE_NO"));
String contractNo = CommonUtils.checkNull(estimateInfo.get("CONTRACT_NO"));
String customerName = CommonUtils.checkNull(estimateInfo.get("CUSTOMER_NAME"));
@@ -2181,51 +2182,53 @@ public class ApprovalService {
String modelName = CommonUtils.checkNull(estimateInfo.get("MODEL_NAME"));
String validityPeriod = CommonUtils.checkNull(estimateInfo.get("VALIDITY_PERIOD"));
String noteRemarks = CommonUtils.checkNull(estimateInfo.get("NOTE_REMARKS"));
String note1 = CommonUtils.checkNull(estimateInfo.get("NOTE1"));
String note2 = CommonUtils.checkNull(estimateInfo.get("NOTE2"));
String note3 = CommonUtils.checkNull(estimateInfo.get("NOTE3"));
String note4 = CommonUtils.checkNull(estimateInfo.get("NOTE4"));
String notesContent = CommonUtils.checkNull(estimateInfo.get("NOTES_CONTENT"));
String managerName = CommonUtils.checkNull(estimateInfo.get("MANAGER_NAME"));
String managerContact = CommonUtils.checkNull(estimateInfo.get("MANAGER_CONTACT"));
StringBuilder html = new StringBuilder();
html.append("<!DOCTYPE html><html><head><meta charset='UTF-8'>");
html.append("<title>견적서 - " + estimateNo + "</title>");
html.append("<title>견적서 - ").append(estimateNo).append("</title>");
html.append("<style>body{font-family:'맑은 고딕',sans-serif;font-size:10pt;margin:20px;}");
html.append("table{border-collapse:collapse;width:100%;}");
html.append("th,td{border:1px solid #333;padding:6px 8px;font-size:9pt;}");
html.append("th{background-color:#4472C4;color:#fff;text-align:center;}");
html.append(".header{font-size:14pt;font-weight:bold;text-align:center;margin-bottom:15px;}");
html.append(".info-table td{border:1px solid #999;} .info-table th{background-color:#D9E2F3;color:#333;}");
html.append(".notes{margin-top:10px;padding:8px;border:1px solid #999;font-size:9pt;}");
html.append("</style></head><body>");
html.append("<div class='header'>견 적 서</div>");
// 기본 정보 테이블
html.append("<table class='info-table' style='margin-bottom:15px;'>");
html.append("<tr><th style='width:15%'>견적번호</th><td style='width:35%'>" + estimateNo + "</td>");
html.append("<th style='width:15%'>영업번호</th><td style='width:35%'>" + contractNo + "</td></tr>");
html.append("<tr><th>고객사</th><td>" + customerName + "</td>");
html.append("<th>작성일</th><td>" + regdate + "</td></tr>");
html.append("<tr><th>수신</th><td>" + recipient + "</td>");
html.append("<th>담당자</th><td>" + contactPerson + "</td></tr>");
html.append("<tr><th>작성자</th><td>" + writerName + "</td>");
html.append("<th>모델명</th><td>" + modelName + "</td></tr>");
html.append("<tr><th style='width:15%'>견적번호</th><td style='width:35%'>").append(estimateNo).append("</td>");
html.append("<th style='width:15%'>영업번호</th><td style='width:35%'>").append(contractNo).append("</td></tr>");
html.append("<tr><th>고객사</th><td>").append(customerName).append("</td>");
html.append("<th>작성일</th><td>").append(regdate).append("</td></tr>");
html.append("<tr><th>수신</th><td>").append(recipient).append("</td>");
html.append("<th>담당자</th><td>").append(contactPerson).append("</td></tr>");
html.append("<tr><th>작성자</th><td>").append(writerName).append("</td>");
html.append("<th>모델명</th><td>").append(modelName).append("</td></tr>");
if(!currencyName.isEmpty()){
html.append("<tr><th>통화</th><td>" + currencyName + "</td>");
html.append("<th>환율</th><td>" + exchangeRate + "</td></tr>");
html.append("<tr><th>통화</th><td>").append(currencyName).append("</td>");
html.append("<th>환율</th><td>").append(exchangeRate).append("</td></tr>");
}
html.append("<tr><th>합계금액</th><td colspan='3'>");
if(!totalAmountKrw.isEmpty() && !"0".equals(totalAmountKrw)){
html.append(totalAmountKrw + " (KRW)");
if(!totalAmount.isEmpty()) html.append(" / " + totalAmount + " (" + currencyName + ")");
html.append(totalAmountKrw).append(" (KRW)");
if(!totalAmount.isEmpty()) html.append(" / ").append(totalAmount).append(" (").append(currencyName).append(")");
} else {
html.append(totalAmount);
}
html.append("</td></tr>");
if(!validityPeriod.isEmpty()){
html.append("<tr><th>유효기간</th><td colspan='3'>" + validityPeriod + "</td></tr>");
}
html.append("</table>");
// 품목 리스트
if(itemList != null && !itemList.isEmpty()){
html.append("<table>");
html.append("<thead><tr>");
@@ -2236,22 +2239,44 @@ public class ApprovalService {
for(Map item : itemList){
item = CommonUtils.toUpperCaseMapKey(item);
html.append("<tr>");
html.append("<td style='text-align:center;'>" + no++ + "</td>");
html.append("<td>" + CommonUtils.checkNull(item.get("DESCRIPTION")) + "</td>");
html.append("<td>" + CommonUtils.checkNull(item.get("SPECIFICATION")) + "</td>");
html.append("<td style='text-align:right;'>" + CommonUtils.checkNull(item.get("QUANTITY")) + "</td>");
html.append("<td style='text-align:center;'>" + CommonUtils.checkNull(item.get("UNIT")) + "</td>");
html.append("<td style='text-align:right;'>" + CommonUtils.checkNull(item.get("UNIT_PRICE")) + "</td>");
html.append("<td style='text-align:right;'>" + CommonUtils.checkNull(item.get("AMOUNT")) + "</td>");
html.append("<td>" + CommonUtils.checkNull(item.get("REMARK")) + "</td>");
html.append("<td style='text-align:center;'>").append(no++).append("</td>");
html.append("<td>").append(CommonUtils.checkNull(item.get("DESCRIPTION"))).append("</td>");
html.append("<td>").append(CommonUtils.checkNull(item.get("SPECIFICATION"))).append("</td>");
html.append("<td style='text-align:right;'>").append(CommonUtils.checkNull(item.get("QUANTITY"))).append("</td>");
html.append("<td style='text-align:center;'>").append(CommonUtils.checkNull(item.get("UNIT"))).append("</td>");
html.append("<td style='text-align:right;'>").append(CommonUtils.checkNull(item.get("UNIT_PRICE"))).append("</td>");
html.append("<td style='text-align:right;'>").append(CommonUtils.checkNull(item.get("AMOUNT"))).append("</td>");
html.append("<td>").append(CommonUtils.checkNull(item.get("REMARK"))).append("</td>");
html.append("</tr>");
}
html.append("</tbody></table>");
}
// 비고
if(!noteRemarks.isEmpty()){
html.append("<br/><div><strong>비고:</strong><br/>" + noteRemarks.replace("\n", "<br/>") + "</div>");
html.append("<div class='notes'><strong>&lt;비고&gt;</strong><br/>").append(noteRemarks.replace("\n", "<br/>")).append("</div>");
}
if("2".equals(templateType)){
if(!notesContent.isEmpty()){
html.append("<div class='notes' style='line-height:1.8;'>").append(notesContent).append("</div>");
}
} else {
boolean hasNotes = !note1.isEmpty() || !note2.isEmpty() || !note3.isEmpty() || !note4.isEmpty();
if(hasNotes){
html.append("<div class='notes'><strong>&lt;참조사항&gt;</strong><br/>");
if(!note1.isEmpty()) html.append(note1).append("<br/>");
if(!note2.isEmpty()) html.append(note2).append("<br/>");
if(!note3.isEmpty()) html.append(note3).append("<br/>");
if(!note4.isEmpty()) html.append(note4);
html.append("</div>");
}
}
if(!managerName.isEmpty() || !managerContact.isEmpty()){
html.append("<div style='margin-top:10px;text-align:right;font-size:9pt;'>");
if(!managerName.isEmpty()) html.append("담당자 : ").append(managerName);
if(!managerContact.isEmpty()) html.append("<br/>연락처 : ").append(managerContact);
html.append("</div>");
}
html.append("</body></html>");
@@ -2264,6 +2289,7 @@ public class ApprovalService {
private String buildEstimateContentsHtml(Map estimateInfo, List<Map> itemList){
StringBuilder html = new StringBuilder();
String templateType = CommonUtils.checkNull(estimateInfo.get("TEMPLATE_TYPE"));
String estimateNo = CommonUtils.checkNull(estimateInfo.get("ESTIMATE_NO"));
String contractNo = CommonUtils.checkNull(estimateInfo.get("CONTRACT_NO"));
String customerName = CommonUtils.checkNull(estimateInfo.get("CUSTOMER_NAME"));
@@ -2278,87 +2304,128 @@ public class ApprovalService {
String modelName = CommonUtils.checkNull(estimateInfo.get("MODEL_NAME"));
String validityPeriod = CommonUtils.checkNull(estimateInfo.get("VALIDITY_PERIOD"));
String noteRemarks = CommonUtils.checkNull(estimateInfo.get("NOTE_REMARKS"));
String note1 = CommonUtils.checkNull(estimateInfo.get("NOTE1"));
String note2 = CommonUtils.checkNull(estimateInfo.get("NOTE2"));
String note3 = CommonUtils.checkNull(estimateInfo.get("NOTE3"));
String note4 = CommonUtils.checkNull(estimateInfo.get("NOTE4"));
String notesContent = CommonUtils.checkNull(estimateInfo.get("NOTES_CONTENT"));
String managerName = CommonUtils.checkNull(estimateInfo.get("MANAGER_NAME"));
String managerContact = CommonUtils.checkNull(estimateInfo.get("MANAGER_CONTACT"));
html.append("<div style='font-family:맑은 고딕,sans-serif;font-size:10pt;'>");
String TD_HEADER = "style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;padding:4px 8px;'";
String TD_VALUE = "style='border:1px solid #333;font-size:9pt;padding:4px 8px;'";
String TH_ITEM = "style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;padding:4px;'";
String TD_ITEM = "style='border:1px solid #333;font-size:9pt;padding:4px;'";
html.append("<div style='font-family:맑은 고딕,Malgun Gothic,sans-serif;font-size:10pt;'>");
html.append("<h3 style='text-align:center;margin-bottom:10px;'>견 적 서</h3>");
html.append("<table cellspacing='0' cellpadding='4' style='border-collapse:collapse;width:100%;margin-bottom:10px;'>");
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;width:15%;font-weight:bold;font-size:9pt;'>견적번호</td>");
html.append("<td style='border:1px solid #333;width:35%;font-size:9pt;'>" + estimateNo + "</td>");
html.append("<td style='border:1px solid #333;background-color:#D9E2F3;width:15%;font-weight:bold;font-size:9pt;'>영업번호</td>");
html.append("<td style='border:1px solid #333;width:35%;font-size:9pt;'>" + contractNo + "</td></tr>");
// 기본 정보 테이블
html.append("<table cellspacing='0' cellpadding='0' style='border-collapse:collapse;width:100%;margin-bottom:10px;'>");
html.append("<tr><td ").append(TD_HEADER).append(" width='15%'>견적번호</td>");
html.append("<td ").append(TD_VALUE).append(" width='35%'>").append(escapeHtml(estimateNo)).append("</td>");
html.append("<td ").append(TD_HEADER).append(" width='15%'>영업번호</td>");
html.append("<td ").append(TD_VALUE).append(" width='35%'>").append(escapeHtml(contractNo)).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>고객사</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + customerName + "</td>");
html.append("<td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>작성일</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + regdate + "</td></tr>");
html.append("<tr><td ").append(TD_HEADER).append(">고객사</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(customerName)).append("</td>");
html.append("<td ").append(TD_HEADER).append(">작성일</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(regdate)).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>수신</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + recipient + "</td>");
html.append("<td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>담당자</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + contactPerson + "</td></tr>");
html.append("<tr><td ").append(TD_HEADER).append(">수신</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(recipient)).append("</td>");
html.append("<td ").append(TD_HEADER).append(">담당자</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(contactPerson)).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>작성자</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + writerName + "</td>");
html.append("<td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>모델명</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + modelName + "</td></tr>");
html.append("<tr><td ").append(TD_HEADER).append(">작성자</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(writerName)).append("</td>");
html.append("<td ").append(TD_HEADER).append(">모델명</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(modelName)).append("</td></tr>");
if(!currencyName.isEmpty()){
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>통화</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + currencyName + "</td>");
html.append("<td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>환율</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + exchangeRate + "</td></tr>");
html.append("<tr><td ").append(TD_HEADER).append(">통화</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(currencyName)).append("</td>");
html.append("<td ").append(TD_HEADER).append(">환율</td>");
html.append("<td ").append(TD_VALUE).append(">").append(escapeHtml(exchangeRate)).append("</td></tr>");
}
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>합계금액</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;' colspan='3'>");
html.append("<tr><td ").append(TD_HEADER).append(">합계금액</td>");
html.append("<td ").append(TD_VALUE).append(" colspan='3'>");
if(!totalAmountKrw.isEmpty() && !"0".equals(totalAmountKrw)){
html.append(totalAmountKrw + " (KRW)");
if(!totalAmount.isEmpty()) html.append(" / " + totalAmount + " (" + currencyName + ")");
html.append(escapeHtml(totalAmountKrw)).append(" (KRW)");
if(!totalAmount.isEmpty()) html.append(" / ").append(escapeHtml(totalAmount)).append(" (").append(escapeHtml(currencyName)).append(")");
} else {
html.append(totalAmount);
html.append(escapeHtml(totalAmount));
}
html.append("</td></tr>");
if(!validityPeriod.isEmpty()){
html.append("<tr><td style='border:1px solid #333;background-color:#D9E2F3;font-weight:bold;font-size:9pt;'>유효기간</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;' colspan='3'>" + validityPeriod + "</td></tr>");
}
html.append("</table>");
// 품목 리스트
if(itemList != null && !itemList.isEmpty()){
html.append("<table cellspacing='0' cellpadding='4' style='border-collapse:collapse;width:100%;'>");
html.append("<table cellspacing='0' cellpadding='0' style='border-collapse:collapse;width:100%;margin-bottom:5px;'>");
html.append("<thead><tr>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>No</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>품명</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>규격</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>수량</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>단위</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>단가</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>금액</th>");
html.append("<th style='border:1px solid #333;background-color:#4472C4;color:#fff;text-align:center;font-size:9pt;'>비고</th>");
html.append("<th ").append(TH_ITEM).append(">No</th>");
html.append("<th ").append(TH_ITEM).append(">품명</th>");
html.append("<th ").append(TH_ITEM).append(">규격</th>");
html.append("<th ").append(TH_ITEM).append(">수량</th>");
html.append("<th ").append(TH_ITEM).append(">단위</th>");
html.append("<th ").append(TH_ITEM).append(">단가</th>");
html.append("<th ").append(TH_ITEM).append(">금액</th>");
html.append("<th ").append(TH_ITEM).append(">비고</th>");
html.append("</tr></thead><tbody>");
int no = 1;
for(Map item : itemList){
item = CommonUtils.toUpperCaseMapKey(item);
html.append("<tr>");
html.append("<td style='border:1px solid #333;text-align:center;font-size:9pt;'>" + no++ + "</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + CommonUtils.checkNull(item.get("DESCRIPTION")) + "</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + CommonUtils.checkNull(item.get("SPECIFICATION")) + "</td>");
html.append("<td style='border:1px solid #333;text-align:right;font-size:9pt;'>" + CommonUtils.checkNull(item.get("QUANTITY")) + "</td>");
html.append("<td style='border:1px solid #333;text-align:center;font-size:9pt;'>" + CommonUtils.checkNull(item.get("UNIT")) + "</td>");
html.append("<td style='border:1px solid #333;text-align:right;font-size:9pt;'>" + CommonUtils.checkNull(item.get("UNIT_PRICE")) + "</td>");
html.append("<td style='border:1px solid #333;text-align:right;font-size:9pt;'>" + CommonUtils.checkNull(item.get("AMOUNT")) + "</td>");
html.append("<td style='border:1px solid #333;font-size:9pt;'>" + CommonUtils.checkNull(item.get("REMARK")) + "</td>");
html.append("<td ").append(TD_ITEM).append(" style='border:1px solid #333;text-align:center;font-size:9pt;padding:4px;'>").append(no++).append("</td>");
html.append("<td ").append(TD_ITEM).append(">").append(escapeHtml(CommonUtils.checkNull(item.get("DESCRIPTION")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(">").append(escapeHtml(CommonUtils.checkNull(item.get("SPECIFICATION")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(" style='border:1px solid #333;text-align:right;font-size:9pt;padding:4px;'>").append(escapeHtml(CommonUtils.checkNull(item.get("QUANTITY")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(" style='border:1px solid #333;text-align:center;font-size:9pt;padding:4px;'>").append(escapeHtml(CommonUtils.checkNull(item.get("UNIT")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(" style='border:1px solid #333;text-align:right;font-size:9pt;padding:4px;'>").append(escapeHtml(CommonUtils.checkNull(item.get("UNIT_PRICE")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(" style='border:1px solid #333;text-align:right;font-size:9pt;padding:4px;'>").append(escapeHtml(CommonUtils.checkNull(item.get("AMOUNT")))).append("</td>");
html.append("<td ").append(TD_ITEM).append(">").append(escapeHtml(CommonUtils.checkNull(item.get("REMARK")))).append("</td>");
html.append("</tr>");
}
html.append("</tbody></table>");
}
// 비고 (테이블 내 비고)
if(!noteRemarks.isEmpty()){
html.append("<br/><div><strong>비고:</strong><br/>" + noteRemarks.replace("\n", "<br/>") + "</div>");
html.append("<div style='margin-top:8px;padding:6px;border:1px solid #999;font-size:9pt;'>");
html.append("<strong>&lt;비고&gt;</strong><br/>").append(noteRemarks.replace("\n", "<br/>"));
html.append("</div>");
}
// 양식별 하단 섹션
if("2".equals(templateType)){
// 장비견적서: NOTES_CONTENT (HTML 형식)
if(!notesContent.isEmpty()){
html.append("<div style='margin-top:8px;padding:6px;border:1px solid #999;font-size:9pt;line-height:1.8;'>");
html.append(notesContent);
html.append("</div>");
}
} else {
// 일반견적서: NOTE1~NOTE4 (참조사항)
boolean hasNotes = !note1.isEmpty() || !note2.isEmpty() || !note3.isEmpty() || !note4.isEmpty();
if(hasNotes){
html.append("<div style='margin-top:8px;padding:6px;border:1px solid #999;font-size:9pt;'>");
html.append("<strong>&lt;참조사항&gt;</strong><br/>");
if(!note1.isEmpty()) html.append(escapeHtml(note1)).append("<br/>");
if(!note2.isEmpty()) html.append(escapeHtml(note2)).append("<br/>");
if(!note3.isEmpty()) html.append(escapeHtml(note3)).append("<br/>");
if(!note4.isEmpty()) html.append(escapeHtml(note4));
html.append("</div>");
}
}
// 담당자 정보
if(!managerName.isEmpty() || !managerContact.isEmpty()){
html.append("<div style='margin-top:8px;text-align:right;font-size:9pt;'>");
if(!managerName.isEmpty()) html.append("담당자 : ").append(escapeHtml(managerName));
if(!managerContact.isEmpty()) html.append("<br/>연락처 : ").append(escapeHtml(managerContact));
html.append("</div>");
}
html.append("</div>");