Compare commits

...

2 Commits

Author SHA1 Message Date
b63bf68f4e auto commit 2026-01-27 11:30:52 +09:00
aa51e3668f 입고등록버튼 주석처리 2026-01-27 11:26:07 +09:00
5 changed files with 1404 additions and 71 deletions

View File

@@ -3137,6 +3137,7 @@
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
PM.BOM_REPORT_OBJID,
PM.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SOURCE_BOM_TYPE,
@@ -3293,6 +3294,7 @@
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS PROCESSING_UNIT_PRICE,
0 AS TOTAL_PRICE,
1 AS LEVEL
FROM
@@ -3373,6 +3375,7 @@
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS PROCESSING_UNIT_PRICE,
0 AS TOTAL_PRICE,
1 AS LEVEL
FROM
@@ -3426,6 +3429,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,
@@ -3848,7 +3852,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 +3865,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 +4051,7 @@
MD.PO_QTY,
MD.VENDOR,
MD.UNIT_PRICE,
MD.PROCESSING_UNIT_PRICE,
MD.TOTAL_PRICE,
MD.CURRENCY,
MD.LEAD_TIME,
@@ -4100,6 +4105,7 @@
SHORTAGE_QTY,
VENDOR,
UNIT_PRICE,
PROCESSING_UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
@@ -4144,6 +4150,7 @@
A.SHORTAGE_QTY,
A.VENDOR,
A.UNIT_PRICE,
A.PROCESSING_UNIT_PRICE,
A.TOTAL_PRICE,
A.CURRENCY,
A.LEAD_TIME,
@@ -4196,6 +4203,7 @@
B.SHORTAGE_QTY,
B.VENDOR,
B.UNIT_PRICE,
B.PROCESSING_UNIT_PRICE,
B.TOTAL_PRICE,
B.CURRENCY,
B.LEAD_TIME,
@@ -4248,6 +4256,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,
@@ -4410,6 +4419,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,
@@ -4931,4 +4941,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 &lt;= TO_DATE(#{search_change_date_to}, 'YYYY-MM-DD') + INTERVAL '1 day'
</if>
ORDER BY MH.CHANGE_DATE DESC
</select>
<!-- M-BOM 변경이력 상세 조회 (개별 히스토리 건) -->
<select id="getMbomHistoryDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID AS HISTORY_OBJID,
MH.MBOM_HEADER_OBJID,
MH.CHANGE_TYPE,
MH.CHANGE_DESCRIPTION,
MH.BEFORE_DATA::TEXT AS BEFORE_DATA,
MH.AFTER_DATA::TEXT AS AFTER_DATA,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
MH.CHANGE_USER,
COALESCE(
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MH.CHANGE_USER LIMIT 1),
MH.CHANGE_USER
) AS CHANGE_USER_NAME,
-- PROJECT 정보
PM.PROJECT_NO,
PM.PART_NO,
PM.PART_NAME
FROM MBOM_HISTORY MH
INNER JOIN MBOM_HEADER MHD ON MH.MBOM_HEADER_OBJID = MHD.OBJID
INNER JOIN PROJECT_MGMT PM ON MHD.PROJECT_OBJID = PM.OBJID::VARCHAR
WHERE MH.OBJID::VARCHAR = #{historyObjId}
</select>
</mapper>

View File

@@ -879,10 +879,15 @@
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,
-- 발주수량: PO_QTY가 있고 0보다 크면 사용, 아니면 QTY 사용
CASE
WHEN SRP.PO_QTY IS NOT NULL AND SRP.PO_QTY::NUMERIC > 0 THEN SRP.PO_QTY::VARCHAR
WHEN SRP.QTY IS NOT NULL THEN SRP.QTY::VARCHAR
ELSE '0'
END 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,
@@ -3317,7 +3322,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
@@ -4246,6 +4251,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
@@ -6123,4 +6129,192 @@ 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
<!-- 발주수량 -->
,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
<!-- 수입검사 검사현황 (품목별: 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
<!-- 매입마감일 -->
,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>
<if test="delivery_start_date != null and delivery_start_date != ''">
AND TO_DATE(POM.DELIVERY_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(POM.DELIVERY_DATE, 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{delivery_end_date}, 'YYYY-MM-DD')
</if>
<if test="partner_objid != null and partner_objid != ''">
AND POM.PARTNER_OBJID = REPLACE(#{partner_objid}, 'C_', '')
</if>
<if test="sales_mng_user_ids != null and sales_mng_user_ids != ''">
AND POM.SALES_MNG_USER_ID IN
<foreach item="value" collection="sales_mng_user_ids.split(',')" open="(" separator="," close=")">
#{value}
</foreach>
</if>
<if test="reg_start_date != null and reg_start_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{reg_start_date}, 'YYYY-MM-DD')
</if>
<if test="reg_end_date != null and reg_end_date != ''">
AND TO_DATE(TO_CHAR(POM.REGDATE,'YYYY-MM-DD'), 'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{reg_end_date}, 'YYYY-MM-DD')
</if>
<if test="delivery_status != null and delivery_status != ''">
AND (CASE
WHEN COALESCE(POP.ORDER_QTY::NUMERIC, 0) - COALESCE(AP_AGG.DELIVERY_QTY, 0) <![CDATA[ <= ]]> 0 THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) = #{delivery_status}
</if>
<if test="SEARCH_PART_NO != null and SEARCH_PART_NO != ''">
AND TRIM(UPPER(POP.PART_NO)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NO}))||'%'
</if>
<if test="SEARCH_PART_NAME != null and SEARCH_PART_NAME != ''">
AND TRIM(UPPER(POP.PART_NAME)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_NAME}))||'%'
</if>
<if test="SEARCH_PART_SPEC != null and SEARCH_PART_SPEC != ''">
AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%'
</if>
ORDER BY POM.REGDATE DESC, POP.OBJID
</select>
</mapper>

View File

@@ -1208,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>
@@ -1486,17 +1496,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
@@ -1537,6 +1547,14 @@
<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 +1663,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
@@ -1902,11 +1938,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 +2034,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 +2073,7 @@
, STATUS
, REMARK
, WRITER
, RECEIPT_USER_ID
, REG_DATE
) VALUES (
#{OBJID}
@@ -2047,6 +2095,7 @@
, #{STATUS}
, #{REMARK}
, #{WRITER}
, #{RECEIPT_USER_ID}
, NOW()
)
</insert>
@@ -2067,6 +2116,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 +2135,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 관리
===================================================== -->

File diff suppressed because it is too large Load Diff

View File

@@ -317,7 +317,7 @@ function fn_purchaseClose(){
</h2>
<div class="btnArea">
<input type="button" class="plm_btns" value="조회" id="btnSearch">
<input type="button" class="plm_btns" value="입고등록" id="btnAccept">
<!-- <input type="button" class="plm_btns" value="입고등록" id="btnAccept"> -->
<input type="button" class="plm_btns" value="매입마감" id="btnClose">
</div>
</div>