파일저장도 확인완료

This commit is contained in:
leeheejin
2025-12-16 17:59:55 +09:00
parent a8fbd65757
commit fa7797fdd9
4 changed files with 828 additions and 227 deletions

View File

@@ -666,7 +666,7 @@
,POM.PURCHASE_ORDER_NO
,CM.PROJECT_NO
,CODE_NAME(CM.PRODUCT) AS PRODUCT_NAME
<!-- 품번/품명 (첫번째 + 외 N건) -->
,(SELECT
CASE
@@ -702,24 +702,85 @@
ELSE '입고중'
END) AS DELIVERY_STATUS
<!-- 검사 정보 (INCOMING_INSPECTION_DETAIL에서 조회) -->
,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.INSPECTOR_ID) AS INSPECTOR_NAME
,IID.INSPECTION_DATE
,(CASE WHEN IID.NG_COUNT > 0 THEN 'NG'
WHEN IID.TOTAL_COUNT > 0 AND IID.TOTAL_COUNT = IID.INSPECTED_COUNT THEN 'OK'
WHEN IID.INSPECTED_COUNT > 0 THEN '검사중'
<!-- 요청 정보 (INCOMING_INSPECTION_DETAIL에서 조회) -->
,(SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME
,IID.REQUEST_DATE
<!-- 검사 정보 (INCOMING_INSPECTION_DEFECT에서 조회) -->
/* 검사자: XXX 외 N건 형태 */
,DEFECT.INSPECTOR_NAME_DISPLAY AS INSPECTOR_NAME
/* 검사일: YYYY-MM-DD 외 N건 형태 */
,DEFECT.INSPECTION_DATE_DISPLAY AS INSPECTION_DATE
/* 검사결과: 하나라도 NG면 NG, 검사 대상(스킵 제외) 모두 검사완료면 OK, 일부만 검사면 검사중 */
,(CASE WHEN DEFECT.NG_COUNT > 0 THEN 'NG'
WHEN DEFECT.INSPECTION_TARGET_COUNT > 0 AND DEFECT.INSPECTION_TARGET_COUNT = DEFECT.INSPECTED_COUNT THEN 'OK'
WHEN DEFECT.INSPECTED_COUNT > 0 THEN '검사중'
ELSE '' END) AS INSPECTION_RESULT
/* 검사여부: 검사가 하나라도 있으면 '검사', 모두 스킵이면 '스킵', 아무것도 없으면 빈값 */
,(CASE WHEN IID.INSPECTION_YN_COUNT > 0 THEN '검사'
WHEN IID.SKIP_YN_COUNT > 0 AND IID.INSPECTION_YN_COUNT = 0 THEN '스킵'
ELSE '' END) AS INSPECTION_YN
/* 요청현황: 입고내역 기준으로 검사여부 선택 현황 계산
미요청: 입고건이 있지만 전부 검사여부 미선택
요청중: 일부만 검사여부 선택됨
요청완료: 전부 검사여부 선택됨 */
,(CASE WHEN REQ.DELIVERY_TOTAL_COUNT IS NULL OR REQ.DELIVERY_TOTAL_COUNT = 0 THEN ''
WHEN REQ.SELECTED_COUNT = 0 THEN '미요청'
WHEN REQ.SELECTED_COUNT <![CDATA[ < ]]> REQ.DELIVERY_TOTAL_COUNT THEN '요청중'
ELSE '요청완료' END) AS REQUEST_STATUS
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = POM.OBJID AND AF.DOC_TYPE = 'INSPECTION_FILE' AND UPPER(AF.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
FROM PURCHASE_ORDER_MASTER AS POM
LEFT OUTER JOIN (
SELECT PURCHASE_ORDER_MASTER_OBJID
,MAX(INSPECTOR_ID) AS INSPECTOR_ID
,MAX(INSPECTION_DATE) AS INSPECTION_DATE
,MAX(REQUEST_USER_ID) AS REQUEST_USER_ID
,MAX(REQUEST_DATE) AS REQUEST_DATE
,COUNT(*) AS TOTAL_COUNT
,COUNT(CASE WHEN INSPECTION_RESULT IS NOT NULL AND INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT
,COUNT(CASE WHEN INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT
/* 검사여부 카운트: 검사 선택 건수, 스킵 선택 건수 */
,COUNT(CASE WHEN INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_YN_COUNT
,COUNT(CASE WHEN INSPECTION_YN = '스킵' THEN 1 END) AS SKIP_YN_COUNT
FROM INCOMING_INSPECTION_DETAIL
GROUP BY PURCHASE_ORDER_MASTER_OBJID
) AS IID ON POM.OBJID::VARCHAR = IID.PURCHASE_ORDER_MASTER_OBJID
/* 불량상세 테이블에서 검사일/검사자/검사결과 집계 (스킵 항목 제외) */
LEFT OUTER JOIN (
SELECT IID2.PURCHASE_ORDER_MASTER_OBJID
/* 검사자: 여러명이면 "XXX 외 N건" 형태로 표시 */
,CASE
WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) > 1
THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID)) || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTOR_ID) - 1) || '건'
WHEN COUNT(DISTINCT IDF.INSPECTOR_ID) = 1
THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(IDF.INSPECTOR_ID))
ELSE ''
END AS INSPECTOR_NAME_DISPLAY
/* 검사일: 여러개면 "YYYY-MM-DD 외 N건" 형태로 표시 */
,CASE
WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) > 1
THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD') || ' 외 ' || (COUNT(DISTINCT IDF.INSPECTION_DATE) - 1) || '건'
WHEN COUNT(DISTINCT IDF.INSPECTION_DATE) = 1
THEN TO_CHAR(MIN(IDF.INSPECTION_DATE), 'YYYY-MM-DD')
ELSE ''
END AS INSPECTION_DATE_DISPLAY
/* 검사 대상 건수 (스킵 제외, 검사인 항목만) */
,COUNT(CASE WHEN IID2.INSPECTION_YN = '검사' THEN 1 END) AS INSPECTION_TARGET_COUNT
/* 검사결과 입력된 건수 */
,COUNT(CASE WHEN IDF.INSPECTION_RESULT IS NOT NULL AND IDF.INSPECTION_RESULT != '' THEN 1 END) AS INSPECTED_COUNT
,COUNT(CASE WHEN IDF.INSPECTION_RESULT = 'NG' THEN 1 END) AS NG_COUNT
FROM INCOMING_INSPECTION_DETAIL IID2
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF ON IDF.INSPECTION_DETAIL_OBJID = IID2.OBJID
GROUP BY IID2.PURCHASE_ORDER_MASTER_OBJID
) AS DEFECT ON POM.OBJID::VARCHAR = DEFECT.PURCHASE_ORDER_MASTER_OBJID
/* 입고내역 기준 검사여부 선택 현황 (요청현황 계산용) */
LEFT OUTER JOIN (
SELECT IMI.PURCHASE_ORDER_MASTER_OBJID
,COUNT(*) AS DELIVERY_TOTAL_COUNT
,COUNT(CASE WHEN IID.INSPECTION_YN IS NOT NULL AND IID.INSPECTION_YN != '' THEN 1 END) AS SELECTED_COUNT
FROM INVENTORY_MGMT_IN IMI
LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID IS NOT NULL
GROUP BY IMI.PURCHASE_ORDER_MASTER_OBJID
) AS REQ ON POM.OBJID::VARCHAR = REQ.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN (
SELECT POP.PURCHASE_ORDER_MASTER_OBJID
,SUM(POP.ORDER_QTY::NUMERIC) AS TOTAL_PO_QTY
@@ -792,6 +853,11 @@
WHEN IID.INSPECTED_COUNT > 0 THEN '검사중'
ELSE '' END) = #{search_inspection_result}
</if>
<!-- 요청현황 필터 (수입검사 진행 리스트에서 요청완료 건만 조회) -->
<if test="request_status_filter != null and request_status_filter == '요청완료'">
AND REQ.DELIVERY_TOTAL_COUNT = REQ.SELECTED_COUNT
AND REQ.SELECTED_COUNT > 0
</if>
ORDER BY POM.REGDATE DESC
</select>
@@ -1497,6 +1563,7 @@
<!-- 반제품검사 상세 조회 (타입별) -->
<select id="getSemiProductInspectionByType" parameterType="map" resultType="map">
SELECT SPI.OBJID AS "OBJID"
, SPI.OBJID AS "ROW_ID"
, COALESCE(SPI.MODEL_NAME, '') AS "MODEL_NAME"
, COALESCE(SPI.PRODUCT_TYPE, '') AS "PRODUCT_TYPE"
, COALESCE(SPI.WORK_ORDER_NO, '') AS "WORK_ORDER_NO"
@@ -1515,6 +1582,10 @@
, COALESCE(SPI.REMARK, '') AS "REMARK"
, SPI.DATA_TYPE AS "DATA_TYPE"
, COALESCE(SPI.INSPECTION_GROUP_ID, '') AS "INSPECTION_GROUP_ID"
<!-- 파일 카운트 조회 -->
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_IMAGE' AND AFI.STATUS = 'Active') AS "IMAGE_FILE_CNT"
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_NCR' AND AFI.STATUS = 'Active') AS "NCR_FILE_CNT"
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_REPORT' AND AFI.STATUS = 'Active') AS "REPORT_FILE_CNT"
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE 1=1
<if test="INSPECTION_GROUP_ID != null and INSPECTION_GROUP_ID != ''">
@@ -1574,6 +1645,12 @@
WHERE OBJID = #{OBJID}
</update>
<!-- 반제품검사 데이터 삭제 (그룹ID 기준) -->
<delete id="deleteSemiProductInspectionByGroupId" parameterType="map">
DELETE FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID}
</delete>
<!-- 반제품검사 데이터 저장 (새 팝업 형식) -->
<insert id="insertSemiProductInspectionData" parameterType="map">
INSERT INTO PMS_QUALITY_SEMI_PRODUCT_INSPECTION (
@@ -1623,6 +1700,40 @@
)
</insert>
<!-- 반제품검사 데이터 수정 (기존 OBJID 유지) -->
<update id="updateSemiProductInspectionData" parameterType="map">
UPDATE PMS_QUALITY_SEMI_PRODUCT_INSPECTION SET
MODEL_NAME = #{MODEL_NAME}
, PRODUCT_TYPE = #{PRODUCT_TYPE}
, WORK_ORDER_NO = #{WORK_ORDER_NO}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, RECEIPT_QTY = COALESCE(NULLIF(#{RECEIPT_QTY}, '')::NUMERIC, 0)
, GOOD_QTY = COALESCE(NULLIF(#{GOOD_QTY}, '')::NUMERIC, 0)
, DEFECT_QTY = COALESCE(NULLIF(#{DEFECT_QTY}, '')::NUMERIC, 0)
, DEFECT_TYPE = #{DEFECT_TYPE}
, DEFECT_CAUSE = #{DEFECT_CAUSE}
, RESPONSIBLE_DEPT = #{RESPONSIBLE_DEPT}
, PROCESS_STATUS = #{PROCESS_STATUS}
, INSPECTION_DATE = CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
, INSPECTOR = #{INSPECTOR}
, DISPOSITION_TYPE = #{DISPOSITION_TYPE}
, REMARK = #{REMARK}
WHERE OBJID = #{OBJID}
</update>
<!-- 반제품검사 데이터 삭제 (특정 OBJID 제외) -->
<delete id="deleteSemiProductInspectionExcludeObjIds" parameterType="map">
DELETE FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID}
<if test="EXCLUDE_OBJIDS != null and EXCLUDE_OBJIDS.size() > 0">
AND OBJID NOT IN
<foreach collection="EXCLUDE_OBJIDS" item="objId" open="(" separator="," close=")">
#{objId}
</foreach>
</if>
</delete>
<!-- =====================================================
고객 CS 관리
===================================================== -->
@@ -2020,7 +2131,10 @@
) THEN 'Y' ELSE 'N' END AS INSPECTION_FILE
, IID.OBJID AS INSPECTION_DETAIL_OBJID
, IID.INSPECTION_TYPE
, COALESCE(IID.INSPECTION_YN, '검사') AS INSPECTION_YN
, COALESCE(IID.INSPECTION_YN, '') AS INSPECTION_YN
, IID.REQUEST_DATE
, IID.REQUEST_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME
, IID.DEFECT_TYPE
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_TYPE) AS DEFECT_TYPE_NAME
, IID.DEFECT_REASON
@@ -2043,6 +2157,54 @@
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
LEFT JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
<!-- <if test="INSPECTION_YN != null and INSPECTION_YN != ''">
AND IID.INSPECTION_YN = #{INSPECTION_YN}
</if> -->
ORDER BY IMI.REGDATE, PM.PART_NO
</select>
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) -->
<select id="getIncomingInspectionProgressDetailList" parameterType="map" resultType="map">
SELECT IMI.OBJID
, IMI.PARENT_OBJID
, IM.PART_OBJID
, PM.PART_NO
, PM.PART_NAME
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
, IMI.RECEIPT_QTY AS DELIVERY_QTY
, CASE WHEN EXISTS (
SELECT 1 FROM ATTACH_FILE_INFO DF
WHERE DF.TARGET_OBJID = POM.OBJID::VARCHAR
AND DF.DOC_TYPE = 'INSPECTION_FILE'
) THEN 'Y' ELSE 'N' END AS INSPECTION_FILE
, IID.OBJID AS INSPECTION_DETAIL_OBJID
, IID.INSPECTION_TYPE
, IID.INSPECTION_YN
, IID.REQUEST_DATE
, IID.REQUEST_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = IID.REQUEST_USER_ID) AS REQUEST_USER_NAME
, IID.DEFECT_TYPE
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_TYPE) AS DEFECT_TYPE_NAME
, IID.DEFECT_REASON
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_REASON) AS DEFECT_REASON_NAME
, IID.ACTION_STATUS
, IID.INSPECTION_QTY
, IID.DEFECT_QTY
, CASE WHEN NULLIF(IID.INSPECTION_QTY, '')::NUMERIC > 0
THEN ROUND((COALESCE(NULLIF(IID.DEFECT_QTY, '')::NUMERIC, 0) / NULLIF(IID.INSPECTION_QTY, '')::NUMERIC) * 100, 2)
ELSE NULL END AS DEFECT_RATE
, IID.INSPECTION_RESULT
, IID.ATTACH_FILE_OBJID
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = IMI.OBJID AND AFI.DOC_TYPE = 'INCOMING_INSPECTION' AND STATUS = 'Active') AS ATTACH_FILE_CNT
, IID.REMARK
, IMI.PURCHASE_ORDER_MASTER_OBJID
, POM.PURCHASE_ORDER_NO
FROM INVENTORY_MGMT_IN IMI
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
INNER JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID AND IID.INSPECTION_YN = '검사'
WHERE IMI.PURCHASE_ORDER_MASTER_OBJID = #{PURCHASE_ORDER_MASTER_OBJID}
ORDER BY IMI.REGDATE, PM.PART_NO
</select>
@@ -2062,6 +2224,8 @@
OBJID
, INVENTORY_IN_OBJID
, PURCHASE_ORDER_MASTER_OBJID
, REQUEST_DATE
, REQUEST_USER_ID
, INSPECTION_DATE
, INSPECTOR_ID
, INSPECTION_TYPE
@@ -2080,6 +2244,8 @@
#{NEW_OBJID}
, #{OBJID}
, #{PURCHASE_ORDER_MASTER_OBJID}
, #{REQUEST_DATE}
, #{REQUEST_USER_ID}
, #{INSPECTION_DATE}
, #{INSPECTOR_ID}
, #{INSPECTION_TYPE}
@@ -2096,20 +2262,120 @@
, NOW()
)
ON CONFLICT (INVENTORY_IN_OBJID) DO UPDATE SET
INSPECTION_DATE = #{INSPECTION_DATE}
, INSPECTOR_ID = #{INSPECTOR_ID}
, INSPECTION_TYPE = #{INSPECTION_TYPE}
, INSPECTION_YN = #{INSPECTION_YN}
, DEFECT_TYPE = #{DEFECT_TYPE}
, DEFECT_REASON = #{DEFECT_REASON}
, ACTION_STATUS = #{ACTION_STATUS}
, INSPECTION_QTY = #{INSPECTION_QTY}
, DEFECT_QTY = #{DEFECT_QTY}
, INSPECTION_RESULT = #{INSPECTION_RESULT}
, ATTACH_FILE_OBJID = #{ATTACH_FILE_OBJID}
, REMARK = #{REMARK}
REQUEST_DATE = COALESCE(#{REQUEST_DATE}, INCOMING_INSPECTION_DETAIL.REQUEST_DATE)
, REQUEST_USER_ID = COALESCE(#{REQUEST_USER_ID}, INCOMING_INSPECTION_DETAIL.REQUEST_USER_ID)
, INSPECTION_DATE = COALESCE(#{INSPECTION_DATE}, INCOMING_INSPECTION_DETAIL.INSPECTION_DATE)
, INSPECTOR_ID = COALESCE(#{INSPECTOR_ID}, INCOMING_INSPECTION_DETAIL.INSPECTOR_ID)
, INSPECTION_TYPE = COALESCE(#{INSPECTION_TYPE}, INCOMING_INSPECTION_DETAIL.INSPECTION_TYPE)
, INSPECTION_YN = COALESCE(#{INSPECTION_YN}, INCOMING_INSPECTION_DETAIL.INSPECTION_YN)
, DEFECT_TYPE = COALESCE(#{DEFECT_TYPE}, INCOMING_INSPECTION_DETAIL.DEFECT_TYPE)
, DEFECT_REASON = COALESCE(#{DEFECT_REASON}, INCOMING_INSPECTION_DETAIL.DEFECT_REASON)
, ACTION_STATUS = COALESCE(#{ACTION_STATUS}, INCOMING_INSPECTION_DETAIL.ACTION_STATUS)
, INSPECTION_QTY = COALESCE(#{INSPECTION_QTY}, INCOMING_INSPECTION_DETAIL.INSPECTION_QTY)
, DEFECT_QTY = COALESCE(#{DEFECT_QTY}, INCOMING_INSPECTION_DETAIL.DEFECT_QTY)
, INSPECTION_RESULT = COALESCE(#{INSPECTION_RESULT}, INCOMING_INSPECTION_DETAIL.INSPECTION_RESULT)
, ATTACH_FILE_OBJID = COALESCE(#{ATTACH_FILE_OBJID}, INCOMING_INSPECTION_DETAIL.ATTACH_FILE_OBJID)
, REMARK = COALESCE(#{REMARK}, INCOMING_INSPECTION_DETAIL.REMARK)
, MODIFIER = #{WRITER}
, MOD_DATE = NOW()
</update>
<!-- =====================================================
수입검사 불량상세 (INCOMING_INSPECTION_DEFECT) 관련 쿼리
===================================================== -->
<!-- 불량상세 목록 조회 -->
<select id="getIncomingInspectionDefectList" parameterType="map" resultType="map">
SELECT
D.OBJID
, D.INSPECTION_DETAIL_OBJID
, D.INSPECTION_TYPE
, TO_CHAR(D.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
, D.INSPECTOR_ID
, U.USER_NAME AS INSPECTOR_NAME
, D.DEFECT_TYPE
, D.DEFECT_REASON
, D.ACTION_STATUS
, D.ACTION_RESULT
, D.INSPECTION_QTY
, D.DEFECT_QTY
, CASE WHEN COALESCE(NULLIF(D.INSPECTION_QTY, ''), '0')::NUMERIC > 0
THEN ROUND((COALESCE(NULLIF(D.DEFECT_QTY, ''), '0')::NUMERIC / COALESCE(NULLIF(D.INSPECTION_QTY, ''), '1')::NUMERIC) * 100, 2)
ELSE 0
END AS DEFECT_RATE
, D.INSPECTION_RESULT
, D.REMARK
, D.WRITER
, TO_CHAR(D.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO F WHERE F.TARGET_OBJID = D.OBJID AND F.DOC_TYPE = 'INSPECTION_DEFECT_IMAGE' AND UPPER(F.STATUS) = 'ACTIVE') AS IMAGE_FILE_CNT
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO F WHERE F.TARGET_OBJID = D.OBJID AND F.DOC_TYPE = 'INSPECTION_DEFECT_FILE' AND UPPER(F.STATUS) = 'ACTIVE') AS ATTACH_FILE_CNT
FROM INCOMING_INSPECTION_DEFECT D
LEFT JOIN USER_INFO U ON D.INSPECTOR_ID = U.USER_ID
WHERE D.INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID}
ORDER BY D.REG_DATE ASC
</select>
<!-- 불량상세 저장 (INSERT/UPDATE) -->
<insert id="saveIncomingInspectionDefect" parameterType="map">
INSERT INTO INCOMING_INSPECTION_DEFECT (
OBJID
, INSPECTION_DETAIL_OBJID
, INSPECTION_TYPE
, INSPECTION_DATE
, INSPECTOR_ID
, DEFECT_TYPE
, DEFECT_REASON
, ACTION_STATUS
, ACTION_RESULT
, INSPECTION_QTY
, DEFECT_QTY
, INSPECTION_RESULT
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{INSPECTION_DETAIL_OBJID}
, #{INSPECTION_TYPE}
, #{INSPECTION_DATE}::DATE
, #{INSPECTOR_ID}
, #{DEFECT_TYPE}
, #{DEFECT_REASON}
, #{ACTION_STATUS}
, #{ACTION_RESULT}
, #{INSPECTION_QTY}
, #{DEFECT_QTY}
, #{INSPECTION_RESULT}
, #{REMARK}
, #{WRITER}
, NOW()
)
ON CONFLICT (OBJID) DO UPDATE SET
INSPECTION_TYPE = #{INSPECTION_TYPE}
, INSPECTION_DATE = #{INSPECTION_DATE}::DATE
, INSPECTOR_ID = #{INSPECTOR_ID}
, DEFECT_TYPE = #{DEFECT_TYPE}
, DEFECT_REASON = #{DEFECT_REASON}
, ACTION_STATUS = #{ACTION_STATUS}
, ACTION_RESULT = #{ACTION_RESULT}
, INSPECTION_QTY = #{INSPECTION_QTY}
, DEFECT_QTY = #{DEFECT_QTY}
, INSPECTION_RESULT = #{INSPECTION_RESULT}
, REMARK = #{REMARK}
, MODIFIER = #{WRITER}
, MOD_DATE = NOW()
</insert>
<!-- 불량상세 삭제 -->
<delete id="deleteIncomingInspectionDefect" parameterType="map">
DELETE FROM INCOMING_INSPECTION_DEFECT
WHERE OBJID = #{OBJID}
</delete>
<!-- 불량상세 전체 삭제 (검사상세 기준) -->
<delete id="deleteIncomingInspectionDefectByDetail" parameterType="map">
DELETE FROM INCOMING_INSPECTION_DEFECT
WHERE INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID}
</delete>
</mapper>