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:
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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 <= 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 <= 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>
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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에서 조회) -->
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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><비고></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><참조사항></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><비고></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><참조사항></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>");
|
||||
|
||||
Reference in New Issue
Block a user