ECR 결재상신 아마란스 연동 - ecrList, quality.xml, approval.xml, ApprovalService, QualityController
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -9383,7 +9383,7 @@ SELECT
|
||||
|
||||
<!-- 소재 관리 쿼리 -->
|
||||
<!-- 소재 목록 조회 (전체) -->
|
||||
<select id="getMaterialList" parameterType="map" resultType="map">
|
||||
<select id="getMaterialList_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9394,8 +9394,21 @@ 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" parameterType="map" resultType="map">
|
||||
<select id="getMaterialSizes_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9407,8 +9420,21 @@ SELECT
|
||||
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" parameterType="map" resultType="map">
|
||||
<select id="getMaterialPartNo_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
OBJID,
|
||||
MATERIAL_CODE,
|
||||
@@ -9422,6 +9448,22 @@ SELECT
|
||||
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
|
||||
@@ -9528,4 +9570,71 @@ SELECT
|
||||
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,7 +603,156 @@
|
||||
SELECT
|
||||
CONTRACT_OBJID
|
||||
FROM ESTIMATE_TEMPLATE
|
||||
WHERE OBJID = #{estObjId}::NUMERIC
|
||||
WHERE OBJID::VARCHAR = #{estObjId}
|
||||
</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,12 +3137,22 @@
|
||||
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
|
||||
@@ -3293,7 +3303,11 @@
|
||||
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
|
||||
@@ -3373,7 +3387,11 @@
|
||||
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
|
||||
@@ -3388,31 +3406,25 @@
|
||||
BPQ.SEQ
|
||||
</select>
|
||||
|
||||
<!-- 품번으로 최신 M-BOM 조회 (Machine 이외 제품용) -->
|
||||
<!-- 품번으로 최신 M-BOM 조회 (MBOM_HEADER 기반, Machine 이외 제품용) -->
|
||||
<select id="getLatestMbomByPartNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
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
|
||||
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
|
||||
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
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
|
||||
WHERE
|
||||
MH.PART_NO = #{partNo}
|
||||
AND MH.STATUS = 'Y'
|
||||
AND CM.PRODUCT != '0000928' <!-- Machine 제외 -->
|
||||
ORDER BY
|
||||
MH.REGDATE DESC
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
@@ -3426,6 +3438,7 @@
|
||||
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,
|
||||
@@ -3743,6 +3756,21 @@
|
||||
(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
|
||||
@@ -3848,7 +3876,7 @@
|
||||
PROCESSING_VENDOR, PROCESSING_DEADLINE, GRINDING_DEADLINE,
|
||||
REQUIRED_QTY, ORDER_QTY, PRODUCTION_QTY, STOCK_QTY, SHORTAGE_QTY,
|
||||
NET_QTY, PO_QTY,
|
||||
VENDOR, UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY,
|
||||
VENDOR, UNIT_PRICE, PROCESSING_UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY,
|
||||
<if test="proposalDate != null">
|
||||
PROPOSAL_DATE,
|
||||
</if>
|
||||
@@ -3861,7 +3889,7 @@
|
||||
#{processingVendor}, #{processingDeadline}, #{grindingDeadline},
|
||||
#{requiredQty}, #{orderQty}, #{productionQty}, #{stockQty}, #{shortageQty},
|
||||
#{netQty}, #{poQty},
|
||||
#{vendor}, #{unitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty},
|
||||
#{vendor}, #{unitPrice}, #{processingUnitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty},
|
||||
<if test="proposalDate != null">
|
||||
#{proposalDate},
|
||||
</if>
|
||||
@@ -4047,6 +4075,7 @@
|
||||
MD.PO_QTY,
|
||||
MD.VENDOR,
|
||||
MD.UNIT_PRICE,
|
||||
MD.PROCESSING_UNIT_PRICE,
|
||||
MD.TOTAL_PRICE,
|
||||
MD.CURRENCY,
|
||||
MD.LEAD_TIME,
|
||||
@@ -4100,6 +4129,7 @@
|
||||
SHORTAGE_QTY,
|
||||
VENDOR,
|
||||
UNIT_PRICE,
|
||||
PROCESSING_UNIT_PRICE,
|
||||
TOTAL_PRICE,
|
||||
CURRENCY,
|
||||
LEAD_TIME,
|
||||
@@ -4144,6 +4174,7 @@
|
||||
A.SHORTAGE_QTY,
|
||||
A.VENDOR,
|
||||
A.UNIT_PRICE,
|
||||
A.PROCESSING_UNIT_PRICE,
|
||||
A.TOTAL_PRICE,
|
||||
A.CURRENCY,
|
||||
A.LEAD_TIME,
|
||||
@@ -4196,6 +4227,7 @@
|
||||
B.SHORTAGE_QTY,
|
||||
B.VENDOR,
|
||||
B.UNIT_PRICE,
|
||||
B.PROCESSING_UNIT_PRICE,
|
||||
B.TOTAL_PRICE,
|
||||
B.CURRENCY,
|
||||
B.LEAD_TIME,
|
||||
@@ -4248,6 +4280,7 @@
|
||||
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,
|
||||
@@ -4285,6 +4318,21 @@
|
||||
(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
|
||||
@@ -4314,7 +4362,8 @@
|
||||
PATH2,
|
||||
CYCLE,
|
||||
UNIT,
|
||||
WRITER
|
||||
WRITER,
|
||||
RAW_MATERIAL_PART_NO
|
||||
) AS (
|
||||
SELECT
|
||||
A.MBOM_HEADER_OBJID,
|
||||
@@ -4335,7 +4384,8 @@
|
||||
ARRAY [A.SEQ::TEXT],
|
||||
FALSE,
|
||||
A.UNIT,
|
||||
A.WRITER
|
||||
A.WRITER,
|
||||
A.RAW_MATERIAL_PART_NO
|
||||
FROM
|
||||
MBOM_DETAIL A
|
||||
WHERE 1=1
|
||||
@@ -4364,7 +4414,8 @@
|
||||
PATH2||B.SEQ::TEXT,
|
||||
B.PARENT_OBJID = ANY(PATH),
|
||||
B.UNIT,
|
||||
B.WRITER
|
||||
B.WRITER,
|
||||
B.RAW_MATERIAL_PART_NO
|
||||
FROM
|
||||
MBOM_DETAIL B
|
||||
JOIN
|
||||
@@ -4410,6 +4461,7 @@
|
||||
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,
|
||||
@@ -4445,6 +4497,21 @@
|
||||
(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
|
||||
@@ -4513,9 +4580,18 @@
|
||||
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,
|
||||
-- '' 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,
|
||||
PP.OBJID AS PROD_PLAN_OBJID,
|
||||
PM.REGDATE AS SORT_DATE
|
||||
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
|
||||
FROM
|
||||
PROJECT_MGMT PM
|
||||
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
|
||||
@@ -4563,9 +4639,13 @@
|
||||
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,
|
||||
'' AS EQUIPMENT_WBS,
|
||||
0 AS EQUIPMENT_WBS,
|
||||
PP.OBJID AS PROD_PLAN_OBJID,
|
||||
PP.REGDATE AS SORT_DATE
|
||||
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
|
||||
FROM PRODUCTION_PLAN PP
|
||||
WHERE PP.STATUS = 'active'
|
||||
AND (PP.PROJECT_OBJID IS NULL OR PP.PROJECT_OBJID = '')
|
||||
@@ -4617,6 +4697,17 @@
|
||||
<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>
|
||||
|
||||
@@ -4635,7 +4726,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(CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
|
||||
COALESCE(CI.CUSTOMER_REQUEST, CM.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
|
||||
COALESCE((
|
||||
SELECT STRING_AGG(CIS.SERIAL_NO, ', ' ORDER BY CIS.SERIAL_NO)
|
||||
FROM CONTRACT_ITEM_SERIAL CIS
|
||||
@@ -4689,8 +4780,9 @@
|
||||
PP.TOTAL_PROD_QTY,
|
||||
PP.CUSTOMER_REQUEST,
|
||||
PP.STATUS,
|
||||
PP.REGDATE,
|
||||
PP.WRITER
|
||||
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
|
||||
FROM PRODUCTION_PLAN PP
|
||||
WHERE PP.OBJID = #{objid}
|
||||
</select>
|
||||
@@ -4931,4 +5023,93 @@
|
||||
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,
|
||||
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,
|
||||
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.VENDOR_PM AS PARTNER_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
@@ -1193,7 +1193,7 @@
|
||||
#{PART_OBJID},
|
||||
REPLACE(#{BOM_QTY}::VARCHAR, ',', ''),
|
||||
REPLACE(#{QTY}::VARCHAR, ',', ''),
|
||||
REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''),
|
||||
COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0),
|
||||
#{PARTNER_PRICE},
|
||||
#{REMARK},
|
||||
#{WRITER},
|
||||
@@ -1231,7 +1231,7 @@
|
||||
) ON CONFLICT (OBJID) DO
|
||||
UPDATE
|
||||
SET
|
||||
ORDER_QTY = REPLACE(#{ORDER_QTY} ::VARCHAR, ',', '')
|
||||
ORDER_QTY = COALESCE(NULLIF(REPLACE(#{ORDER_QTY}::VARCHAR, ',', ''), '')::NUMERIC::INTEGER, 0)
|
||||
,PARTNER_PRICE = REPLACE(#{PARTNER_PRICE} ::VARCHAR, ',', '')
|
||||
,REMARK = #{REMARK}
|
||||
<!--
|
||||
@@ -1836,8 +1836,7 @@
|
||||
<select id="getPurchaseOrderDeliveryTargetPartList" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
P.*,
|
||||
(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 -->
|
||||
(ORDER_QTY::NUMERIC - TOTAL_DELIVERY_QTY::NUMERIC) AS NON_ARRIVAL_QTY
|
||||
FROM(
|
||||
SELECT
|
||||
ROW_NUMBER() OVER(ORDER BY PM.PART_NO, POP.REGDATE DESC) AS RNUM,
|
||||
@@ -1855,7 +1854,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,
|
||||
POP.ORDER_QTY,
|
||||
COALESCE(NULLIF(POP.ORDER_QTY::VARCHAR, '')::NUMERIC::INTEGER, 0) AS ORDER_QTY,
|
||||
POP.REAL_ORDER_QTY,
|
||||
POP.OBJID AS ORDER_PART_OBJID,
|
||||
POP.PURCHASE_ORDER_MASTER_OBJID,
|
||||
@@ -3231,6 +3230,8 @@ 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
|
||||
-->
|
||||
@@ -3317,7 +3318,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 = 'PROPOSAL'
|
||||
and SRM.DOC_TYPE IN ('PROPOSAL', 'PURCHASE_REG_PROPOSAL')
|
||||
<!-- 230907 outer join으로 변경
|
||||
,PROJECT_MGMT AS CM
|
||||
WHERE POM.CONTRACT_MGMT_OBJID = CM.OBJID
|
||||
@@ -3450,6 +3451,30 @@ 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>
|
||||
@@ -4246,6 +4271,7 @@ 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
|
||||
@@ -4289,6 +4315,8 @@ 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
|
||||
@@ -4429,12 +4457,19 @@ 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 != ''">
|
||||
<!-- <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
|
||||
<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')
|
||||
@@ -6123,4 +6158,208 @@ 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,6 +1208,12 @@
|
||||
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>
|
||||
|
||||
@@ -1411,6 +1417,10 @@
|
||||
<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>
|
||||
|
||||
@@ -1418,8 +1428,96 @@
|
||||
반제품검사 관리
|
||||
===================================================== -->
|
||||
|
||||
<!-- 반제품검사 목록 조회 (영업관리 방식: 작업지시번호 기준 그룹화, 나머지는 "외 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 제외) -->
|
||||
@@ -1442,6 +1540,16 @@
|
||||
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 ''
|
||||
@@ -1486,17 +1594,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(T.RECEIPT_QTY) AS RECEIPT_QTY
|
||||
, SUM(T.GOOD_QTY) AS GOOD_QTY
|
||||
, SUM(T.DEFECT_QTY) AS DEFECTIVE_QTY
|
||||
<!-- 수량 집계 (입고수량은 양품 데이터에서만 합산) -->
|
||||
, 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
|
||||
, CASE
|
||||
WHEN SUM(T.RECEIPT_QTY) > 0
|
||||
THEN ROUND(SUM(T.DEFECT_QTY) * 100.0 / SUM(T.RECEIPT_QTY), 2)
|
||||
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)
|
||||
ELSE 0
|
||||
END AS DEFECT_RATE
|
||||
, 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
|
||||
, 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
|
||||
FROM (
|
||||
SELECT SPI.OBJID
|
||||
, COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME
|
||||
@@ -1521,22 +1629,33 @@
|
||||
<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="search_inspection_date != null and search_inspection_date != ''">
|
||||
AND TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD') = #{search_inspection_date}
|
||||
<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>
|
||||
<!-- 검사자 검색 -->
|
||||
<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
|
||||
@@ -1645,6 +1764,24 @@
|
||||
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
|
||||
@@ -1678,6 +1815,7 @@
|
||||
, 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"
|
||||
@@ -1771,6 +1909,7 @@
|
||||
, DEFECT_TYPE
|
||||
, DEFECT_CAUSE
|
||||
, RESPONSIBLE_DEPT
|
||||
, WORKER
|
||||
, PROCESS_STATUS
|
||||
, INSPECTION_DATE
|
||||
, INSPECTOR
|
||||
@@ -1794,6 +1933,7 @@
|
||||
, #{DEFECT_TYPE}
|
||||
, #{DEFECT_CAUSE}
|
||||
, #{RESPONSIBLE_DEPT}
|
||||
, #{WORKER}
|
||||
, #{PROCESS_STATUS}
|
||||
, CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
|
||||
, #{INSPECTOR}
|
||||
@@ -1821,6 +1961,7 @@
|
||||
, 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}
|
||||
@@ -1902,11 +2043,15 @@
|
||||
, 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 '외주업체' ELSE CCS.BLAME_DECISION END AS BLAME_DECISION_NAME
|
||||
, 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
|
||||
, 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
|
||||
@@ -1994,14 +2139,21 @@
|
||||
, (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="getCustomerCsSeq" resultType="int">
|
||||
SELECT NEXTVAL('SEQ_CUSTOMER_CS_RECEIPT_NO')
|
||||
<!-- 고객 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} || '-%'
|
||||
</select>
|
||||
|
||||
<!-- 고객 CS 등록 -->
|
||||
@@ -2026,6 +2178,7 @@
|
||||
, STATUS
|
||||
, REMARK
|
||||
, WRITER
|
||||
, RECEIPT_USER_ID
|
||||
, REG_DATE
|
||||
) VALUES (
|
||||
#{OBJID}
|
||||
@@ -2047,6 +2200,7 @@
|
||||
, #{STATUS}
|
||||
, #{REMARK}
|
||||
, #{WRITER}
|
||||
, #{RECEIPT_USER_ID}
|
||||
, NOW()
|
||||
)
|
||||
</insert>
|
||||
@@ -2067,6 +2221,7 @@
|
||||
, SERIAL_NO = #{SERIAL_NO}
|
||||
, MANUFACTURER = #{MANUFACTURER}
|
||||
, COMPLAINT_CONTENT = #{COMPLAINT_CONTENT}
|
||||
, RECEIPT_USER_ID = #{RECEIPT_USER_ID}
|
||||
, MOD_DATE = NOW()
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
@@ -2085,6 +2240,18 @@
|
||||
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 관리
|
||||
===================================================== -->
|
||||
@@ -2112,7 +2279,19 @@
|
||||
, (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}
|
||||
@@ -2159,6 +2338,9 @@
|
||||
<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>
|
||||
|
||||
@@ -2192,6 +2374,8 @@
|
||||
, 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>
|
||||
@@ -2217,6 +2401,7 @@
|
||||
, DUE_DATE
|
||||
, ACTION_DEPT
|
||||
, ACTION_MANAGER_ID
|
||||
, CHANGE_TYPE
|
||||
, ATTACH_FILE_OBJID
|
||||
, REMARK
|
||||
, WRITER
|
||||
@@ -2233,6 +2418,7 @@
|
||||
, #{DUE_DATE}
|
||||
, #{ACTION_DEPT}
|
||||
, #{ACTION_MANAGER_ID}
|
||||
, #{CHANGE_TYPE}
|
||||
, #{ATTACH_FILE_OBJID}
|
||||
, #{REMARK}
|
||||
, #{WRITER}
|
||||
@@ -2252,6 +2438,7 @@
|
||||
, 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()
|
||||
@@ -2292,6 +2479,14 @@
|
||||
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
|
||||
@@ -2343,7 +2538,7 @@
|
||||
ORDER BY IMI.REGDATE, PM.PART_NO
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) -->
|
||||
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) - 팝업용 (기존) -->
|
||||
<select id="getIncomingInspectionProgressDetailList" parameterType="map" resultType="map">
|
||||
SELECT IMI.OBJID
|
||||
, IMI.PARENT_OBJID
|
||||
@@ -2388,7 +2583,135 @@
|
||||
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
|
||||
@@ -2398,6 +2721,39 @@
|
||||
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 (
|
||||
@@ -2558,4 +2914,12 @@
|
||||
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,7 +3161,8 @@ 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 VENDOR,
|
||||
COALESCE(PM.MAKER, '') AS 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,
|
||||
@@ -3171,7 +3172,7 @@ UPDATE SET
|
||||
0 AS ORDER_QTY,
|
||||
0 AS ITEM_QTY2,
|
||||
0 AS PRODUCTION_QTY,
|
||||
COALESCE(SRP.PROCESSING_VENDOR, '') AS PROCESSING_VENDOR,
|
||||
CASE WHEN SRP.PROCESSING_VENDOR IS NULL THEN '0000008377' ELSE SRP.PROCESSING_VENDOR END AS PROCESSING_VENDOR,
|
||||
NULL AS PROCESSING_DEADLINE,
|
||||
NULL AS GRINDING_DEADLINE,
|
||||
-- 구매 관련 컬럼 (SALES_REQUEST_PART에서 조회)
|
||||
@@ -3462,7 +3463,7 @@ SELECT
|
||||
G.RAW_MATERIAL_SPEC,
|
||||
G.RAW_MATERIAL,
|
||||
G.RAW_MATERIAL_SIZE AS SIZE,
|
||||
G.PROCESSING_VENDOR,
|
||||
CASE WHEN G.PROCESSING_VENDOR IS NULL THEN '0000008377' ELSE G.PROCESSING_VENDOR END AS PROCESSING_VENDOR,
|
||||
G.PROCESSING_DEADLINE,
|
||||
G.GRINDING_DEADLINE,
|
||||
G.REQUIRED_QTY,
|
||||
@@ -3471,7 +3472,7 @@ SELECT
|
||||
G.STOCK_QTY,
|
||||
G.SHORTAGE_QTY,
|
||||
G.VENDOR AS VENDOR_PM,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
|
||||
G.UNIT_PRICE,
|
||||
G.TOTAL_PRICE,
|
||||
G.CURRENCY,
|
||||
@@ -3492,7 +3493,8 @@ SELECT
|
||||
P.WEIGHT,
|
||||
P.PART_TYPE,
|
||||
P.REVISION,
|
||||
COALESCE(P.MAKER, G.VENDOR) AS VENDOR,
|
||||
COALESCE(P.MAKER, '') AS MAKER,
|
||||
G.VENDOR AS VENDOR,
|
||||
P.THICKNESS,
|
||||
P.WIDTH,
|
||||
P.HEIGHT,
|
||||
@@ -3734,7 +3736,7 @@ SELECT
|
||||
V.STOCK_QTY,
|
||||
V.SHORTAGE_QTY,
|
||||
V.VENDOR AS VENDOR_PM,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
|
||||
V.UNIT_PRICE,
|
||||
V.TOTAL_PRICE,
|
||||
V.CURRENCY,
|
||||
@@ -3757,7 +3759,8 @@ SELECT
|
||||
P.WEIGHT,
|
||||
P.PART_TYPE,
|
||||
P.REVISION,
|
||||
COALESCE(P.MAKER, V.VENDOR) AS VENDOR,
|
||||
COALESCE(P.MAKER, '') AS MAKER,
|
||||
V.VENDOR AS VENDOR,
|
||||
P.THICKNESS,
|
||||
P.WIDTH,
|
||||
P.HEIGHT,
|
||||
@@ -3897,21 +3900,43 @@ ORDER BY V.PATH2
|
||||
|
||||
<!-- ==================== 품의서 관리 ==================== -->
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 소재단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 공급업체 기준 -->
|
||||
<!-- 소재단가+공급업체가 입력된 품목 대상 (소재 유무에 따라 수량/합계 분기) -->
|
||||
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 (PART_OBJID + SUPPLY_TYPE + RAW_MATERIAL + RAW_MATERIAL_SIZE) -->
|
||||
<select id="getProposalTargetPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
|
||||
MD.PART_OBJID,
|
||||
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,
|
||||
/* 소재 있으면 소재 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,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'MATERIAL' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3927,24 +3952,33 @@ ORDER BY V.PATH2
|
||||
AND MD.VENDOR != ''
|
||||
-- 소재 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공단가 기준 -->
|
||||
<!-- 품의서 대상 품목 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) - 가공업체 기준 -->
|
||||
<!-- 가공단가+가공업체가 입력된 품목 대상 (부품, 제작수량) -->
|
||||
<!-- 구매리스트와 동일 기준으로 동일 품번 그룹핑 -->
|
||||
<select id="getProposalTargetPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
STRING_AGG(MD.OBJID::VARCHAR, ',' ORDER BY MD.OBJID) AS ORIGINAL_OBJIDS,
|
||||
MD.PART_OBJID,
|
||||
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,
|
||||
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,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'PROCESSING' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3960,19 +3994,24 @@ ORDER BY V.PATH2
|
||||
AND MD.PROCESSING_VENDOR != ''
|
||||
-- 가공 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (소재단가O, 공급업체X) -->
|
||||
<!-- 동일 품번 그룹핑 -->
|
||||
<select id="getProposalExcludedPartsFromMBom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.UNIT_PRICE,
|
||||
MD.TOTAL_PRICE,
|
||||
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,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'MATERIAL' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -3987,19 +4026,24 @@ ORDER BY V.PATH2
|
||||
AND (MD.VENDOR IS NULL OR MD.VENDOR = '')
|
||||
-- 소재 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(MD.REGDATE)
|
||||
</select>
|
||||
|
||||
<!-- 품의서 대상 제외 품목 조회 - M-BOM 기반 (가공단가O, 가공업체X) -->
|
||||
<!-- 동일 품번 그룹핑 -->
|
||||
<select id="getProposalExcludedPartsFromMBomProcessing" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
MIN(MD.OBJID) AS OBJID,
|
||||
MD.PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
MD.QTY,
|
||||
MD.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
MD.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
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,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
'PROCESSING' AS PROPOSAL_TYPE
|
||||
FROM
|
||||
@@ -4014,24 +4058,38 @@ ORDER BY V.PATH2
|
||||
AND (MD.PROCESSING_VENDOR IS NULL OR MD.PROCESSING_VENDOR = '')
|
||||
-- 가공 품의서가 생성되지 않은 품목만
|
||||
AND MD.PROCESSING_PROPOSAL_DATE IS NULL
|
||||
ORDER BY MD.REGDATE
|
||||
GROUP BY MD.PART_OBJID,
|
||||
COALESCE(MD.SUPPLY_TYPE, ''),
|
||||
COALESCE(MD.RAW_MATERIAL, ''),
|
||||
COALESCE(MD.RAW_MATERIAL_SIZE, '')
|
||||
ORDER BY MIN(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,
|
||||
SRP.QTY,
|
||||
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.UNIT_PRICE,
|
||||
SRP.TOTAL_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.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
|
||||
@@ -4050,14 +4108,15 @@ 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.QTY,
|
||||
SRP.PRODUCTION_QTY AS QTY,
|
||||
SRP.PROCESSING_UNIT_PRICE AS UNIT_PRICE,
|
||||
SRP.PROCESSING_TOTAL_PRICE AS TOTAL_PRICE,
|
||||
SRP.PROCESSING_VENDOR AS VENDOR_PM,
|
||||
@@ -4174,83 +4233,95 @@ ORDER BY V.PATH2
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 소재 -->
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (M-BOM 기반 품목 복사) - 공급업체 -->
|
||||
<!-- 그룹핑된 합산 데이터를 직접 INSERT (동일 품번 합산 대응) -->
|
||||
<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
|
||||
)
|
||||
SELECT
|
||||
) VALUES (
|
||||
#{NEW_OBJID},
|
||||
#{PROPOSAL_MASTER_OBJID},
|
||||
PART_OBJID,
|
||||
QTY,
|
||||
UNIT_PRICE,
|
||||
TOTAL_PRICE,
|
||||
VENDOR AS VENDOR_PM,
|
||||
NET_QTY,
|
||||
PO_QTY,
|
||||
USE_YN,
|
||||
NOW() AS PROPOSAL_DATE,
|
||||
#{PART_OBJID},
|
||||
#{QTY},
|
||||
#{UNIT},
|
||||
#{UNIT_PRICE},
|
||||
#{TOTAL_PRICE},
|
||||
#{VENDOR_PM},
|
||||
#{NET_QTY},
|
||||
#{PO_QTY},
|
||||
#{PRODUCTION_QTY},
|
||||
#{USE_YN},
|
||||
#{MATERIAL_YN},
|
||||
NOW(),
|
||||
#{WRITER},
|
||||
NOW()
|
||||
FROM MBOM_DETAIL
|
||||
WHERE OBJID = #{SOURCE_OBJID}
|
||||
)
|
||||
</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
|
||||
)
|
||||
SELECT
|
||||
) VALUES (
|
||||
#{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,
|
||||
#{PART_OBJID},
|
||||
#{QTY},
|
||||
#{UNIT},
|
||||
#{UNIT_PRICE},
|
||||
#{TOTAL_PRICE},
|
||||
#{VENDOR_PM},
|
||||
#{NET_QTY},
|
||||
#{PO_QTY},
|
||||
#{PRODUCTION_QTY},
|
||||
#{USE_YN},
|
||||
#{MATERIAL_YN},
|
||||
NOW(),
|
||||
#{WRITER},
|
||||
NOW()
|
||||
FROM MBOM_DETAIL
|
||||
WHERE OBJID = #{SOURCE_OBJID}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 품의서용 SALES_REQUEST_PART 생성 (수동 작성 품목 복사) - 소재 -->
|
||||
<!-- 품의서용 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,
|
||||
@@ -4265,9 +4336,16 @@ ORDER BY V.PATH2
|
||||
#{NEW_OBJID},
|
||||
#{PROPOSAL_MASTER_OBJID},
|
||||
PART_OBJID,
|
||||
QTY,
|
||||
CASE WHEN RAW_MATERIAL_NO IS NOT NULL AND RAW_MATERIAL_NO != ''
|
||||
THEN PO_QTY
|
||||
ELSE PRODUCTION_QTY
|
||||
END AS QTY,
|
||||
UNIT,
|
||||
UNIT_PRICE,
|
||||
TOTAL_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,
|
||||
VENDOR_PM,
|
||||
NET_QTY,
|
||||
PO_QTY,
|
||||
@@ -4286,6 +4364,7 @@ ORDER BY V.PATH2
|
||||
SALES_REQUEST_MASTER_OBJID,
|
||||
PART_OBJID,
|
||||
QTY,
|
||||
UNIT,
|
||||
UNIT_PRICE,
|
||||
TOTAL_PRICE,
|
||||
VENDOR_PM,
|
||||
@@ -4301,6 +4380,7 @@ 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,
|
||||
@@ -4609,16 +4689,22 @@ 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
|
||||
WHEN SRM.STATUS = 'create' THEN '작성중'
|
||||
ELSE ''
|
||||
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,
|
||||
@@ -4627,6 +4713,9 @@ 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,
|
||||
@@ -4675,6 +4764,9 @@ 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'
|
||||
@@ -4800,7 +4892,7 @@ ORDER BY V.PATH2
|
||||
</select>
|
||||
|
||||
<!-- 품의서 품목 리스트 조회 -->
|
||||
<select id="getProposalPartList" parameterType="map" resultType="map">
|
||||
<select id="getProposalPartList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
|
||||
SELECT
|
||||
ROW_NUMBER() OVER(ORDER BY SRP.REGDATE) AS RNUM,
|
||||
SRP.OBJID,
|
||||
@@ -4809,14 +4901,17 @@ ORDER BY V.PATH2
|
||||
PM.PART_NAME,
|
||||
PM.SPEC,
|
||||
PM.MATERIAL,
|
||||
SRP.UNIT,
|
||||
COALESCE(SRP.UNIT, PM.UNIT) AS 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,
|
||||
SRP.UNIT_PRICE,
|
||||
SRP.TOTAL_PRICE,
|
||||
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.VENDOR_PM,
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME,
|
||||
SRP.REMARK,
|
||||
@@ -4873,6 +4968,35 @@ 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>
|
||||
|
||||
<!-- =====================================================
|
||||
견적요청서 관리 쿼리
|
||||
===================================================== -->
|
||||
@@ -4973,7 +5097,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::VARCHAR = CM.OBJID::VARCHAR
|
||||
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID = 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}
|
||||
@@ -4992,8 +5116,16 @@ ORDER BY V.PATH2
|
||||
<if test="VENDOR_OBJID != null and VENDOR_OBJID != ''">
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = #{VENDOR_OBJID}
|
||||
</if>
|
||||
<if test="STATUS != null and STATUS != ''">
|
||||
AND QRM.STATUS = #{STATUS}
|
||||
<!-- 메일발송 여부 검색 (날짜 유무 기준) -->
|
||||
<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>
|
||||
<!-- 작성자 검색 -->
|
||||
<if test="writer != null and writer != ''">
|
||||
@@ -5049,7 +5181,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::VARCHAR = CM.OBJID::VARCHAR
|
||||
LEFT JOIN CLIENT_MNG CM ON QRM.VENDOR_OBJID = CM.OBJID::VARCHAR
|
||||
WHERE QRM.OBJID = #{QUOTATION_REQUEST_MASTER_OBJID}::NUMERIC
|
||||
</select>
|
||||
|
||||
@@ -5068,16 +5200,25 @@ 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::VARCHAR) AS VENDOR_NAME
|
||||
(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = QRM.VENDOR_OBJID) 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')
|
||||
@@ -5102,7 +5243,7 @@ ORDER BY V.PATH2
|
||||
#{QUOTATION_REQUEST_NO},
|
||||
#{SALES_REQUEST_MASTER_OBJID}::NUMERIC,
|
||||
#{PROJECT_MGMT_OBJID}::NUMERIC,
|
||||
#{VENDOR_OBJID}::NUMERIC,
|
||||
#{VENDOR_OBJID},
|
||||
#{VENDOR_TYPE},
|
||||
'create',
|
||||
<if test="DUE_DATE != null and DUE_DATE != ''">#{DUE_DATE}::DATE</if>
|
||||
@@ -5144,11 +5285,12 @@ 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>
|
||||
@@ -5175,6 +5317,9 @@ 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
|
||||
@@ -5197,71 +5342,89 @@ ORDER BY V.PATH2
|
||||
WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) -->
|
||||
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (동일 품번 그룹핑) -->
|
||||
<!-- 공급업체/가공업체별로 견적요청서 생성 가능 여부 플래그 포함 -->
|
||||
<select id="getPurchaseListForQuotationFromMBom" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
MD.OBJID,
|
||||
#{SALES_REQUEST_MASTER_OBJID} AS SALES_REQUEST_MASTER_OBJID,
|
||||
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 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::VARCHAR = MD.OBJID::VARCHAR
|
||||
AND QRM.VENDOR_TYPE = 'SUPPLY'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
|
||||
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_SUPPLY,
|
||||
-- 가공업체 견적요청서 생성 가능 여부
|
||||
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::VARCHAR = MD.OBJID::VARCHAR
|
||||
AND QRM.VENDOR_TYPE = 'PROCESSING'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
|
||||
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_PROCESSING
|
||||
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 != '')
|
||||
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, '')
|
||||
)
|
||||
-- 공급업체 또는 가공업체 중 하나라도 견적요청서 생성 가능해야 함
|
||||
AND (
|
||||
-- 공급업체 견적요청서 생성 가능
|
||||
(MD.VENDOR IS NOT NULL AND MD.VENDOR != '' AND NOT EXISTS (
|
||||
SELECT
|
||||
G.OBJID,
|
||||
G.ORIGINAL_OBJIDS,
|
||||
#{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,
|
||||
'MBOM' AS DATA_SOURCE,
|
||||
CASE WHEN G.VENDOR_PM IS NOT NULL AND G.VENDOR_PM != '' 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::VARCHAR = MD.OBJID::VARCHAR
|
||||
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
|
||||
AND QRM.VENDOR_TYPE = 'SUPPLY'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = MD.VENDOR
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM
|
||||
) THEN 'Y' ELSE 'N' END AS CAN_CREATE_SUPPLY,
|
||||
CASE WHEN G.PROCESSING_VENDOR IS NOT NULL AND G.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
|
||||
AND QRM.VENDOR_TYPE = 'PROCESSING'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = G.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 (
|
||||
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
|
||||
AND QRM.VENDOR_TYPE = 'SUPPLY'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = G.VENDOR_PM
|
||||
))
|
||||
OR
|
||||
-- 가공업체 견적요청서 생성 가능
|
||||
(MD.PROCESSING_VENDOR IS NOT NULL AND MD.PROCESSING_VENDOR != '' AND NOT EXISTS (
|
||||
(G.PROCESSING_VENDOR IS NOT NULL AND G.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::VARCHAR = MD.OBJID::VARCHAR
|
||||
WHERE QRD.SALES_REQUEST_PART_OBJID = G.OBJID
|
||||
AND QRM.VENDOR_TYPE = 'PROCESSING'
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = MD.PROCESSING_VENDOR
|
||||
AND QRM.VENDOR_OBJID::VARCHAR = G.PROCESSING_VENDOR
|
||||
))
|
||||
)
|
||||
ORDER BY MD.REGDATE
|
||||
ORDER BY G.PART_NO
|
||||
</select>
|
||||
|
||||
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - 수동 작성 (SALES_REQUEST_PART에서 조회) -->
|
||||
|
||||
@@ -3556,54 +3556,56 @@ 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.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
|
||||
(
|
||||
(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
|
||||
ON CM.CUSTOMER_OBJID = SM.OBJID::VARCHAR
|
||||
WHERE CM.CONTRACT_DATE IS NOT NULL
|
||||
AND CM.CONTRACT_RESULT = '0000964'
|
||||
WHERE CM.ORDER_DATE IS NOT NULL
|
||||
AND CM.CONTRACT_RESULT = '0000964'
|
||||
<if test="Year !=null and Year != '' ">
|
||||
<!-- AND TO_CHAR(CM.REGDATE,'YYYY') = #{Year} -->
|
||||
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
</if>
|
||||
<if test="customer_objid !=null and customer_objid != '' ">
|
||||
AND UPPER(CUSTOMER_OBJID) LIKE UPPER('%${customer_objid}%')
|
||||
@@ -3612,58 +3614,36 @@ 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.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
|
||||
-->
|
||||
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
|
||||
)
|
||||
SELECT
|
||||
'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}
|
||||
'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}
|
||||
</foreach>
|
||||
,#{Year} AS TARGET_YEAR
|
||||
FROM WITH_BASE_DATA
|
||||
GROUP BY ROLLUP (
|
||||
(YEAR_MONTH, MM) )
|
||||
(YEAR_MONTH, MM) )
|
||||
ORDER BY YEAR_MONTH
|
||||
</select>
|
||||
|
||||
@@ -3682,23 +3662,20 @@ SELECT year, annual, five
|
||||
|
||||
<!-- 영업목표 -->
|
||||
<select id="getYearGoalInfo" parameterType="map" resultType="map">
|
||||
/* contractMgmt.getYearGoalInfo - 연간 목표 대비 실적 (ORDER_TOTAL_AMOUNT 기준) */
|
||||
WITH W_CM AS (
|
||||
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
|
||||
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
|
||||
*
|
||||
,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
|
||||
@@ -3706,23 +3683,19 @@ SELECT year, annual, five
|
||||
,PRICE::integer
|
||||
,WRITER
|
||||
,REGDATE
|
||||
,(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 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 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(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-->
|
||||
,COALESCE((SELECT SUM(ORDER_TOTAL_AMOUNT)/100000000 FROM W_CM CM)::integer, 0) AS CONTRACT_COST_YEAR
|
||||
,CASE
|
||||
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
|
||||
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
|
||||
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>
|
||||
@@ -3772,10 +3745,10 @@ SELECT year, annual, five
|
||||
<select id="getContractCNTBySupply" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
ASM.OBJID
|
||||
,ASM.SUPPLY_NAME
|
||||
,ASM.CLIENT_NM
|
||||
,S1.*
|
||||
FROM
|
||||
SUPPLY_MNG ASM
|
||||
CLIENT_MNG ASM
|
||||
,(
|
||||
SELECT
|
||||
CM.CUSTOMER_OBJID
|
||||
@@ -3784,12 +3757,12 @@ FROM
|
||||
FROM
|
||||
CONTRACT_MGMT CM
|
||||
WHERE CM.CONTRACT_RESULT = '0000964'
|
||||
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
GROUP BY CM.CUSTOMER_OBJID
|
||||
) AS S1
|
||||
WHERE 1=1
|
||||
AND ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
|
||||
ORDER BY ASM.SUPPLY_NAME
|
||||
AND 'C_' || ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
|
||||
ORDER BY ASM.CLIENT_NM
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
@@ -2142,6 +2142,102 @@ 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>
|
||||
|
||||
|
||||
@@ -116,6 +116,16 @@ var columns = [
|
||||
var objid = fnc_checkNull(cell.getData().OBJID);
|
||||
fn_FileRegist(objid,"ECR_RESULT","ECR결과첨부");
|
||||
}
|
||||
},
|
||||
{title:'AMARANTH_STATUS', field:'AMARANTH_STATUS', visible: false},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'결재상태', field:'AMARANTH_STATUS_TITLE',
|
||||
formatter:function(cell){
|
||||
var val = fnc_checkNull(cell.getValue());
|
||||
if(val == "결재 상신중") return "<span style='color:#e67e22; font-weight:bold;'>" + val + "</span>";
|
||||
if(val == "결재완료") return "<span style='color:#27ae60; font-weight:bold;'>" + val + "</span>";
|
||||
if(val == "반려") return "<span style='color:#e74c3c; font-weight:bold;'>" + val + "</span>";
|
||||
return val;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@@ -247,7 +257,7 @@ function fn_openEcrDocPopUp(objId){
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// 결재상신
|
||||
// 결재상신 (Amaranth10 전자결재 SSO 방식)
|
||||
function fn_approval(){
|
||||
var selected = _tabulGrid.getSelectedData();
|
||||
if(selected.length == 0){
|
||||
@@ -259,7 +269,16 @@ function fn_approval(){
|
||||
return;
|
||||
}
|
||||
|
||||
var title = fnc_checkNull(selected[0].ECR_NO) + " " + fnc_checkNull(selected[0].PART_NO);
|
||||
var amaranthStatus = fnc_checkNull(selected[0].AMARANTH_STATUS);
|
||||
if(amaranthStatus == "inProcess"){
|
||||
Swal.fire("결재 진행중인 건은 상신할 수 없습니다.");
|
||||
return;
|
||||
} else if(amaranthStatus == "complete"){
|
||||
Swal.fire("결재 완료된 건은 상신할 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var title = "ECR 결재 - " + fnc_checkNull(selected[0].ECR_NO);
|
||||
var objId = fnc_checkNull(selected[0].OBJID);
|
||||
|
||||
Swal.fire({
|
||||
@@ -271,7 +290,35 @@ function fn_approval(){
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
window.open("/approval/registApproval.do?targetType=ECR&targetObjId="+objId+"&approvalTitle="+encodeURIComponent(title)+"&callbackFnc=fn_search","registApproval","width=700,height=700");
|
||||
fn_openAmaranthApproval(objId, title);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Amaranth10 전자결재 SSO 팝업 열기
|
||||
function fn_openAmaranthApproval(objId, title){
|
||||
$.ajax({
|
||||
url: "/approval/getAmaranthSsoUrl.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"targetType": "ECR",
|
||||
"targetObjId": objId,
|
||||
"approvalTitle": title,
|
||||
"outProcessCode": "${AMARANTH_OUT_PROCESS_CODE}",
|
||||
"formId": "",
|
||||
"compSeq": "1000",
|
||||
"deptSeq": ""
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(data){
|
||||
if(data.resultCode == 0 && data.resultData && data.resultData.fullUrl){
|
||||
window.open(data.resultData.fullUrl, "amaranthApproval", "width=1200,height=900,scrollbars=yes,resizable=yes");
|
||||
} else {
|
||||
Swal.fire("결재 연동 오류: " + (data.resultMsg || "알 수 없는 오류"));
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
Swal.fire("결재 시스템 연동 중 오류가 발생했습니다.");
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -291,7 +338,7 @@ function fn_approval(){
|
||||
<span><%=menuName%></span>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="결재상신" id="btnApproval">
|
||||
<input type="button" class="plm_btns" value="결재상신" id="btnApproval" style="background:#17a2b8; color:white;">
|
||||
<input type="button" class="plm_btns" value="ECR 등록" id="btnRegistEcr">
|
||||
<input type="button" class="plm_btns" value="ECR 결과등록" id="btnRegistResult">
|
||||
<input type="button" class="plm_btns" value="조회" id="btnSearch">
|
||||
|
||||
@@ -901,6 +901,7 @@ public class QualityController {
|
||||
e.printStackTrace();
|
||||
}
|
||||
request.setAttribute("code_map", code_map);
|
||||
request.setAttribute("AMARANTH_OUT_PROCESS_CODE", Constants.AMARANTH_OUT_PROCESS_CODE);
|
||||
return "/quality/ecrList";
|
||||
}
|
||||
|
||||
|
||||
@@ -694,6 +694,13 @@
|
||||
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">
|
||||
|
||||
@@ -2281,7 +2281,17 @@
|
||||
, 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}
|
||||
|
||||
@@ -1843,7 +1843,7 @@ public class ApprovalService {
|
||||
if("CONTRACT_ESTIMATE".equals(targetType)) {
|
||||
fileListEncoded = uploadEstimateFilesToOneChamber(apiClient, empSeq, targetObjId);
|
||||
} else {
|
||||
fileListEncoded = uploadProposalFilesToOneChamber(apiClient, empSeq, targetObjId);
|
||||
fileListEncoded = uploadFilesToOneChamber(apiClient, empSeq, targetObjId, targetType);
|
||||
}
|
||||
} catch(Exception fileEx) {
|
||||
System.err.println("[첨부파일] 원챔버 업로드 중 오류 (결재는 계속 진행): " + fileEx.getMessage());
|
||||
@@ -1901,12 +1901,13 @@ public class ApprovalService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 품의서 첨부파일을 원챔버에 업로드하고 fileList (URL 인코딩) 반환
|
||||
* 결재 대상 첨부파일을 원챔버에 업로드하고 fileList (URL 인코딩) 반환
|
||||
* @param targetType PROPOSAL, ECR 등
|
||||
* @return URL 인코딩된 fileList JSON 문자열 (파일 없으면 null)
|
||||
*/
|
||||
private String uploadProposalFilesToOneChamber(
|
||||
private String uploadFilesToOneChamber(
|
||||
com.pms.api.AmaranthApprovalApiClient apiClient,
|
||||
String empSeq, String targetObjId) throws Exception {
|
||||
String empSeq, String targetObjId, String targetType) throws Exception {
|
||||
|
||||
if(targetObjId == null || targetObjId.isEmpty()) return null;
|
||||
|
||||
@@ -1923,8 +1924,12 @@ public class ApprovalService {
|
||||
StringBuilder listItems = new StringBuilder();
|
||||
int uploadCount = 0;
|
||||
|
||||
// 2. 품의서 본문을 JSP와 동일한 레이아웃의 HTML 파일로 생성하여 업로드
|
||||
// 2. 본문을 HTML 파일로 생성하여 업로드
|
||||
try {
|
||||
String fullHtml = null;
|
||||
String tempFileName = null;
|
||||
|
||||
if("PROPOSAL".equals(targetType)){
|
||||
Map<String, Object> proposalParam = new HashMap<String, Object>();
|
||||
proposalParam.put("PROPOSAL_OBJID", targetObjId);
|
||||
Map<String, Object> proposalInfo = sqlSession.selectOne("salesMng.getProposalInfo", proposalParam);
|
||||
@@ -1933,21 +1938,38 @@ public class ApprovalService {
|
||||
proposalInfo = CommonUtils.toUpperCaseMapKey(proposalInfo);
|
||||
String proposalNo = CommonUtils.checkNull(proposalInfo.get("PROPOSAL_NO"));
|
||||
|
||||
// 품목 리스트 조회
|
||||
Map<String, Object> partParam = new HashMap<String, Object>();
|
||||
partParam.put("PROPOSAL_OBJID", targetObjId);
|
||||
List<Map> partList = sqlSession.selectList("salesMng.getProposalPartList", partParam);
|
||||
|
||||
String fullHtml = buildProposalFormFileHtml(proposalInfo, partList);
|
||||
|
||||
String tempFileName = "구매품의서_" + proposalNo + ".html";
|
||||
java.io.File tempFile = java.io.File.createTempFile("proposal_", ".html");
|
||||
fullHtml = buildProposalFormFileHtml(proposalInfo, partList);
|
||||
tempFileName = "구매품의서_" + proposalNo + ".html";
|
||||
}
|
||||
} else if("ECR".equals(targetType)){
|
||||
Map<String, Object> ecrParam = new HashMap<String, Object>();
|
||||
try {
|
||||
ecrParam.put("OBJID", Long.parseLong(targetObjId));
|
||||
} catch(NumberFormatException nfe){
|
||||
ecrParam.put("OBJID", targetObjId);
|
||||
}
|
||||
Map<String, Object> ecrInfo = sqlSession.selectOne("quality.getEcrInfo", ecrParam);
|
||||
|
||||
if(ecrInfo != null){
|
||||
ecrInfo = CommonUtils.toUpperCaseMapKey(ecrInfo);
|
||||
String ecrNo = CommonUtils.checkNull(ecrInfo.get("ECR_NO"));
|
||||
fullHtml = buildEcrFormFileHtml(ecrInfo);
|
||||
tempFileName = "설계변경요청서_" + ecrNo + ".html";
|
||||
}
|
||||
}
|
||||
|
||||
if(fullHtml != null && tempFileName != null){
|
||||
java.io.File tempFile = java.io.File.createTempFile("approval_", ".html");
|
||||
java.io.OutputStreamWriter writer = new java.io.OutputStreamWriter(
|
||||
new java.io.FileOutputStream(tempFile), "UTF-8");
|
||||
writer.write(fullHtml);
|
||||
writer.close();
|
||||
|
||||
System.out.println("[첨부파일] 품의서 HTML 생성: " + tempFileName + " (" + tempFile.length() + " bytes)");
|
||||
System.out.println("[첨부파일] HTML 생성: " + tempFileName + " (" + tempFile.length() + " bytes)");
|
||||
|
||||
String uploadResponse = apiClient.uploadFileToOneChamber(
|
||||
AMARANTH_BASE_URL, authToken, userHashKey, empSeq, tempFile, tempFileName
|
||||
@@ -1957,13 +1979,12 @@ public class ApprovalService {
|
||||
if(listItem != null){
|
||||
listItems.append(listItem);
|
||||
uploadCount++;
|
||||
System.out.println("[첨부파일] 품의서 HTML 업로드 성공");
|
||||
System.out.println("[첨부파일] HTML 업로드 성공");
|
||||
}
|
||||
|
||||
tempFile.delete();
|
||||
}
|
||||
} catch(Exception htmlEx){
|
||||
System.err.println("[첨부파일] 품의서 HTML 생성/업로드 오류: " + htmlEx.getMessage());
|
||||
System.err.println("[첨부파일] HTML 생성/업로드 오류: " + htmlEx.getMessage());
|
||||
}
|
||||
|
||||
// 3. ATTACH_FILE_INFO에서 기존 첨부파일도 업로드
|
||||
@@ -2407,16 +2428,17 @@ public class ApprovalService {
|
||||
statusParam.put("targetObjId", targetObjId);
|
||||
statusParam.put("status", proposalStatus);
|
||||
|
||||
if("PROPOSAL".equals(targetType)){
|
||||
sqlSession.update("approval.changeProposalApprovalStatus", statusParam);
|
||||
System.out.println("품의서 상태 변경 - targetObjId: " + targetObjId + " → " + proposalStatus);
|
||||
} else if("SALES_REQUEST".equals(targetType)){
|
||||
sqlSession.update("approval.salesRequestApprovalStatus", statusParam);
|
||||
System.out.println("구매요청 상태 변경 - targetObjId: " + targetObjId + " → " + proposalStatus);
|
||||
} else if("CONTRACT_ESTIMATE".equals(targetType)){
|
||||
// 견적서: AMARANTH_APPROVAL 테이블만으로 상태 관리 (품의서와 동일 패턴)
|
||||
System.out.println("견적서 결재 상태 변경 - targetObjId: " + targetObjId + " → " + internalStatus);
|
||||
}
|
||||
if("PROPOSAL".equals(targetType)){
|
||||
sqlSession.update("approval.changeProposalApprovalStatus", statusParam);
|
||||
System.out.println("품의서 상태 변경 - targetObjId: " + targetObjId + " → " + proposalStatus);
|
||||
} else if("SALES_REQUEST".equals(targetType)){
|
||||
sqlSession.update("approval.salesRequestApprovalStatus", statusParam);
|
||||
System.out.println("구매요청 상태 변경 - targetObjId: " + targetObjId + " → " + proposalStatus);
|
||||
} else if("CONTRACT_ESTIMATE".equals(targetType)){
|
||||
System.out.println("견적서 결재 상태 변경 - targetObjId: " + targetObjId + " → " + internalStatus);
|
||||
} else if("ECR".equals(targetType)){
|
||||
System.out.println("ECR 콜백 처리 - targetObjId: " + targetObjId + " (AMARANTH_APPROVAL 상태만 관리)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2462,6 +2484,8 @@ public class ApprovalService {
|
||||
return "";
|
||||
}
|
||||
|
||||
// ECR(quality)은 PMS_QUALITY_ECR 테이블에 STATUS_CD가 없으므로 AMARANTH_APPROVAL만으로 상태 관리
|
||||
|
||||
/**
|
||||
* Amaranth10 결재작성 시 본문 내용 조회 (Binding WebAPI / WebAPI)
|
||||
* 결재 작성 화면이 열릴 때 Amaranth10에서 호출
|
||||
@@ -2506,37 +2530,57 @@ public class ApprovalService {
|
||||
|
||||
System.out.println("매핑 정보 - targetType: " + targetType + ", targetObjId: " + targetObjId);
|
||||
|
||||
if("PROPOSAL".equals(targetType) && !targetObjId.isEmpty()){
|
||||
Map<String, Object> proposalParam = new HashMap();
|
||||
proposalParam.put("PROPOSAL_OBJID", targetObjId);
|
||||
Map<String, Object> proposalInfo = sqlSession.selectOne("salesMng.getProposalInfo", proposalParam);
|
||||
if("PROPOSAL".equals(targetType) && !targetObjId.isEmpty()){
|
||||
Map<String, Object> proposalParam = new HashMap();
|
||||
proposalParam.put("PROPOSAL_OBJID", targetObjId);
|
||||
Map<String, Object> proposalInfo = sqlSession.selectOne("salesMng.getProposalInfo", proposalParam);
|
||||
|
||||
if(proposalInfo != null){
|
||||
proposalInfo = CommonUtils.toUpperCaseMapKey(proposalInfo);
|
||||
contentsHtml = buildProposalContentsHtml(proposalInfo, sqlSession, targetObjId);
|
||||
|
||||
if(proposalInfo != null){
|
||||
proposalInfo = CommonUtils.toUpperCaseMapKey(proposalInfo);
|
||||
contentsHtml = buildProposalContentsHtml(proposalInfo, sqlSession, targetObjId);
|
||||
|
||||
String proposalNo = CommonUtils.checkNull(proposalInfo.get("PROPOSAL_NO"));
|
||||
if(!proposalNo.isEmpty()){
|
||||
title = "품의서 결재 - " + proposalNo;
|
||||
}
|
||||
}
|
||||
} else if("CONTRACT_ESTIMATE".equals(targetType) && !targetObjId.isEmpty()){
|
||||
Map<String, Object> estParam = new HashMap();
|
||||
estParam.put("targetObjId", targetObjId);
|
||||
Map<String, Object> estimateInfo = sqlSession.selectOne("approval.getEstimateInfoForApproval", estParam);
|
||||
|
||||
if(estimateInfo != null){
|
||||
estimateInfo = CommonUtils.toUpperCaseMapKey(estimateInfo);
|
||||
|
||||
List<Map> itemList = sqlSession.selectList("approval.getEstimateItemsForApproval", estParam);
|
||||
contentsHtml = buildEstimateContentsHtml(estimateInfo, itemList);
|
||||
|
||||
String estimateNo = CommonUtils.checkNull(estimateInfo.get("ESTIMATE_NO"));
|
||||
if(!estimateNo.isEmpty()){
|
||||
title = "견적서 결재 - " + estimateNo;
|
||||
}
|
||||
String proposalNo = CommonUtils.checkNull(proposalInfo.get("PROPOSAL_NO"));
|
||||
if(!proposalNo.isEmpty()){
|
||||
title = "품의서 결재 - " + proposalNo;
|
||||
}
|
||||
}
|
||||
} else if("CONTRACT_ESTIMATE".equals(targetType) && !targetObjId.isEmpty()){
|
||||
Map<String, Object> estParam = new HashMap();
|
||||
estParam.put("targetObjId", targetObjId);
|
||||
Map<String, Object> estimateInfo = sqlSession.selectOne("approval.getEstimateInfoForApproval", estParam);
|
||||
|
||||
if(estimateInfo != null){
|
||||
estimateInfo = CommonUtils.toUpperCaseMapKey(estimateInfo);
|
||||
|
||||
List<Map> itemList = sqlSession.selectList("approval.getEstimateItemsForApproval", estParam);
|
||||
contentsHtml = buildEstimateContentsHtml(estimateInfo, itemList);
|
||||
|
||||
String estimateNo = CommonUtils.checkNull(estimateInfo.get("ESTIMATE_NO"));
|
||||
if(!estimateNo.isEmpty()){
|
||||
title = "견적서 결재 - " + estimateNo;
|
||||
}
|
||||
}
|
||||
} else if("ECR".equals(targetType) && !targetObjId.isEmpty()){
|
||||
Map<String, Object> ecrParam = new HashMap();
|
||||
try {
|
||||
ecrParam.put("OBJID", Long.parseLong(targetObjId));
|
||||
} catch(NumberFormatException nfe){
|
||||
ecrParam.put("OBJID", targetObjId);
|
||||
}
|
||||
System.out.println("ECR 본문 조회 - OBJID: " + targetObjId);
|
||||
Map<String, Object> ecrInfo = sqlSession.selectOne("quality.getEcrInfo", ecrParam);
|
||||
System.out.println("ECR 조회 결과: " + (ecrInfo != null ? "데이터 있음" : "null"));
|
||||
|
||||
if(ecrInfo != null){
|
||||
ecrInfo = CommonUtils.toUpperCaseMapKey(ecrInfo);
|
||||
contentsHtml = buildEcrContentsHtml(ecrInfo);
|
||||
|
||||
String ecrNo = CommonUtils.checkNull(ecrInfo.get("ECR_NO"));
|
||||
if(!ecrNo.isEmpty()){
|
||||
title = "ECR 결재 - " + ecrNo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// JSONObject로 안전한 JSON 응답 생성 (이스케이프 자동 처리)
|
||||
@@ -2575,6 +2619,195 @@ public class ApprovalService {
|
||||
/**
|
||||
* 품의서 데이터를 HTML 본문으로 구성
|
||||
*/
|
||||
/**
|
||||
* ECR 데이터를 HTML 본문으로 구성
|
||||
*/
|
||||
private String buildEcrContentsHtml(Map ecrInfo){
|
||||
StringBuilder html = new StringBuilder();
|
||||
|
||||
String ecrNo = CommonUtils.checkNull(ecrInfo.get("ECR_NO"));
|
||||
String requestDate = CommonUtils.checkNull(ecrInfo.get("REQUEST_DATE"));
|
||||
String requesterName = CommonUtils.checkNull(ecrInfo.get("REQUESTER_NAME"));
|
||||
String partNo = CommonUtils.checkNull(ecrInfo.get("PART_NO"));
|
||||
String partName = CommonUtils.checkNull(ecrInfo.get("PART_NAME"));
|
||||
String issueContent = CommonUtils.checkNull(ecrInfo.get("ISSUE_CONTENT"));
|
||||
String dueDate = CommonUtils.checkNull(ecrInfo.get("DUE_DATE"));
|
||||
String actionDeptName = CommonUtils.checkNull(ecrInfo.get("ACTION_DEPT_NAME"));
|
||||
String actionUserName = CommonUtils.checkNull(ecrInfo.get("ACTION_USER_NAME"));
|
||||
String actionContent = CommonUtils.checkNull(ecrInfo.get("ACTION_CONTENT"));
|
||||
String completeDate = CommonUtils.checkNull(ecrInfo.get("COMPLETE_DATE"));
|
||||
String changeTypeName = CommonUtils.checkNull(ecrInfo.get("CHANGE_TYPE_NAME"));
|
||||
String ecrDocSummary = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_SUMMARY"));
|
||||
String ecrDocReason = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_REASON"));
|
||||
|
||||
html.append("<div style='font-family:맑은 고딕,Malgun Gothic,sans-serif; padding:10px;'>");
|
||||
html.append("<h2 style='text-align:center; margin-bottom:15px;'>ECR (Engineering Change Request)</h2>");
|
||||
|
||||
html.append("<table style='width:100%; border-collapse:collapse; border:1px solid #333; margin-bottom:15px;'>");
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold; width:15%;'>ECR No</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; width:35%;'>").append(ecrNo).append("</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold; width:15%;'>요청일</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; width:35%;'>").append(requestDate).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>요청자</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(requesterName).append("</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>설변유형</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(changeTypeName).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>품번</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(partNo).append("</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>품명</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(partName).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>이슈사항</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;' colspan='3' style='white-space:pre-wrap;'>").append(issueContent).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>완료요청일</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(dueDate).append("</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>조치부서</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(actionDeptName).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>조치자</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(actionUserName).append("</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>완료일</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;'>").append(completeDate).append("</td>");
|
||||
html.append("</tr>");
|
||||
|
||||
if(!actionContent.isEmpty()){
|
||||
html.append("<tr>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>조치내용</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:6px;' colspan='3' style='white-space:pre-wrap;'>").append(actionContent).append("</td>");
|
||||
html.append("</tr>");
|
||||
}
|
||||
html.append("</table>");
|
||||
|
||||
if(!ecrDocSummary.isEmpty() || !ecrDocReason.isEmpty()){
|
||||
html.append("<h3 style='margin:15px 0 8px;'>설계변경요청서</h3>");
|
||||
html.append("<table style='width:100%; border-collapse:collapse; border:1px solid #333;'>");
|
||||
if(!ecrDocSummary.isEmpty()){
|
||||
html.append("<tr><td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold; width:15%;'>요약</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:8px; white-space:pre-wrap;'>").append(ecrDocSummary).append("</td></tr>");
|
||||
}
|
||||
if(!ecrDocReason.isEmpty()){
|
||||
html.append("<tr><td style='border:1px solid #333; padding:6px; background:#f0f0f0; font-weight:bold;'>변경사유</td>");
|
||||
html.append("<td style='border:1px solid #333; padding:8px; white-space:pre-wrap;'>").append(ecrDocReason).append("</td></tr>");
|
||||
}
|
||||
html.append("</table>");
|
||||
}
|
||||
|
||||
html.append("</div>");
|
||||
return html.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* ECR 데이터를 첨부파일용 완전한 HTML 파일로 구성
|
||||
*/
|
||||
private String buildEcrFormFileHtml(Map ecrInfo){
|
||||
StringBuilder html = new StringBuilder();
|
||||
|
||||
String ecrNo = CommonUtils.checkNull(ecrInfo.get("ECR_NO"));
|
||||
String requestDate = CommonUtils.checkNull(ecrInfo.get("REQUEST_DATE"));
|
||||
String requesterName = CommonUtils.checkNull(ecrInfo.get("REQUESTER_NAME"));
|
||||
String partNo = CommonUtils.checkNull(ecrInfo.get("PART_NO"));
|
||||
String partName = CommonUtils.checkNull(ecrInfo.get("PART_NAME"));
|
||||
String issueContent = CommonUtils.checkNull(ecrInfo.get("ISSUE_CONTENT"));
|
||||
String dueDate = CommonUtils.checkNull(ecrInfo.get("DUE_DATE"));
|
||||
String actionDeptName = CommonUtils.checkNull(ecrInfo.get("ACTION_DEPT_NAME"));
|
||||
String actionUserName = CommonUtils.checkNull(ecrInfo.get("ACTION_USER_NAME"));
|
||||
String actionContent = CommonUtils.checkNull(ecrInfo.get("ACTION_CONTENT"));
|
||||
String completeDate = CommonUtils.checkNull(ecrInfo.get("COMPLETE_DATE"));
|
||||
String changeTypeName = CommonUtils.checkNull(ecrInfo.get("CHANGE_TYPE_NAME"));
|
||||
String ecrDocFormNo = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_FORM_NO"));
|
||||
String ecrRevNo = CommonUtils.checkNull(ecrInfo.get("ECR_REV_NO"));
|
||||
String ecrRevDate = CommonUtils.checkNull(ecrInfo.get("ECR_REV_DATE"));
|
||||
String ecrDocAuthor = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_AUTHOR"));
|
||||
String ecrDocSummary = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_SUMMARY"));
|
||||
String ecrDocReason = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_REASON"));
|
||||
|
||||
html.append("<!DOCTYPE html><html><head><meta charset='UTF-8'>");
|
||||
html.append("<title>ECR - ").append(ecrNo).append("</title>");
|
||||
html.append("<style>");
|
||||
html.append("body{font-family:'Malgun Gothic','Arial',sans-serif;padding:0;background:#fff;}");
|
||||
html.append(".ecr_container{width:100%;max-width:800px;margin:0 auto;border:1px solid #333;}");
|
||||
html.append(".ecr_header{display:table;width:100%;border-bottom:1px solid #333;}");
|
||||
html.append(".ecr_header_center{display:table-cell;vertical-align:middle;text-align:center;background:#1565a0;color:white;padding:15px;}");
|
||||
html.append(".ecr_header_center h1{font-size:28px;margin:0 0 5px;}");
|
||||
html.append(".ecr_header_center p{font-size:14px;margin:0;}");
|
||||
html.append(".ecr_header_right{display:table-cell;width:180px;vertical-align:top;border-left:1px solid #333;}");
|
||||
html.append(".ecr_header_right table{width:100%;border-collapse:collapse;}");
|
||||
html.append(".ecr_header_right td{padding:5px 8px;font-size:12px;border-bottom:1px solid #ccc;}");
|
||||
html.append(".ecr_header_right td:first-child{font-weight:bold;width:70px;}");
|
||||
html.append(".ecr_body{padding:20px;}");
|
||||
html.append("table.info{width:100%;border-collapse:collapse;margin-bottom:15px;}");
|
||||
html.append("table.info td,table.info th{border:1px solid #333;padding:8px;}");
|
||||
html.append(".lbl{background:#f0f0f0;font-weight:bold;width:15%;}");
|
||||
html.append(".section_title{font-weight:bold;font-size:13px;text-decoration:underline;margin:15px 0 5px;}");
|
||||
html.append(".content_box{border:1px solid #ccc;padding:10px;min-height:100px;white-space:pre-wrap;font-size:13px;}");
|
||||
html.append(".ecr_footer{padding:10px 15px;font-size:11px;border-top:1px solid #ccc;}");
|
||||
html.append("</style></head><body>");
|
||||
|
||||
html.append("<div class='ecr_container'>");
|
||||
|
||||
html.append("<div class='ecr_header'>");
|
||||
html.append("<div class='ecr_header_center'><h1>ECR</h1><p>(Engineering Change Request)</p></div>");
|
||||
html.append("<div class='ecr_header_right'><table>");
|
||||
html.append("<tr><td>Form no.</td><td>").append(ecrDocFormNo).append("</td></tr>");
|
||||
html.append("<tr><td>Rev.no</td><td>").append(ecrRevNo).append("</td></tr>");
|
||||
html.append("<tr><td>Rev. date</td><td>").append(ecrRevDate).append("</td></tr>");
|
||||
html.append("<tr><td>Author</td><td>").append(ecrDocAuthor).append("</td></tr>");
|
||||
html.append("</table></div></div>");
|
||||
|
||||
html.append("<div class='ecr_body'>");
|
||||
|
||||
html.append("<table class='info'>");
|
||||
html.append("<tr><td class='lbl'>ECR No</td><td>").append(ecrNo).append("</td>");
|
||||
html.append("<td class='lbl'>요청일</td><td>").append(requestDate).append("</td></tr>");
|
||||
html.append("<tr><td class='lbl'>요청자</td><td>").append(requesterName).append("</td>");
|
||||
html.append("<td class='lbl'>설변유형</td><td>").append(changeTypeName).append("</td></tr>");
|
||||
html.append("<tr><td class='lbl'>품번</td><td>").append(partNo).append("</td>");
|
||||
html.append("<td class='lbl'>품명</td><td>").append(partName).append("</td></tr>");
|
||||
html.append("<tr><td class='lbl'>이슈사항</td><td colspan='3' style='white-space:pre-wrap;'>").append(issueContent).append("</td></tr>");
|
||||
html.append("<tr><td class='lbl'>완료요청일</td><td>").append(dueDate).append("</td>");
|
||||
html.append("<td class='lbl'>조치부서</td><td>").append(actionDeptName).append("</td></tr>");
|
||||
html.append("<tr><td class='lbl'>조치자</td><td>").append(actionUserName).append("</td>");
|
||||
html.append("<td class='lbl'>완료일</td><td>").append(completeDate).append("</td></tr>");
|
||||
if(!actionContent.isEmpty()){
|
||||
html.append("<tr><td class='lbl'>조치내용</td><td colspan='3' style='white-space:pre-wrap;'>").append(actionContent).append("</td></tr>");
|
||||
}
|
||||
html.append("</table>");
|
||||
|
||||
if(!ecrDocSummary.isEmpty()){
|
||||
html.append("<div class='section_title'>요약 (Summary)</div>");
|
||||
html.append("<div class='content_box'>").append(ecrDocSummary).append("</div>");
|
||||
}
|
||||
if(!ecrDocReason.isEmpty()){
|
||||
html.append("<div class='section_title'>변경사항 설명 (이유 / 배경)</div>");
|
||||
html.append("<div class='content_box'>").append(ecrDocReason).append("</div>");
|
||||
}
|
||||
|
||||
html.append("</div>");
|
||||
|
||||
html.append("<div class='ecr_footer'>");
|
||||
html.append("<p>Confidential! © RPS reserves all rights even in the event of industrial property rights.</p>");
|
||||
html.append("<p>We reserve all rights of disposal such as copying and passing on to third parties!</p>");
|
||||
html.append("</div>");
|
||||
|
||||
html.append("</div>");
|
||||
html.append("</body></html>");
|
||||
return html.toString();
|
||||
}
|
||||
|
||||
private String buildProposalContentsHtml(Map proposalInfo, SqlSession sqlSession, String targetObjId){
|
||||
StringBuilder html = new StringBuilder();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user