Files
wace_plm/src/com/pms/mapper/quality.xml

2623 lines
107 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="quality">
<!-- //품질검사 중복 count 반환 -->
<select id="getDuplicateQualityTestCnt" parameterType="map" resultType="map">
SELECT COUNT(*) AS CNT
FROM PMS_QUALITY_TEST_INFO
WHERE 1=1
AND CAR_OBJID = #{carObjId}
AND PROD_OBJID = #{prodObjId}
AND TEST_TYPE_OBJID = #{testTypeObjId}
AND STEP1 = #{step1}
AND STEP2 = #{step2}
</select>
<!-- 품질검사 갑지등록 -->
<insert id="insertQualityTestInfo" parameterType="map">
MERGE INTO PMS_QUALITY_TEST_INFO USING DUAL ON (OBJID = #{objId})
WHEN MATCHED THEN
UPDATE SET
CAR_OBJID = #{carObjId}
, PROD_OBJID = #{prodObjId}
, TEST_TYPE_OBJID = #{testTypeObjId}
, STEP1 = #{step1}
, STEP2 = #{step2}
WHEN NOT MATCHED THEN
INSERT (
OBJID
, CAR_OBJID
, PROD_OBJID
, TEST_TYPE_OBJID
, STEP1
, STEP2
, WRITER
, REGDATE
, STATUS
) VALUES (
#{objId}
, #{carObjId}
, #{prodObjId}
, #{testTypeObjId}
, #{step1}
, #{step2}
, #{writer}
, SYSDATE
, 'create'
)
</insert>
<!-- //품질결과 임시목록 -->
<select id="getQualityTestTempList" parameterType="map" resultType="map">
SELECT *
FROM(
SELECT A.*, ROW_NUMBER() OVER (ORDER BY REGDATE_ORG DESC) RNUM
FROM(
SELECT A.*
FROM(
SELECT A.OBJID
, (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID)) AS OEM_NAME
, A.CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS MODEL_CODE
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID)) AS PROD_GROUP_NAME
, A.PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_NAME
, A.TEST_TYPE_OBJID
, (SELECT TEST_TYPE_NAME FROM TEST_TYPE_MNG WHERE OBJID = A.TEST_TYPE_OBJID) AS TEST_TYPE_NAME
, A.STEP1
, A.STEP2
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_USER_NAME
, A.REGDATE AS REGDATE_ORG
, TO_CHAR(A.REGDATE, 'YYYY-MM-DD') AS REGDATE
, A.STATUS
FROM PMS_QUALITY_TEST_INFO A
WHERE 1=1
AND UPPER(STATUS) = 'CREATE'
)A WHERE 1=1
<if test="search_oem !=null and search_oem !=''">
AND OEM_OBJID = #{search_oem}
</if>
<if test="search_productGroup != null and search_productGroup !=''">
AND PROD_GROUP_OBJID = #{search_productGroup}
</if>
<if test="search_carType != null and search_carType != ''">
AND CAR_OBJID = #{search_carType}
</if>
<if test="search_productType != null and search_productType !=''">
AND PROD_OBJID = #{search_productType}
</if>
<if test="search_writer != null and !''.equals(search_writer)">
AND UPPER(WRITER_USER_NAME) LIKE UPPER('%${search_writer}%')
</if>
<if test="search_status !=null and search_status !='' ">
AND STATUS = #{search_status}
</if>
<if test="search_testType !=null and search_testType !='' ">
AND TEST_TYPE_OBJID = #{search_testType}
</if>
<if test="step1 !=null and step1 !='' ">
AND STEP1 = #{step1}
</if>
<if test="step2 !=null and step2 !='' ">
AND STEP2 = #{step2}
</if>
)A WHERE 1=1
) WHERE 1=1
<if test="PAGE_END != null and PAGE_END !=''">
<![CDATA[ AND RNUM <= #{PAGE_END} ]]>
</if>
<if test="PAGE_START != null and PAGE_STRART!=''">
<![CDATA[ AND RNUM >= #{PAGE_START} ]]>
</if>
</select>
<!-- //품질결과 임시목록 Count -->
<select id="getQualityTestTempListCnt" parameterType="map" resultType="map">
SELECT CEIL(TOTAL_CNT/#{COUNT_PER_PAGE}) MAX_PAGE_SIZE,
TOTAL_CNT
FROM (
SELECT COUNT(1) TOTAL_CNT
FROM(
SELECT A.*
FROM(
SELECT A.OBJID
, (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID)) AS OEM_NAME
, A.CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS MODEL_CODE
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID)) AS PROD_GROUP_NAME
, A.PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_NAME
, A.TEST_TYPE_OBJID
, (SELECT TEST_TYPE_NAME FROM TEST_TYPE_MNG WHERE OBJID = A.TEST_TYPE_OBJID) AS TEST_TYPE_NAME
, A.STEP1
, A.STEP2
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_USER_NAME
, A.REGDATE AS REGDATE_ORG
, TO_CHAR(A.REGDATE, 'YYYY-MM-DD') AS REGDATE
, A.STATUS
FROM PMS_QUALITY_TEST_INFO A
WHERE 1=1
AND UPPER(STATUS) = 'CREATE'
)A WHERE 1=1
<if test="search_oem !=null and search_oem !=''">
AND OEM_OBJID = #{search_oem}
</if>
<if test="search_productGroup != null and search_productGroup !=''">
AND PROD_GROUP_OBJID = #{search_productGroup}
</if>
<if test="search_carType != null and search_carType != ''">
AND CAR_OBJID = #{search_carType}
</if>
<if test="search_productType != null and search_productType !=''">
AND PROD_OBJID = #{search_productType}
</if>
<if test="search_resDeptName != null and !''.equals(search_resDeptName)">
AND UPPER(RES_PIC_DEPT_NAME) LIKE UPPER('%${search_resDeptName}%')
</if>
<if test="search_status !=null and search_status !='' ">
AND STATUS = #{search_status}
</if>
<if test="search_testType !=null and search_testType !='' ">
AND TEST_TYPE_OBJID = #{search_testType}
</if>
<if test="step1 !=null and step1 !='' ">
AND STEP1 = #{step1}
</if>
<if test="step2 !=null and step2 !='' ">
AND STEP2 = #{step2}
</if>
)A WHERE 1=1
)WHERE 1=1
</select>
<!-- //품질결과 확정목록 -->
<select id="getQualityTestList" parameterType="map" resultType="map">
SELECT *
FROM(
SELECT A.*, ROW_NUMBER() OVER (ORDER BY REGDATE_ORG DESC) RNUM
FROM(
SELECT A.*
FROM(
SELECT A.OBJID
, (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID)) AS OEM_NAME
, A.CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS MODEL_CODE
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID)) AS PROD_GROUP_NAME
, A.PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_NAME
, A.TEST_TYPE_OBJID
, (SELECT TEST_TYPE_NAME FROM TEST_TYPE_MNG WHERE OBJID = A.TEST_TYPE_OBJID) AS TEST_TYPE_NAME
, A.STEP1
, A.STEP2
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_USER_NAME
, A.REGDATE AS REGDATE_ORG
, TO_CHAR(A.REGDATE, 'YYYY-MM-DD') AS REGDATE
, A.STATUS
, (SELECT COUNT(WBS_TASK.OBJID) AS TASK_CNT FROM PMS_WBS_TASK WBS_TASK,PMS_REL_WBS_TASK_FNC_TASK REL WHERE REL.TARGET_OBJID = WBS_TASK.OBJID AND REL.SUB_OBJID = A.OBJID) AS REL_TASK_CNT
FROM PMS_QUALITY_TEST_INFO A
WHERE 1=1
AND UPPER(STATUS) = 'COMPLETE'
)A WHERE 1=1
<if test="search_oem !=null and search_oem !=''">
AND OEM_OBJID = #{search_oem}
</if>
<if test="search_productGroup != null and search_productGroup !=''">
AND PROD_GROUP_OBJID = #{search_productGroup}
</if>
<if test="search_carType != null and search_carType != ''">
AND CAR_OBJID = #{search_carType}
</if>
<if test="search_productType != null and search_productType !=''">
AND PROD_OBJID = #{search_productType}
</if>
<if test="search_writer != null and !''.equals(search_writer)">
AND UPPER(WRITER_USER_NAME) LIKE UPPER('%${search_writer}%')
</if>
<if test="search_status !=null and search_status !='' ">
AND STATUS = #{search_status}
</if>
<if test="search_testType !=null and search_testType !='' ">
AND TEST_TYPE_OBJID = #{search_testType}
</if>
<if test="step1 !=null and step1 !='' ">
AND STEP1 = #{step1}
</if>
<if test="step2 !=null and step2 !='' ">
AND STEP2 = #{step2}
</if>
<if test="search_fromMonthRegDate != null and search_fromMonthRegDate !='' ">
AND TO_DATE(TO_CHAR(A.REGDATE, 'YYYY-MM'),'YYYY-MM') <![CDATA[ >= ]]> TO_DATE(#{search_fromMonthRegDate},'YYYY-MM')
</if>
<if test="search_toMonthRegDate != null and search_toMonthRegDate !='' ">
AND TO_DATE(TO_CHAR(A.REGDATE, 'YYYY-MM'),'YYYY-MM') <![CDATA[ <= ]]> TO_DATE(#{search_toMonthRegDate},'YYYY-MM')
</if>
)A WHERE 1=1
) WHERE 1=1
<if test="PAGE_END != null and PAGE_END !=''">
<![CDATA[ AND RNUM <= #{PAGE_END} ]]>
</if>
<if test="PAGE_START != null and PAGE_STRART!=''">
<![CDATA[ AND RNUM >= #{PAGE_START} ]]>
</if>
</select>
<!-- //품질결과 확정목록 Count -->
<select id="getQualityTestListCnt" parameterType="map" resultType="map">
SELECT CEIL(TOTAL_CNT/#{COUNT_PER_PAGE}) MAX_PAGE_SIZE,
TOTAL_CNT
FROM (
SELECT COUNT(1) TOTAL_CNT
FROM(
SELECT A.*
FROM(
SELECT A.OBJID
, (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = A.CAR_OBJID)) AS OEM_NAME
, A.CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS MODEL_CODE
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID)) AS PROD_GROUP_NAME
, A.PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_NAME
, A.TEST_TYPE_OBJID
, (SELECT TEST_TYPE_NAME FROM TEST_TYPE_MNG WHERE OBJID = A.TEST_TYPE_OBJID) AS TEST_TYPE_NAME
, A.STEP1
, A.STEP2
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS WRITER_USER_NAME
, A.REGDATE AS REGDATE_ORG
, TO_CHAR(A.REGDATE, 'YYYY-MM-DD') AS REGDATE
, A.STATUS
FROM PMS_QUALITY_TEST_INFO A
WHERE 1=1
AND UPPER(STATUS) = 'COMPLETE'
)A WHERE 1=1
<if test="search_oem !=null and search_oem !=''">
AND OEM_OBJID = #{search_oem}
</if>
<if test="search_productGroup != null and search_productGroup !=''">
AND PROD_GROUP_OBJID = #{search_productGroup}
</if>
<if test="search_carType != null and search_carType != ''">
AND CAR_OBJID = #{search_carType}
</if>
<if test="search_productType != null and search_productType !=''">
AND PROD_OBJID = #{search_productType}
</if>
<if test="search_writer != null and !''.equals(search_writer)">
AND UPPER(WRITER_USER_NAME) LIKE UPPER('%search_writer%')
</if>
<if test="search_status !=null and search_status !='' ">
AND STATUS = #{search_status}
</if>
<if test="search_testType !=null and search_testType !='' ">
AND TEST_TYPE_OBJID = #{search_testType}
</if>
<if test="step1 !=null and step1 !='' ">
AND STEP1 = #{step1}
</if>
<if test="step2 !=null and step2 !='' ">
AND STEP2 = #{step2}
</if>
<if test="search_fromMonthRegDate != null and search_fromMonthRegDate !='' ">
AND TO_DATE(TO_CHAR(A.REGDATE, 'YYYY-MM'),'YYYY-MM') <![CDATA[ >= ]]> TO_DATE(#{search_fromMonthRegDate},'YYYY-MM')
</if>
<if test="search_toMonthRegDate != null and search_toMonthRegDate !='' ">
AND TO_DATE(TO_CHAR(A.REGDATE, 'YYYY-MM'),'YYYY-MM') <![CDATA[ <= ]]> TO_DATE(#{search_toMonthRegDate},'YYYY-MM')
</if>
)A WHERE 1=1
)WHERE 1=1
</select>
<!-- //품질검사 상세 part목록 -->
<select id="getQualityTestDetailPartList" parameterType="map" resultType="map">
SELECT ROW_NUMBER() OVER(ORDER BY SEQ) AS RNUM
, QUALITY_MASTER.PART_MASTER_OBJID
, QUALITY_MASTER.OEM_OBJID
, QUALITY_MASTER.CAR_OBJID
, QUALITY_MASTER.PROD_GROUP_OBJID
, QUALITY_MASTER.PROD_OBJID
, QUALITY_MASTER.PART_NO
, QUALITY_MASTER.PART_NAME
, QUALITY_MASTER.SEQ
, QUALITY_MASTER.RATE
, QUALITY_MASTER.MOLD_MAKE_COMPANY
, QUALITY_MASTER.PROBLEM_CNT
, QUALITY_MASTER.QUALITY_MASTER_OBJID
, QUALITY_MASTER.TEST_TYPE_OBJID
, QUALITY_MASTER.STEP1
, QUALITY_MASTER.STEP2
, QUALITY_MASTER.STATUS AS QUALITY_MASTER_STATUS
, QUALITY_SLAVE.OBJID AS QUALITY_SLAVE_OBJID
, QUALITY_SLAVE.SCORE
, QUALITY_SLAVE.RESULT
, QUALITY_SLAVE.TYPE1
, QUALITY_SLAVE.TYPE2
FROM (
SELECT PART.PART_MASTER_OBJID
, PART.OEM_OBJID
, PART.CAR_OBJID
, PART.PROD_GROUP_OBJID
, PART.PROD_OBJID
, PART.PART_NO
, PART.PART_NAME
, PART.SEQ
, UPPER(PART.RATE) AS RATE
, MOLD_MAKE_COMPANY
, PART.PROBLEM_CNT
, Q_M.OBJID AS QUALITY_MASTER_OBJID
, Q_M.TEST_TYPE_OBJID
, Q_M.STEP1
, Q_M.STEP2
, Q_M.STATUS
FROM (
SELECT M.OBJID AS PART_MASTER_OBJID
, M.OEM_OBJID
, M.CAR_OBJID
, M.PROD_GROUP_OBJID
, M.PROD_OBJID
, S.PART_NO
, (SELECT PART_NAME FROM PART_INFO WHERE PART_NO = S.PART_NO AND UPPER(STATUS) = 'COMPLETE' AND IS_LAST = 1) AS PART_NAME
, S.SEQ
<!--
, (SELECT RATE FROM (SELECT TARGET_OBJID, RATE, PART_NO FROM PMS_DEV_MASTER_REL_PART_INFO WHERE RATE IS NOT NULL ORDER BY DEV_POINT DESC) A, PMS_DEV_MASTER B WHERE A.TARGET_OBJID = B.OBJID AND B.TARGET_OBJID = M.OBJID AND A.PART_NO = S.PART_NO AND ROWNUM = 1) AS RATE
, (SELECT MOLD_MAKE_COMPANY FROM (SELECT TARGET_OBJID, MOLD_MAKE_COMPANY, PART_NO FROM PMS_DEV_MASTER_REL_PART_INFO WHERE MOLD_MAKE_COMPANY IS NOT NULL ORDER BY DEV_POINT DESC) A, PMS_DEV_MASTER B WHERE A.TARGET_OBJID = B.OBJID AND B.TARGET_OBJID = M.OBJID AND A.PART_NO = S.PART_NO AND ROWNUM = 1) AS MOLD_MAKE_COMPANY
-->
, (SELECT RATE FROM (SELECT B.RATE, B.PART_NO FROM PMS_DEV_MASTER A, PMS_DEV_MASTER_REL_PART_INFO B WHERE A.OBJID = B.TARGET_OBJID AND B.RATE IS NOT NULL ORDER BY DEV_POINT DESC) A WHERE A.PART_NO = S.PART_NO AND ROWNUM = 1) AS RATE
, (SELECT MOLD_MAKE_COMPANY FROM (SELECT B.MOLD_MAKE_COMPANY, B.PART_NO FROM PMS_DEV_MASTER A, PMS_DEV_MASTER_REL_PART_INFO B WHERE A.OBJID = B.TARGET_OBJID AND B.MOLD_MAKE_COMPANY IS NOT NULL ORDER BY DEV_POINT DESC) A WHERE A.PART_NO = S.PART_NO AND ROWNUM = 1) AS MOLD_MAKE_COMPANY
, (SELECT COUNT(*) FROM PMS_PROBLEM_INFO WHERE PART_NO = S.PART_NO AND UNMANAGE_TYPE IS NULL) PROBLEM_CNT
FROM PMS_PART_MASTER M, PMS_PART_MASTER_CONNECT_PART S
WHERE 1=1
AND M.OBJID = S.TARGET_OBJID
AND UPPER(S.IS_DEL) IS NULL
ORDER BY S.SEQ) PART, PMS_QUALITY_TEST_INFO Q_M
WHERE 1=1
AND PART.CAR_OBJID = Q_M.CAR_OBJID
AND PART.PROD_OBJID = Q_M.PROD_OBJID
AND Q_M.OBJID = ${targetObjId}
) QUALITY_MASTER, PMS_QUALITY_TEST_REL_PART_ATTR QUALITY_SLAVE
WHERE 1=1
AND QUALITY_MASTER.QUALITY_MASTER_OBJID = QUALITY_SLAVE.TARGET_OBJID(+)
AND QUALITY_MASTER.PART_NO = QUALITY_SLAVE.PART_NO(+)
</select>
<!-- //품질검사 part별 정보 저장 -->
<update id="saveQualityTestPartInfo" parameterType="map">
MERGE INTO PMS_QUALITY_TEST_REL_PART_ATTR USING DUAL ON (OBJID = #{objId})
WHEN MATCHED THEN
UPDATE SET
SCORE = #{score}
, RESULT = #{result}
, TYPE1 = #{type1}
, TYPE2 = #{type2}
WHEN NOT MATCHED THEN
INSERT (
OBJID
, TARGET_OBJID
, PART_NO
, SCORE
, RESULT
, TYPE1
, TYPE2
, WRITER
, REGDATE
, STATUS
) VALUES (
#{objId}
, #{targetObjId}
, #{partNo}
, #{score}
, #{result}
, #{type1}
, #{type2}
, #{writer}
, SYSDATE
, 'create'
)
</update>
<!-- //품질검사 갑지 확정 -->
<update id="completeQualityTestInfo" parameterType="map">
UPDATE PMS_QUALITY_TEST_INFO SET STATUS = 'complete' WHERE OBJID = #{targetObjId}
</update>
<!-- //품질검사 갑지조회 -->
<select id="getQualityTestInfo" parameterType="map" resultType="map">
SELECT OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = CAR_OBJID)) AS OEM_NAME
, (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = CAR_OBJID) AS OEM_OBJID
, CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = CAR_OBJID) AS CAR_CODE
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = PROD_OBJID)) AS PRODUCT_GROUP_NAME
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = PROD_OBJID) AS PROD_GROUP_OBJID
, PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = PROD_OBJID) AS PRODUCT_NAME
, TEST_TYPE_OBJID
, (SELECT TEST_TYPE_NAME FROM TEST_TYPE_MNG WHERE OBJID = TEST_TYPE_OBJID) AS TEST_TYPE_NAME
, STEP1
, DECODE(STEP1, 'design', '설계', 'develop', '개발', 'production', '양산', '') AS STEP1_NAME
, STEP2
, WRITER
, REGDATE
, STATUS
FROM PMS_QUALITY_TEST_INFO
WHERE 1=1
AND OBJID = #{targetObjId}
</select>
<!-- =====================================================
품질관리 기초정보관리
===================================================== -->
<!-- 검사구분 목록 조회 -->
<select id="getInspectionTypeList" parameterType="map" resultType="map">
SELECT OBJID
, INSPECTION_TYPE_NAME
, STATUS
, TO_CHAR(REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM PMS_QUALITY_INSPECTION_TYPE
WHERE 1=1
ORDER BY REG_DATE DESC
</select>
<!-- 검사구분 등록 -->
<insert id="insertInspectionType" parameterType="map">
INSERT INTO PMS_QUALITY_INSPECTION_TYPE (
OBJID
, INSPECTION_TYPE_NAME
, STATUS
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{INSPECTION_TYPE_NAME}
, #{STATUS}
, #{writer}
, SYSDATE
)
</insert>
<!-- 검사구분 수정 -->
<update id="updateInspectionType" parameterType="map">
UPDATE PMS_QUALITY_INSPECTION_TYPE
SET INSPECTION_TYPE_NAME = #{INSPECTION_TYPE_NAME}
, STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<!-- 검사구분 삭제 -->
<delete id="deleteInspectionType" parameterType="map">
DELETE FROM PMS_QUALITY_INSPECTION_TYPE
WHERE OBJID = #{OBJID}
</delete>
<!-- 불량유형 목록 조회 -->
<select id="getDefectTypeList" parameterType="map" resultType="map">
SELECT OBJID
, DEFECT_TYPE_NAME
, STATUS
, TO_CHAR(REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM PMS_QUALITY_DEFECT_TYPE
WHERE 1=1
ORDER BY REG_DATE DESC
</select>
<!-- 불량유형 등록 -->
<insert id="insertDefectType" parameterType="map">
INSERT INTO PMS_QUALITY_DEFECT_TYPE (
OBJID
, DEFECT_TYPE_NAME
, STATUS
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{DEFECT_TYPE_NAME}
, #{STATUS}
, #{writer}
, SYSDATE
)
</insert>
<!-- 불량유형 수정 -->
<update id="updateDefectType" parameterType="map">
UPDATE PMS_QUALITY_DEFECT_TYPE
SET DEFECT_TYPE_NAME = #{DEFECT_TYPE_NAME}
, STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<!-- 불량유형 삭제 -->
<delete id="deleteDefectType" parameterType="map">
DELETE FROM PMS_QUALITY_DEFECT_TYPE
WHERE OBJID = #{OBJID}
</delete>
<!-- 불량원인 목록 조회 -->
<select id="getDefectReasonList" parameterType="map" resultType="map">
SELECT A.OBJID
, A.DEFECT_TYPE_OBJID
, B.DEFECT_TYPE_NAME
, A.DEFECT_REASON_NAME
, A.STATUS
, TO_CHAR(A.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM PMS_QUALITY_DEFECT_REASON A
LEFT JOIN PMS_QUALITY_DEFECT_TYPE B ON A.DEFECT_TYPE_OBJID = B.OBJID
WHERE 1=1
<if test="DEFECT_TYPE_OBJID != null and DEFECT_TYPE_OBJID != ''">
AND A.DEFECT_TYPE_OBJID = #{DEFECT_TYPE_OBJID}
</if>
ORDER BY B.DEFECT_TYPE_NAME, A.REG_DATE DESC
</select>
<!-- 불량원인 등록 -->
<insert id="insertDefectReason" parameterType="map">
INSERT INTO PMS_QUALITY_DEFECT_REASON (
OBJID
, DEFECT_TYPE_OBJID
, DEFECT_REASON_NAME
, STATUS
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{DEFECT_TYPE_OBJID}
, #{DEFECT_REASON_NAME}
, #{STATUS}
, #{writer}
, SYSDATE
)
</insert>
<!-- 불량원인 수정 -->
<update id="updateDefectReason" parameterType="map">
UPDATE PMS_QUALITY_DEFECT_REASON
SET DEFECT_REASON_NAME = #{DEFECT_REASON_NAME}
, STATUS = #{STATUS}
WHERE OBJID = #{OBJID}
</update>
<!-- 불량원인 삭제 -->
<delete id="deleteDefectReason" parameterType="map">
DELETE FROM PMS_QUALITY_DEFECT_REASON
WHERE OBJID = #{OBJID}
</delete>
<!-- 불량유형별 불량원인 일괄 삭제 -->
<delete id="deleteDefectReasonByType" parameterType="map">
DELETE FROM PMS_QUALITY_DEFECT_REASON
WHERE DEFECT_TYPE_OBJID = #{OBJID}
</delete>
<!-- =====================================================
수입검사 관리
===================================================== -->
<!-- 품의서 번호 목록 조회 (검색조건용) -->
<select id="getProposalNoList" parameterType="map" resultType="map">
SELECT DISTINCT PROPOSAL_NO
FROM SALES_REQUEST_MASTER
WHERE PROPOSAL_NO IS NOT NULL
ORDER BY PROPOSAL_NO DESC
</select>
<!-- 발주서 번호 목록 조회 (검색조건용) -->
<select id="getPurchaseOrderNoList" parameterType="map" resultType="map">
SELECT DISTINCT PURCHASE_ORDER_NO
FROM PURCHASE_ORDER_MASTER
WHERE PURCHASE_ORDER_NO IS NOT NULL
ORDER BY PURCHASE_ORDER_NO DESC
</select>
<!-- 프로젝트 번호 목록 조회 (검색조건용) -->
<select id="getProjectNoList" parameterType="map" resultType="map">
SELECT DISTINCT PROJECT_NO
FROM CONTRACT_MNG
WHERE PROJECT_NO IS NOT NULL
ORDER BY PROJECT_NO DESC
</select>
<!-- 공급업체 목록 조회 (검색조건용) -->
<select id="getPartnerList" parameterType="map" resultType="map">
SELECT OBJID::VARCHAR, SUPPLY_NAME AS PARTNER_NAME
FROM ADMIN_SUPPLY_MNG
WHERE 1=1
ORDER BY SUPPLY_NAME
</select>
<!-- 검사자 목록 조회 (검색조건용) -->
<select id="getInspectorList" parameterType="map" resultType="map">
SELECT USER_ID, USER_NAME
FROM USER_INFO
WHERE STATUS = 'active'
ORDER BY USER_NAME
</select>
<!-- 수입검사 목록 조회 -->
<select id="getIncomingInspectionList" parameterType="map" resultType="map">
SELECT POM.OBJID
<!-- 품의서 번호 -->
,POM.SALES_REQUEST_OBJID AS PROPOSAL_OBJID
,(SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
,POM.PURCHASE_ORDER_NO
,CM.PROJECT_NO
,CODE_NAME(CM.PRODUCT) AS PRODUCT_NAME
<!-- 품번/품명 (첫번째 + 외 N건) -->
,(SELECT
CASE
WHEN COUNT(*) > 1 THEN MIN(POP.PART_NO) || ' 외 ' || (COUNT(*) - 1) || '건'
ELSE MIN(POP.PART_NO)
END
FROM PURCHASE_ORDER_PART POP
WHERE POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
) AS PART_NO
,(SELECT
CASE
WHEN COUNT(*) > 1 THEN MIN(POP.PART_NAME) || ' 외 ' || (COUNT(*) - 1) || '건'
ELSE MIN(POP.PART_NAME)
END
FROM PURCHASE_ORDER_PART POP
WHERE POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
) AS PART_NAME
<!-- 공급업체 (CLIENT_MNG) -->
,POM.PARTNER_OBJID
,(SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
<!-- 발주수량 -->
,(SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) AS TOTAL_PO_QTY
<!-- 입고수량/미입고수량 -->
,S1.TOTAL_DELIVERY_QTY
,((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0)) AS NON_DELIVERY_QTY
<!-- 입고상태 -->
,(CASE WHEN 0 <![CDATA[ >= ]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0)) THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) AS DELIVERY_STATUS
<!-- 요청 정보 (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
/* 검사현황: 불량상세 처리결과(ACTION_RESULT)가 전부 있으면 완료, 일부만 있으면 진행중 */
,(CASE WHEN DEFECT.DEFECT_TOTAL_COUNT > 0 AND DEFECT.DEFECT_TOTAL_COUNT = DEFECT.ACTION_RESULT_COUNT THEN '완료'
WHEN DEFECT.ACTION_RESULT_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(REQUEST_USER_ID) AS REQUEST_USER_ID
,MAX(REQUEST_DATE) AS REQUEST_DATE
,COUNT(*) AS TOTAL_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 IID2.INSPECTION_YN = '검사' THEN IDF.OBJID END) AS DEFECT_TOTAL_COUNT
/* 처리결과(ACTION_RESULT) 입력된 건수 */
,COUNT(CASE WHEN IID2.INSPECTION_YN = '검사' AND IDF.ACTION_RESULT IS NOT NULL AND IDF.ACTION_RESULT != '' THEN 1 END) AS ACTION_RESULT_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
,MAX(DH.RECEIPT_DATE) AS CUR_DELIVERY_DATE
,SUM(DH.RECEIPT_QTY::NUMERIC) AS TOTAL_DELIVERY_QTY
FROM PURCHASE_ORDER_PART POP
LEFT OUTER JOIN ARRIVAL_PLAN DH ON POP.OBJID = DH.ORDER_PART_OBJID
GROUP BY POP.PURCHASE_ORDER_MASTER_OBJID
) AS S1 ON POM.OBJID::VARCHAR = S1.PURCHASE_ORDER_MASTER_OBJID
LEFT OUTER JOIN PROJECT_MGMT AS CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
WHERE 1=1
AND POM.MAIL_SEND_DATE IS NOT NULL
AND (MULTI_MASTER_YN = 'Y' OR NVL(MULTI_MASTER_YN, '') != 'Y' AND NVL(MULTI_YN, '') != 'Y')
<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="search_project_no != null and search_project_no != ''">
AND CM.PROJECT_NO LIKE '%' || #{search_project_no} || '%'
</if>
<if test="search_part_no != null and search_part_no != ''">
AND POM.OBJID::VARCHAR IN (
SELECT PURCHASE_ORDER_MASTER_OBJID FROM PURCHASE_ORDER_PART
WHERE TRIM(UPPER(PART_NO)) LIKE '%' || TRIM(UPPER(#{search_part_no})) || '%'
)
</if>
<if test="search_part_name != null and search_part_name != ''">
AND POM.OBJID::VARCHAR IN (
SELECT PURCHASE_ORDER_MASTER_OBJID FROM PURCHASE_ORDER_PART
WHERE TRIM(UPPER(PART_NAME)) LIKE '%' || TRIM(UPPER(#{search_part_name})) || '%'
)
</if>
<if test="search_partner != null and search_partner != ''">
AND POM.PARTNER_OBJID = #{search_partner}
</if>
<if test="search_partner_name != null and search_partner_name != ''">
AND UPPER((SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID)) LIKE UPPER('%' || #{search_partner_name} || '%')
</if>
<if test="search_delivery_status != null and search_delivery_status != ''">
AND (CASE WHEN 0 <![CDATA[ >= ]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0)) THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) = #{search_delivery_status}
</if>
<!-- 프로젝트번호 (multi select) - OBJID로 검색 -->
<if test="project_nos != null and project_nos != ''">
AND CM.OBJID::VARCHAR IN
<foreach item="item" collection="project_nos.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<!-- 검사자 -->
<if test="inspector_id != null and inspector_id != ''">
AND EXISTS (
SELECT 1 FROM INCOMING_INSPECTION_DETAIL IID_SUB
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF_SUB ON IDF_SUB.INSPECTION_DETAIL_OBJID = IID_SUB.OBJID
WHERE IID_SUB.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
AND IDF_SUB.INSPECTOR_ID = #{inspector_id}
)
</if>
<!-- 검사일 (시작) -->
<if test="inspection_start_date != null and inspection_start_date != ''">
AND EXISTS (
SELECT 1 FROM INCOMING_INSPECTION_DETAIL IID_SUB
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF_SUB ON IDF_SUB.INSPECTION_DETAIL_OBJID = IID_SUB.OBJID
WHERE IID_SUB.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
AND IDF_SUB.INSPECTION_DATE <![CDATA[ >= ]]> TO_DATE(#{inspection_start_date}, 'YYYY-MM-DD')
)
</if>
<!-- 검사일 (종료) -->
<if test="inspection_end_date != null and inspection_end_date != ''">
AND EXISTS (
SELECT 1 FROM INCOMING_INSPECTION_DETAIL IID_SUB
LEFT JOIN INCOMING_INSPECTION_DEFECT IDF_SUB ON IDF_SUB.INSPECTION_DETAIL_OBJID = IID_SUB.OBJID
WHERE IID_SUB.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
AND IDF_SUB.INSPECTION_DATE <![CDATA[ <= ]]> TO_DATE(#{inspection_end_date}, 'YYYY-MM-DD')
)
</if>
<!-- 검사결과 -->
<if test="search_inspection_result != null and search_inspection_result != ''">
AND (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) = #{search_inspection_result}
</if>
<!-- 요청자 -->
<if test="request_user_id != null and request_user_id != ''">
AND IID.REQUEST_USER_ID = #{request_user_id}
</if>
<!-- 요청일 (시작) -->
<if test="request_start_date != null and request_start_date != ''">
AND IID.REQUEST_DATE <![CDATA[ >= ]]> #{request_start_date}
</if>
<!-- 요청일 (종료) -->
<if test="request_end_date != null and request_end_date != ''">
AND IID.REQUEST_DATE <![CDATA[ <= ]]> #{request_end_date}
</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>
<!-- 제품구분 검색 -->
<if test="search_product_cd != null and search_product_cd != ''">
AND CM.PRODUCT = #{search_product_cd}
</if>
<!-- 검사여부 검색 -->
<if test="search_inspection_yn != null and search_inspection_yn != ''">
<if test="search_inspection_yn == '검사'">
AND IID.INSPECTION_YN_COUNT > 0
</if>
<if test="search_inspection_yn == '스킵'">
AND IID.SKIP_YN_COUNT > 0 AND IID.INSPECTION_YN_COUNT = 0
</if>
</if>
<!-- 요청현황 검색 -->
<if test="search_request_status != null and search_request_status != ''">
<if test="search_request_status == '미요청'">
AND REQ.DELIVERY_TOTAL_COUNT > 0 AND REQ.SELECTED_COUNT = 0
</if>
<if test="search_request_status == '요청중'">
AND REQ.SELECTED_COUNT > 0 AND REQ.SELECTED_COUNT <![CDATA[ < ]]> REQ.DELIVERY_TOTAL_COUNT
</if>
<if test="search_request_status == '요청완료'">
AND REQ.DELIVERY_TOTAL_COUNT > 0 AND REQ.SELECTED_COUNT = REQ.DELIVERY_TOTAL_COUNT
</if>
</if>
<!-- 검사현황 검색 -->
<if test="search_inspection_status != null and search_inspection_status != ''">
<if test="search_inspection_status == '완료'">
AND DEFECT.DEFECT_TOTAL_COUNT > 0 AND DEFECT.DEFECT_TOTAL_COUNT = DEFECT.ACTION_RESULT_COUNT
</if>
<if test="search_inspection_status == '진행중'">
AND DEFECT.ACTION_RESULT_COUNT > 0 AND DEFECT.DEFECT_TOTAL_COUNT != DEFECT.ACTION_RESULT_COUNT
</if>
</if>
ORDER BY POM.REGDATE DESC
</select>
<!-- 수입검사 상세 정보 조회 -->
<select id="getIncomingInspectionInfo" parameterType="map" resultType="map">
SELECT A.OBJID
, A.PURCHASE_ORDER_MASTER_OBJID
, A.INSPECTOR_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.INSPECTOR_ID) AS INSPECTOR_NAME
, TO_CHAR(A.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
, A.INSPECTION_RESULT
, A.INSPECTION_MEMO
, A.WRITER
, TO_CHAR(A.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM QUALITY_INCOMING_INSPECTION A
WHERE A.OBJID = #{OBJID}
</select>
<!-- 수입검사 등록 -->
<insert id="insertIncomingInspection" parameterType="map">
INSERT INTO QUALITY_INCOMING_INSPECTION (
OBJID
, PURCHASE_ORDER_MASTER_OBJID
, INSPECTOR_ID
, INSPECTION_DATE
, INSPECTION_RESULT
, INSPECTION_MEMO
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{PURCHASE_ORDER_MASTER_OBJID}
, #{INSPECTOR_ID}
, TO_DATE(#{INSPECTION_DATE}, 'YYYY-MM-DD')
, #{INSPECTION_RESULT}
, #{INSPECTION_MEMO}
, #{writer}
, SYSDATE
)
</insert>
<!-- 수입검사 수정 -->
<update id="updateIncomingInspection" parameterType="map">
UPDATE QUALITY_INCOMING_INSPECTION
SET INSPECTOR_ID = #{INSPECTOR_ID}
, INSPECTION_DATE = TO_DATE(#{INSPECTION_DATE}, 'YYYY-MM-DD')
, INSPECTION_RESULT = #{INSPECTION_RESULT}
, INSPECTION_MEMO = #{INSPECTION_MEMO}
WHERE OBJID = #{OBJID}
</update>
<!-- 수입검사 목록 조회 (엑셀용) - 상세 정보 포함 -->
<select id="getIncomingInspectionListForExcel" parameterType="map" resultType="map">
SELECT
/* 수입검사 관리 리스트 정보 */
(SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
, POM.PURCHASE_ORDER_NO
, CM.PROJECT_NO
, PM.PART_NO
, PM.PART_NAME
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
, (CASE WHEN 0 <![CDATA[ >= ]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0)) THEN '입고완료'
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[ > ]]> POM.DELIVERY_DATE THEN '지연'
ELSE '입고중'
END) AS DELIVERY_STATUS
/* 검사 등록 상세 정보 (입고내역 + 검사상세) */
, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD') AS DELIVERY_DATE
, IMI.RECEIPT_QTY AS DELIVERY_QTY
, IID.INSPECTION_TYPE
, COALESCE(IID.INSPECTION_YN, '검사') AS INSPECTION_YN
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = IID.DEFECT_TYPE) AS DEFECT_TYPE_NAME
, (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.REMARK
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = IID.INSPECTOR_ID) AS INSPECTOR_NAME
, IID.INSPECTION_DATE
FROM PURCHASE_ORDER_MASTER POM
LEFT OUTER JOIN PROJECT_MGMT CM ON POM.CONTRACT_MGMT_OBJID = CM.OBJID
LEFT OUTER JOIN (
SELECT POP.PURCHASE_ORDER_MASTER_OBJID
, SUM(POP.ORDER_QTY::NUMERIC) AS TOTAL_PO_QTY
, MAX(DH.RECEIPT_DATE) AS CUR_DELIVERY_DATE
, SUM(DH.RECEIPT_QTY::NUMERIC) AS TOTAL_DELIVERY_QTY
FROM PURCHASE_ORDER_PART POP
LEFT OUTER JOIN ARRIVAL_PLAN DH ON POP.OBJID = DH.ORDER_PART_OBJID
GROUP BY POP.PURCHASE_ORDER_MASTER_OBJID
) S1 ON POM.OBJID::VARCHAR = S1.PURCHASE_ORDER_MASTER_OBJID
/* 입고내역과 조인 (검사등록 팝업과 동일한 구조) */
LEFT OUTER JOIN INVENTORY_MGMT_IN IMI ON IMI.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR
LEFT OUTER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
LEFT OUTER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = IM.PART_OBJID
LEFT OUTER JOIN INCOMING_INSPECTION_DETAIL IID ON IID.INVENTORY_IN_OBJID = IMI.OBJID
WHERE 1=1
AND POM.MAIL_SEND_DATE IS NOT NULL
AND (MULTI_MASTER_YN = 'Y' OR NVL(MULTI_MASTER_YN, '') != 'Y' AND NVL(MULTI_YN, '') != 'Y')
/* 입고된 건만 조회 (검사등록된 데이터) */
AND IMI.OBJID IS NOT NULL
<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 CM.PROJECT_NO IN
<foreach item="item" collection="project_nos.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</if>
<if test="search_part_no != null and search_part_no != ''">
AND TRIM(UPPER(PM.PART_NO)) LIKE '%' || TRIM(UPPER(#{search_part_no})) || '%'
</if>
<if test="search_part_name != null and search_part_name != ''">
AND TRIM(UPPER(PM.PART_NAME)) LIKE '%' || TRIM(UPPER(#{search_part_name})) || '%'
</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 AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0))
</if>
<if test="search_delivery_status == '입고중'">
AND 0 <![CDATA[ < ]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART AS O WHERE POM.OBJID::VARCHAR = O.PURCHASE_ORDER_MASTER_OBJID) - COALESCE(S1.TOTAL_DELIVERY_QTY, 0))
</if>
</if>
<if test="inspector_id != null and inspector_id != ''">
AND IID.INSPECTOR_ID = #{inspector_id}
</if>
<if test="inspection_start_date != null and inspection_start_date != ''">
AND IID.INSPECTION_DATE <![CDATA[>=]]> #{inspection_start_date}
</if>
<if test="inspection_end_date != null and inspection_end_date != ''">
AND IID.INSPECTION_DATE <![CDATA[<=]]> #{inspection_end_date}
</if>
<if test="search_inspection_result != null and search_inspection_result != ''">
AND IID.INSPECTION_RESULT = #{search_inspection_result}
</if>
ORDER BY POM.PURCHASE_ORDER_NO DESC, PM.PART_NO
</select>
<!-- =====================================================
공정검사 관리
===================================================== -->
<!-- 공정검사 마스터 목록 조회 -->
<select id="getProcessInspectionList" parameterType="map" resultType="map">
SELECT PIM.OBJID
/* 검사일 (외 N건) - 디테일 테이블에서 집계 */
, (SELECT
CASE WHEN COUNT(DISTINCT PID.INSPECTION_DATE) > 1
THEN MIN(PID.INSPECTION_DATE) || ' 외 ' || (COUNT(DISTINCT PID.INSPECTION_DATE) - 1) || '건'
WHEN COUNT(DISTINCT PID.INSPECTION_DATE) = 1
THEN MIN(PID.INSPECTION_DATE)
ELSE ''
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID AND PID.INSPECTION_DATE IS NOT NULL AND PID.INSPECTION_DATE != ''
) AS INSPECTION_DATE
/* 검사자 (외 N건) - 디테일 테이블에서 집계 */
, (SELECT
CASE WHEN COUNT(DISTINCT PID.INSPECTOR_ID) > 1
THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(PID.INSPECTOR_ID)) || ' 외 ' || (COUNT(DISTINCT PID.INSPECTOR_ID) - 1) || '건'
WHEN COUNT(DISTINCT PID.INSPECTOR_ID) = 1
THEN (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = MIN(PID.INSPECTOR_ID))
ELSE ''
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID AND PID.INSPECTOR_ID IS NOT NULL AND PID.INSPECTOR_ID != ''
) AS INSPECTOR_NAME
/* 제품구분 (외 N건) */
, (SELECT
CASE WHEN COUNT(DISTINCT PID.PROJECT_OBJID) > 1
THEN (SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID)) || ' 외 ' || (COUNT(DISTINCT PID.PROJECT_OBJID) - 1) || '건'
ELSE (SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID))
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS PRODUCT_NAME
/* 프로젝트명 (외 N건) */
, (SELECT
CASE WHEN COUNT(DISTINCT PID.PROJECT_OBJID) > 1
THEN (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID)) || ' 외 ' || (COUNT(DISTINCT PID.PROJECT_OBJID) - 1) || '건'
ELSE (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID))
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS PROJECT_NO
/* 품번 (외 N건) */
, (SELECT
CASE WHEN COUNT(*) > 1
THEN MIN(PID.PART_NO) || ' 외 ' || (COUNT(*) - 1) || '건'
ELSE MIN(PID.PART_NO)
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS PART_NO
/* 품명 (외 N건) */
, (SELECT
CASE WHEN COUNT(*) > 1
THEN MIN(PID.PART_NAME) || ' 외 ' || (COUNT(*) - 1) || '건'
ELSE MIN(PID.PART_NAME)
END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS PART_NAME
/* 검사수량 합계 */
, (SELECT COALESCE(SUM(PID.INSPECTION_QTY), 0) FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) AS INSPECTION_QTY
/* 불량수량 합계 */
, (SELECT COALESCE(SUM(PID.DEFECT_QTY), 0) FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) AS DEFECT_QTY
/* 작업환경상태 (하나라도 불량이면 불량) */
, (SELECT CASE WHEN COUNT(CASE WHEN PID.WORK_ENV_STATUS = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS WORK_ENV_STATUS
/* 측정기 (하나라도 불량이면 불량) */
, (SELECT CASE WHEN COUNT(CASE WHEN PID.MEASURING_DEVICE = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) AS MEASURING_DEVICE
/* 검사결과 (하나라도 NG면 NG) */
, (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
) AS INSPECTION_RESULT
, PIM.REMARK
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO F WHERE F.TARGET_OBJID = PIM.OBJID AND F.DOC_TYPE = 'PROCESS_INSPECTION_FILE' AND UPPER(F.STATUS) = 'ACTIVE') AS PROCESS_INSPECTION_FILE_CNT
FROM PROCESS_INSPECTION_MASTER PIM
WHERE 1=1
/* 프로젝트번호 */
<if test="search_project_no != null and search_project_no != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.PROJECT_OBJID = #{search_project_no})
</if>
/* 제품구분 */
<if test="productType != null and productType != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
JOIN PROJECT_MGMT PM ON PM.OBJID = PID.PROJECT_OBJID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PM.PRODUCT = #{productType})
</if>
/* 품번 (OBJID 또는 품번 텍스트로 검색) */
<if test="search_part_objid != null and search_part_objid != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND (PID.PART_OBJID = #{search_part_objid} OR UPPER(PID.PART_NO) LIKE '%' || UPPER(#{search_part_objid}) || '%'))
</if>
/* 품명 (LIKE 검색) */
<if test="search_part_name != null and search_part_name != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND UPPER(PID.PART_NAME) LIKE '%' || UPPER(#{search_part_name}) || '%')
</if>
/* 작업환경상태 (화면 표시 로직과 동일하게: 하나라도 불량이면 불량) */
<if test="search_work_env_status != null and search_work_env_status != ''">
AND (SELECT CASE WHEN COUNT(CASE WHEN PID.WORK_ENV_STATUS = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
) = CASE WHEN #{search_work_env_status} = 'OK' THEN '양호' ELSE '불량' END
</if>
/* 측정기 */
<if test="search_measuring_device != null and search_measuring_device != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.MEASURING_DEVICE = CASE WHEN #{search_measuring_device} = 'OK' THEN '양호' ELSE '불량' END)
</if>
/* 검사자 */
<if test="search_inspector != null and search_inspector != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.INSPECTOR_ID = #{search_inspector})
</if>
/* 검사일 (시작) */
<if test="search_inspection_date_from != null and search_inspection_date_from != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.INSPECTION_DATE <![CDATA[>=]]> #{search_inspection_date_from})
</if>
/* 검사일 (종료) */
<if test="search_inspection_date_to != null and search_inspection_date_to != ''">
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = PIM.OBJID
AND PID.INSPECTION_DATE <![CDATA[<=]]> #{search_inspection_date_to})
</if>
/* 검사결과 */
<if test="search_inspection_result != null and search_inspection_result != ''">
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>
<!-- 공정검사 마스터 상세 조회 -->
<select id="getProcessInspectionInfo" parameterType="map" resultType="map">
SELECT PIM.OBJID
, PIM.INSPECTION_DATE
, PIM.INSPECTOR_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID) AS INSPECTOR_NAME
, PIM.REMARK
, PIM.WRITER
, TO_CHAR(PIM.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM PROCESS_INSPECTION_MASTER PIM
WHERE PIM.OBJID = #{OBJID}
</select>
<!-- 공정검사 디테일 그리드 목록 조회 -->
<select id="getProcessInspectionDetailList" parameterType="map" resultType="map">
SELECT PID.OBJID
, PID.MASTER_OBJID
, PID.PROCESS_CD
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PID.PROCESS_CD) AS PROCESS_NAME
, PID.PROJECT_OBJID
, (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = PID.PROJECT_OBJID) AS PROJECT_NO
, (SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT WHERE OBJID = PID.PROJECT_OBJID) AS PRODUCT_NAME
, PID.PART_OBJID
, PID.PART_NO
, PID.PART_NAME
, PID.INSPECTION_QTY
, PID.DEFECT_QTY
, PID.WORK_ENV_STATUS
, PID.MEASURING_DEVICE
, PID.DEPT_CD
, (SELECT DEPT_NAME FROM DEPT_INFO WHERE OBJID::VARCHAR = PID.DEPT_CD) AS DEPT_NAME
, PID.USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PID.USER_ID) AS USER_NAME
, PID.INSPECTION_DATE
, PID.INSPECTOR_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PID.INSPECTOR_ID) AS INSPECTOR_NAME
, PID.REMARK
, PID.ACTION_STATUS
, PID.INSPECTION_RESULT
/* 이미지파일 카운트 */
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO F WHERE F.TARGET_OBJID = PID.OBJID AND F.DOC_TYPE = 'PROCESS_INSPECTION_IMAGE' AND UPPER(F.STATUS) = 'ACTIVE') AS IMAGE_FILE_CNT
/* 첨부파일 카운트 */
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO F WHERE F.TARGET_OBJID = PID.OBJID AND F.DOC_TYPE = 'PROCESS_INSPECTION_FILE' AND UPPER(F.STATUS) = 'ACTIVE') AS ATTACH_FILE_CNT
FROM PROCESS_INSPECTION_DETAIL PID
WHERE PID.MASTER_OBJID = #{MASTER_OBJID}
ORDER BY PID.REG_DATE
</select>
<!-- 공정검사 마스터 저장 -->
<insert id="insertProcessInspectionMaster" parameterType="map">
INSERT INTO PROCESS_INSPECTION_MASTER (
OBJID
, INSPECTION_DATE
, INSPECTOR_ID
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{INSPECTION_DATE}
, #{INSPECTOR_ID}
, #{REMARK}
, #{WRITER}
, NOW()
)
</insert>
<!-- 공정검사 마스터 수정 -->
<update id="updateProcessInspectionMaster" parameterType="map">
UPDATE PROCESS_INSPECTION_MASTER SET
INSPECTION_DATE = #{INSPECTION_DATE}
, INSPECTOR_ID = #{INSPECTOR_ID}
, REMARK = #{REMARK}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- 공정검사 디테일 저장 (UPSERT) -->
<update id="saveProcessInspectionDetail" parameterType="map">
INSERT INTO PROCESS_INSPECTION_DETAIL (
OBJID
, MASTER_OBJID
, PROCESS_CD
, PROJECT_OBJID
, PART_OBJID
, PART_NO
, PART_NAME
, INSPECTION_QTY
, DEFECT_QTY
, WORK_ENV_STATUS
, MEASURING_DEVICE
, DEPT_CD
, USER_ID
, INSPECTION_DATE
, INSPECTOR_ID
, REMARK
, ACTION_STATUS
, INSPECTION_RESULT
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{MASTER_OBJID}
, #{PROCESS_CD}
, #{PROJECT_OBJID}
, #{PART_OBJID}
, #{PART_NO}
, #{PART_NAME}
, NULLIF(#{INSPECTION_QTY}, '')::NUMERIC
, NULLIF(#{DEFECT_QTY}, '')::NUMERIC
, #{WORK_ENV_STATUS}
, #{MEASURING_DEVICE}
, #{DEPT_CD}
, #{USER_ID}
, #{INSPECTION_DATE}
, #{INSPECTOR_ID}
, #{REMARK}
, #{ACTION_STATUS}
, #{INSPECTION_RESULT}
, #{WRITER}
, NOW()
)
ON CONFLICT (OBJID) DO UPDATE SET
PROCESS_CD = #{PROCESS_CD}
, PROJECT_OBJID = #{PROJECT_OBJID}
, PART_OBJID = #{PART_OBJID}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, INSPECTION_QTY = NULLIF(#{INSPECTION_QTY}, '')::NUMERIC
, DEFECT_QTY = NULLIF(#{DEFECT_QTY}, '')::NUMERIC
, WORK_ENV_STATUS = #{WORK_ENV_STATUS}
, MEASURING_DEVICE = #{MEASURING_DEVICE}
, DEPT_CD = #{DEPT_CD}
, USER_ID = #{USER_ID}
, INSPECTION_DATE = #{INSPECTION_DATE}
, INSPECTOR_ID = #{INSPECTOR_ID}
, REMARK = #{REMARK}
, ACTION_STATUS = #{ACTION_STATUS}
, INSPECTION_RESULT = #{INSPECTION_RESULT}
, MOD_DATE = NOW()
</update>
<!-- 공정검사 디테일 삭제 (마스터 기준) -->
<delete id="deleteProcessInspectionDetailByMaster" parameterType="map">
DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID}
</delete>
<!-- 공정검사 목록 조회 (엑셀용) - 상세 정보 포함 (디테일 기준) -->
<select id="getProcessInspectionListForExcel" parameterType="map" resultType="map">
SELECT
/* 검사일, 검사자는 디테일에서 가져옴 */
COALESCE(PID.INSPECTION_DATE, '') AS INSPECTION_DATE
, COALESCE((SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = PID.INSPECTOR_ID), '') AS INSPECTOR_NAME
, COALESCE((SELECT CODE_NAME(PM.PRODUCT) FROM PROJECT_MGMT PM WHERE PM.OBJID = PID.PROJECT_OBJID), '') AS PRODUCT_TYPE
/* 공정검사 디테일 정보 */
, COALESCE((SELECT CC.CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PID.PROCESS_CD), '') AS PROCESS_NAME
, COALESCE((SELECT PM.PROJECT_NO FROM PROJECT_MGMT PM WHERE PM.OBJID = PID.PROJECT_OBJID), '') AS PROJECT_NO
, COALESCE(PID.PART_NO, '') AS PART_NO
, COALESCE(PID.PART_NAME, '') AS PART_NAME
, COALESCE(PID.INSPECTION_QTY, 0) AS INSPECTION_QTY
, COALESCE(PID.DEFECT_QTY, 0) AS DEFECT_QTY
, CASE WHEN COALESCE(PID.INSPECTION_QTY, 0) > 0
THEN ROUND((COALESCE(PID.DEFECT_QTY, 0)::NUMERIC / PID.INSPECTION_QTY::NUMERIC) * 100, 2)
ELSE 0 END AS DEFECT_RATE
, COALESCE(PID.WORK_ENV_STATUS, '') AS WORK_ENV_STATUS
, COALESCE(PID.MEASURING_DEVICE, '') AS MEASURING_DEVICE
, COALESCE((SELECT DI.DEPT_NAME FROM DEPT_INFO DI WHERE DI.DEPT_CODE = PID.DEPT_CD), '') AS DEPT_NAME
, COALESCE((SELECT U2.USER_NAME FROM USER_INFO U2 WHERE U2.USER_ID = PID.USER_ID), '') AS USER_NAME
, COALESCE(PID.REMARK, '') AS DETAIL_REMARK
, COALESCE(PID.ACTION_STATUS, '') AS ACTION_STATUS
, COALESCE(NULLIF(PID.INSPECTION_RESULT, ''),
(SELECT CASE WHEN COUNT(CASE WHEN PID2.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
FROM PROCESS_INSPECTION_DETAIL PID2 WHERE PID2.MASTER_OBJID = PIM.OBJID), '') AS INSPECTION_RESULT
FROM PROCESS_INSPECTION_MASTER PIM
INNER JOIN PROCESS_INSPECTION_DETAIL PID ON PID.MASTER_OBJID = PIM.OBJID
WHERE 1=1
<if test="search_project_no != null and search_project_no != ''">
AND (SELECT PM2.PROJECT_NO FROM PROJECT_MGMT PM2 WHERE PM2.OBJID = PID.PROJECT_OBJID) LIKE '%' || #{search_project_no} || '%'
</if>
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(PID.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(PID.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<if test="search_inspector != null and search_inspector != ''">
AND (
UPPER(PID.INSPECTOR_ID) LIKE UPPER('%' || #{search_inspector} || '%')
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PID.INSPECTOR_ID)) LIKE UPPER('%' || #{search_inspector} || '%')
)
</if>
<if test="search_inspection_date_from != null and search_inspection_date_from != ''">
AND PID.INSPECTION_DATE <![CDATA[>=]]> #{search_inspection_date_from}
</if>
<if test="search_inspection_date_to != null and search_inspection_date_to != ''">
AND PID.INSPECTION_DATE <![CDATA[<=]]> #{search_inspection_date_to}
</if>
<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>
<!-- =====================================================
반제품검사 관리
===================================================== -->
<!-- 반제품검사 목록 조회 (영업관리 방식: 작업지시번호 기준 그룹화, 나머지는 "외 N건") -->
<select id="getSemiProductInspectionList" parameterType="map" resultType="map">
SELECT T.INSPECTION_GROUP_ID
, MIN(T.OBJID) AS OBJID
<!-- 작업지시번호: 여러 개면 "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.WORK_ORDER_NO AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND T2.WORK_ORDER_NO IS NOT NULL AND T2.WORK_ORDER_NO != '') sub
) AS WORK_ORDER_NO
<!-- 품명(모델명): 여러 개면 "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.MODEL_NAME AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
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.PART_NO AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND T2.PART_NO IS NOT NULL AND T2.PART_NO != '') sub
) AS PART_NO
<!-- 부품명: 여러 개면 "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.PART_NAME AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND T2.PART_NAME IS NOT NULL AND T2.PART_NAME != '') sub
) AS PART_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 COALESCE(TO_CHAR(T2.INSPECTION_DATE, 'YYYY-MM-DD'), TO_CHAR(T2.REG_DATE, 'YYYY-MM-DD')) AS val
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND (T2.INSPECTION_DATE IS NOT NULL OR T2.REG_DATE IS NOT NULL)) sub
) AS INSPECTION_DATE
<!-- 검사자: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
, (SELECT CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MAX(val)
ELSE MAX(val) || ' 외 ' || (COUNT(*) - 1) || '건'
END
FROM (SELECT DISTINCT COALESCE((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T2.INSPECTOR),
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T2.WRITER)) AS val
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
AND (T2.INSPECTOR IS NOT NULL OR T2.WRITER IS NOT NULL)) sub
WHERE val IS NOT NULL AND val != ''
) AS WRITER_NAME
<!-- 수량 집계 (입고수량은 양품 데이터에서만 합산) -->
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) AS RECEIPT_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) AS GOOD_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) AS DEFECTIVE_QTY
, CASE
WHEN SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END) > 0
THEN ROUND(SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' THEN T.DEFECT_QTY ELSE 0 END) * 100.0 / SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.RECEIPT_QTY ELSE 0 END), 2)
ELSE 0
END AS DEFECT_RATE
, SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS REGENERATION_QTY
, SUM(CASE WHEN T.DATA_TYPE = 'GOOD' THEN T.GOOD_QTY ELSE 0 END) + SUM(CASE WHEN T.DATA_TYPE = 'DEFECT' AND T.DISPOSITION_TYPE = '수정' THEN T.DEFECT_QTY ELSE 0 END) AS FINAL_GOOD_QTY
FROM (
SELECT SPI.OBJID
, COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME
, 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
, COALESCE(SPI.DEFECT_QTY, 0) AS DEFECT_QTY
, SPI.DISPOSITION_TYPE
, SPI.DATA_TYPE
, 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.INSPECTION_GROUP_ID, SPI.OBJID) AS INSPECTION_GROUP_ID
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE 1=1
<!-- 품명(모델명) 검색 -->
<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>
<!-- 부품품번 검색 (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>
<!-- 검사자 검색 -->
<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
</select>
<!-- 반제품검사 엑셀 다운로드용 데이터 조회 (전체 풀어서 개별 행으로) -->
<select id="getSemiProductInspectionListForExcel" parameterType="map" resultType="map">
SELECT SPI.OBJID
, 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
, COALESCE(SPI.DEFECT_QTY, 0) AS DEFECT_QTY
, CASE
WHEN COALESCE(SPI.RECEIPT_QTY, 0) > 0
THEN ROUND(COALESCE(SPI.DEFECT_QTY, 0) * 100.0 / SPI.RECEIPT_QTY, 2)
ELSE 0
END AS DEFECT_RATE
, CASE WHEN SPI.DISPOSITION_TYPE = '수정' THEN COALESCE(SPI.DEFECT_QTY, 0) ELSE 0 END AS REGENERATION_QTY
, COALESCE(SPI.GOOD_QTY, 0) + CASE WHEN SPI.DISPOSITION_TYPE = '수정' THEN COALESCE(SPI.DEFECT_QTY, 0) ELSE 0 END AS FINAL_GOOD_QTY
, COALESCE(SPI.DEFECT_TYPE, '') AS DEFECT_TYPE
, COALESCE(SPI.DEFECT_CAUSE, '') AS DEFECT_CAUSE
, COALESCE(SPI.RESPONSIBLE_DEPT, '') AS RESPONSIBLE_DEPT
, COALESCE(SPI.PROCESS_STATUS, '') AS PROCESS_STATUS
, COALESCE(SPI.DISPOSITION_TYPE, '') AS DISPOSITION_TYPE
, COALESCE(SPI.REMARK, '') AS REMARK
, COALESCE(SPI.DATA_TYPE, '') AS DATA_TYPE
, COALESCE(SPI.INSPECTION_GROUP_ID::VARCHAR, '') AS INSPECTION_GROUP_ID
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE 1=1
<!-- 품명(모델명) 검색 -->
<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="search_inspection_date != null and search_inspection_date != ''">
AND TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD') = #{search_inspection_date}
</if>
<!-- 검사자 검색 -->
<if test="search_writer != null and search_writer != ''">
AND SPI.WRITER = #{search_writer}
</if>
ORDER BY SPI.INSPECTION_DATE DESC, SPI.REG_DATE DESC
</select>
<!-- 반제품검사 품명(모델명) 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductModelNameList" parameterType="map" resultType="map">
SELECT DISTINCT MODEL_NAME AS CODE
, MODEL_NAME AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE MODEL_NAME IS NOT NULL AND MODEL_NAME != ''
ORDER BY CODE
</select>
<!-- 반제품검사 부품품번 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductPartNoList" parameterType="map" resultType="map">
SELECT DISTINCT PART_NO AS CODE
, PART_NO AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE PART_NO IS NOT NULL AND PART_NO != ''
ORDER BY CODE
</select>
<!-- 반제품검사 부품명 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductPartNameList" parameterType="map" resultType="map">
SELECT DISTINCT PART_NAME AS CODE
, PART_NAME AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE PART_NAME IS NOT NULL AND PART_NAME != ''
ORDER BY CODE
</select>
<!-- 반제품검사 검사일 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductInspectionDateList" parameterType="map" resultType="map">
SELECT DISTINCT TO_CHAR(REG_DATE, 'YYYY-MM-DD') AS CODE
, TO_CHAR(REG_DATE, 'YYYY-MM-DD') AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE REG_DATE IS NOT NULL
ORDER BY CODE DESC
</select>
<!-- 반제품검사 검사자 드롭박스 목록 (CODE, NAME 형태) -->
<select id="getSemiProductWriterList" parameterType="map" resultType="map">
SELECT DISTINCT SPI.WRITER AS CODE
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPI.WRITER) AS NAME
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE SPI.WRITER IS NOT NULL AND SPI.WRITER != ''
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
, SPI.PROJECT_NO
, SPI.WORK_ORDER_NO
, SPI.PART_NO
, SPI.PART_NAME
, SPI.RECEIPT_QTY
, SPI.DISPOSITION_TYPE
, SPI.REMARK
, SPI.WRITER
, TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
, SPI.INSPECTION_GROUP_ID
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
WHERE SPI.OBJID = #{OBJID}
</select>
<!-- 반제품검사 상세 조회 (타입별) -->
<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"
, COALESCE(SPI.PART_NO, '') AS "PART_NO"
, COALESCE(SPI.PART_NAME, '') AS "PART_NAME"
, COALESCE(PM.OBJID::VARCHAR, '') AS "PART_OBJID"
, COALESCE(SPI.RECEIPT_QTY, 0) AS "RECEIPT_QTY"
, COALESCE(SPI.GOOD_QTY, 0) AS "GOOD_QTY"
, COALESCE(SPI.DEFECT_QTY, 0) AS "DEFECT_QTY"
, COALESCE(SPI.DEFECT_TYPE, '') AS "DEFECT_TYPE"
, COALESCE(SPI.DEFECT_CAUSE, '') AS "DEFECT_CAUSE"
, COALESCE(SPI.RESPONSIBLE_DEPT, '') AS "RESPONSIBLE_DEPT"
, COALESCE(SPI.PROCESS_STATUS, '') AS "PROCESS_STATUS"
, COALESCE(TO_CHAR(SPI.INSPECTION_DATE, 'YYYY-MM-DD'), '') AS "INSPECTION_DATE"
, COALESCE(SPI.INSPECTOR, '') AS "INSPECTOR"
, COALESCE(SPI.DISPOSITION_TYPE, '') AS "DISPOSITION_TYPE"
, COALESCE(SPI.REMARK, '') AS "REMARK"
, SPI.DATA_TYPE AS "DATA_TYPE"
, COALESCE(SPI.INSPECTION_GROUP_ID, '') AS "INSPECTION_GROUP_ID"
, COALESCE(SPI.IS_LOCKED, 'N') AS "IS_LOCKED"
<!-- 파일 카운트 조회 -->
, (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
LEFT JOIN PART_MNG PM ON PM.PART_NO = SPI.PART_NO
WHERE 1=1
<if test="INSPECTION_GROUP_ID != null and INSPECTION_GROUP_ID != ''">
AND (SPI.INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID} OR SPI.OBJID = #{INSPECTION_GROUP_ID})
</if>
<if test="WORK_ORDER_NO != null and WORK_ORDER_NO != ''">
AND SPI.WORK_ORDER_NO = #{WORK_ORDER_NO}
</if>
<if test="OBJID != null and OBJID != ''">
AND SPI.OBJID = #{OBJID}
</if>
<if test="DATA_TYPE != null and DATA_TYPE != ''">
AND SPI.DATA_TYPE = #{DATA_TYPE}
</if>
ORDER BY SPI.REG_DATE
</select>
<!-- 반제품검사 저장 (INSERT) -->
<insert id="saveSemiProductInspection" parameterType="map">
INSERT INTO PMS_QUALITY_SEMI_PRODUCT_INSPECTION (
OBJID
, PROJECT_NO
, WORK_ORDER_NO
, PART_NO
, PART_NAME
, RECEIPT_QTY
, DISPOSITION_TYPE
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{PROJECT_NO}
, #{WORK_ORDER_NO}
, #{PART_NO}
, #{PART_NAME}
, #{RECEIPT_QTY}::NUMERIC
, #{DISPOSITION_TYPE}
, #{REMARK}
, #{WRITER}
, NOW()
)
</insert>
<!-- 반제품검사 수정 (UPDATE) -->
<update id="updateSemiProductInspection" parameterType="map">
UPDATE PMS_QUALITY_SEMI_PRODUCT_INSPECTION
SET PROJECT_NO = #{PROJECT_NO}
, WORK_ORDER_NO = #{WORK_ORDER_NO}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, RECEIPT_QTY = #{RECEIPT_QTY}::NUMERIC
, DISPOSITION_TYPE = #{DISPOSITION_TYPE}
, REMARK = #{REMARK}
, WRITER = #{WRITER}
, REG_DATE = NOW()
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 (
OBJID
, MODEL_NAME
, PRODUCT_TYPE
, WORK_ORDER_NO
, PART_NO
, PART_NAME
, RECEIPT_QTY
, GOOD_QTY
, DEFECT_QTY
, DEFECT_TYPE
, DEFECT_CAUSE
, RESPONSIBLE_DEPT
, PROCESS_STATUS
, INSPECTION_DATE
, INSPECTOR
, DISPOSITION_TYPE
, REMARK
, WRITER
, REG_DATE
, DATA_TYPE
, INSPECTION_GROUP_ID
, IS_LOCKED
) VALUES (
#{OBJID}
, #{MODEL_NAME}
, #{PRODUCT_TYPE}
, #{WORK_ORDER_NO}
, #{PART_NO}
, #{PART_NAME}
, COALESCE(NULLIF(#{RECEIPT_QTY}, '')::NUMERIC, 0)
, COALESCE(NULLIF(#{GOOD_QTY}, '')::NUMERIC, 0)
, COALESCE(NULLIF(#{DEFECT_QTY}, '')::NUMERIC, 0)
, #{DEFECT_TYPE}
, #{DEFECT_CAUSE}
, #{RESPONSIBLE_DEPT}
, #{PROCESS_STATUS}
, CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
, #{INSPECTOR}
, #{DISPOSITION_TYPE}
, #{REMARK}
, #{WRITER}
, NOW()
, #{DATA_TYPE}
, #{INSPECTION_GROUP_ID}
, COALESCE(#{IS_LOCKED}, 'N')
)
</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}
, IS_LOCKED = CASE WHEN IS_LOCKED = 'Y' THEN 'Y' ELSE COALESCE(#{IS_LOCKED}, 'N') END
WHERE OBJID = #{OBJID}
</update>
<!-- 반제품검사 행 잠금 (IS_LOCKED = 'Y') -->
<update id="lockSemiProductInspection" parameterType="map">
UPDATE PMS_QUALITY_SEMI_PRODUCT_INSPECTION
SET IS_LOCKED = 'Y'
WHERE OBJID = #{OBJID}
</update>
<!-- 반제품검사 행 잠금 해제 (IS_LOCKED = 'N') -->
<update id="unlockSemiProductInspection" parameterType="map">
UPDATE PMS_QUALITY_SEMI_PRODUCT_INSPECTION
SET IS_LOCKED = 'N'
WHERE OBJID = #{OBJID}
</update>
<!-- 반제품검사 데이터 삭제 (OBJID로 단건 삭제) -->
<delete id="deleteSemiProductInspectionByObjId" parameterType="map">
DELETE FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE OBJID = #{OBJID}
</delete>
<!-- 반제품검사 데이터 삭제 (특정 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>
<!-- 반제품검사 데이터 삭제 (타입별, 특정 OBJID 제외) -->
<delete id="deleteSemiProductInspectionByType" parameterType="map">
DELETE FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION
WHERE INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID}
AND DATA_TYPE = #{DATA_TYPE}
<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 관리
===================================================== -->
<!-- 고객 CS 목록 조회 -->
<select id="getCustomerCsList" parameterType="map" resultType="map">
SELECT CCS.OBJID
, CCS.RECEIPT_NO
, CCS.RECEIPT_DATE
, CCS.QTY
, CCS.CUSTOMER_OBJID
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
, CCS.MODEL_NAME AS PRODUCT_TYPE
, CODE_NAME(CCS.MODEL_NAME) AS PRODUCT_TYPE_NAME
, CCS.PRODUCT_NAME
, CCS.PART_NO
, CCS.PRODUCT_NO
, CCS.PART_NAME
, CCS.PRODUCTION_DATE
, CCS.SALES_DATE
, CCS.SERIAL_NO
, CCS.MANUFACTURER
, CCS.COMPLAINT_CONTENT
, CCS.ACTION_TYPE
, CODE_NAME(CCS.ACTION_TYPE) AS ACTION_TYPE_NAME
, CCS.ACTION_CONTENT
, CCS.BLAME_DECISION
, CASE CCS.BLAME_DECISION WHEN 'R' THEN 'RPS' WHEN 'C' THEN '고객사' WHEN 'O' THEN '외주업체' WHEN 'E' THEN '단순문의' ELSE CCS.BLAME_DECISION END AS BLAME_DECISION_NAME
, 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
FROM CUSTOMER_CS CCS
WHERE 1=1
<if test="search_receipt_date_from != null and search_receipt_date_from != ''">
AND CCS.RECEIPT_DATE <![CDATA[>=]]> #{search_receipt_date_from}
</if>
<if test="search_receipt_date_to != null and search_receipt_date_to != ''">
AND CCS.RECEIPT_DATE <![CDATA[<=]]> #{search_receipt_date_to}
</if>
<if test="search_customer_objid != null and search_customer_objid != ''">
AND CCS.CUSTOMER_OBJID = #{search_customer_objid}
</if>
<if test="search_product_type != null and search_product_type != ''">
AND CCS.MODEL_NAME = #{search_product_type}
</if>
<if test="search_product_no != null and search_product_no != ''">
AND UPPER(CCS.PRODUCT_NO) LIKE UPPER('%' || #{search_product_no} || '%')
</if>
<if test="search_product_name != null and search_product_name != ''">
AND UPPER(CCS.PRODUCT_NAME) LIKE UPPER('%' || #{search_product_name} || '%')
</if>
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(CCS.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(CCS.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<if test="search_serial_no != null and search_serial_no != ''">
AND UPPER(CCS.SERIAL_NO) LIKE UPPER('%' || #{search_serial_no} || '%')
</if>
<if test="search_manufacturer != null and search_manufacturer != ''">
AND UPPER(CCS.MANUFACTURER) LIKE UPPER('%' || #{search_manufacturer} || '%')
</if>
<if test="search_blame_decision != null and search_blame_decision != ''">
AND CCS.BLAME_DECISION = #{search_blame_decision}
</if>
<if test="search_status != null and search_status != ''">
AND CCS.STATUS = #{search_status}
</if>
<if test="search_action_date_from != null and search_action_date_from != ''">
AND CCS.ACTION_DATE <![CDATA[>=]]> #{search_action_date_from}
</if>
<if test="search_action_date_to != null and search_action_date_to != ''">
AND CCS.ACTION_DATE <![CDATA[<=]]> #{search_action_date_to}
</if>
<if test="search_action_user != null and search_action_user != ''">
AND (
UPPER(CCS.ACTION_USER_ID) LIKE UPPER('%' || #{search_action_user} || '%')
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID)) LIKE UPPER('%' || #{search_action_user} || '%')
)
</if>
ORDER BY CCS.RECEIPT_DATE DESC, CCS.REG_DATE DESC
</select>
<!-- 고객 CS 상세 조회 -->
<select id="getCustomerCsInfo" parameterType="map" resultType="map">
SELECT CCS.OBJID
, CCS.RECEIPT_NO
, CCS.RECEIPT_DATE
, CCS.QTY
, CCS.CUSTOMER_OBJID
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = CCS.CUSTOMER_OBJID) AS CUSTOMER_NAME
, CCS.MODEL_NAME AS PRODUCT_TYPE
, CODE_NAME(CCS.MODEL_NAME) AS PRODUCT_TYPE_NAME
, CCS.PRODUCT_NAME
, CCS.PART_NO
, CCS.PRODUCT_NO
, CCS.PART_NAME
, CCS.PRODUCTION_DATE
, CCS.SALES_DATE
, CCS.SERIAL_NO
, CCS.MANUFACTURER
, CCS.COMPLAINT_CONTENT
, CCS.ACTION_TYPE
, 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
, CCS.STATUS
, CCS.REMARK
, CCS.ACTION_DATE
, CCS.ACTION_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.ACTION_USER_ID) AS ACTION_USER_NAME
, CCS.ATTACH_FILE_OBJID
, CCS.WRITER
, USER_NAME(CCS.WRITER) AS WRITER_NAME
, CCS.RECEIPT_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = CCS.RECEIPT_USER_ID) AS RECEIPT_USER_NAME
, TO_CHAR(CCS.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
FROM CUSTOMER_CS CCS
WHERE CCS.OBJID = #{OBJID}
</select>
<!-- 고객 CS 날짜별 순번 조회 (해당 날짜의 다음 순번 반환) -->
<select id="getCustomerCsSeqByDate" parameterType="map" resultType="int">
SELECT COALESCE(MAX(
CAST(SPLIT_PART(RECEIPT_NO, '-', 3) AS INTEGER)
), 0) + 1
FROM CUSTOMER_CS
WHERE RECEIPT_NO LIKE 'CS-' || #{TARGET_DATE} || '-%'
</select>
<!-- 고객 CS 등록 -->
<insert id="insertCustomerCs" parameterType="map">
INSERT INTO CUSTOMER_CS (
OBJID
, RECEIPT_NO
, RECEIPT_DATE
, QTY
, CUSTOMER_OBJID
, MODEL_NAME
, PRODUCT_NO
, PRODUCT_NAME
, PART_NO
, PART_NAME
, PRODUCTION_DATE
, SALES_DATE
, SERIAL_NO
, MANUFACTURER
, COMPLAINT_CONTENT
, BLAME_DECISION
, STATUS
, REMARK
, WRITER
, RECEIPT_USER_ID
, REG_DATE
) VALUES (
#{OBJID}
, #{RECEIPT_NO}
, #{RECEIPT_DATE}
, NULLIF(#{QTY}, '')::NUMERIC
, #{CUSTOMER_OBJID}
, #{MODEL_NAME}
, #{PRODUCT_NO}
, #{PRODUCT_NAME}
, #{PART_NO}
, #{PART_NAME}
, #{PRODUCTION_DATE}
, #{SALES_DATE}
, #{SERIAL_NO}
, #{MANUFACTURER}
, #{COMPLAINT_CONTENT}
, #{BLAME_DECISION}
, #{STATUS}
, #{REMARK}
, #{WRITER}
, #{RECEIPT_USER_ID}
, NOW()
)
</insert>
<!-- 고객 CS 수정 -->
<update id="updateCustomerCs" parameterType="map">
UPDATE CUSTOMER_CS SET
RECEIPT_DATE = #{RECEIPT_DATE}
, QTY = NULLIF(#{QTY}, '')::NUMERIC
, CUSTOMER_OBJID = #{CUSTOMER_OBJID}
, MODEL_NAME = #{MODEL_NAME}
, PRODUCT_NO = #{PRODUCT_NO}
, PRODUCT_NAME = #{PRODUCT_NAME}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, PRODUCTION_DATE = #{PRODUCTION_DATE}
, SALES_DATE = #{SALES_DATE}
, SERIAL_NO = #{SERIAL_NO}
, MANUFACTURER = #{MANUFACTURER}
, COMPLAINT_CONTENT = #{COMPLAINT_CONTENT}
, RECEIPT_USER_ID = #{RECEIPT_USER_ID}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- 고객 CS 조치결과 수정 -->
<update id="updateCustomerCsAction" parameterType="map">
UPDATE CUSTOMER_CS SET
ACTION_CONTENT = #{ACTION_CONTENT}
, BLAME_DECISION = #{BLAME_DECISION}
, ACTION_DATE = #{ACTION_DATE}
, ACTION_USER_ID = #{ACTION_USER_ID}
, STATUS = #{STATUS}
, REMARK = #{REMARK}
, MOD_DATE = NOW()
, ACTION_TYPE = #{ACTION_TYPE}
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 관리
===================================================== -->
<!-- ECR 목록 조회 -->
<select id="getEcrList" parameterType="map" resultType="map">
SELECT ECR.OBJID
, ECR.ECR_NO
, ECR.REQUEST_DATE
, ECR.REQUESTER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.REQUESTER_ID) AS REQUESTER_NAME
, ECR.PART_NO
, ECR.PART_NAME
, ECR.ISSUE_CONTENT
, ECR.DUE_DATE
, ECR.ACTION_DEPT
, (SELECT DEPT_NAME FROM DEPT_INFO WHERE DEPT_CODE = ECR.ACTION_DEPT) AS ACTION_DEPT_NAME
, ECR.ACTION_MANAGER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_MANAGER_ID) AS ACTION_MANAGER_NAME
, ECR.ACTION_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_USER_ID) AS ACTION_USER_NAME
, ECR.ACTION_CONTENT
, ECR.COMPLETE_DATE
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE
, (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
FROM PMS_QUALITY_ECR ECR
WHERE 1=1
<if test="search_request_date_from != null and search_request_date_from != ''">
AND ECR.REQUEST_DATE >= #{search_request_date_from}
</if>
<if test="search_request_date_to != null and search_request_date_to != ''">
AND ECR.REQUEST_DATE <![CDATA[<=]]> #{search_request_date_to}
</if>
<if test="search_requester != null and search_requester != ''">
AND (
UPPER(ECR.REQUESTER_ID) LIKE UPPER('%' || #{search_requester} || '%')
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.REQUESTER_ID)) LIKE UPPER('%' || #{search_requester} || '%')
)
</if>
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(ECR.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
</if>
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(ECR.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
</if>
<if test="search_due_date_from != null and search_due_date_from != ''">
AND ECR.DUE_DATE >= #{search_due_date_from}
</if>
<if test="search_due_date_to != null and search_due_date_to != ''">
AND ECR.DUE_DATE <![CDATA[<=]]> #{search_due_date_to}
</if>
<if test="search_action_dept != null and search_action_dept != ''">
AND UPPER(ECR.ACTION_DEPT) LIKE UPPER('%' || #{search_action_dept} || '%')
</if>
<if test="search_action_manager != null and search_action_manager != ''">
AND (
UPPER(ECR.ACTION_MANAGER_ID) LIKE UPPER('%' || #{search_action_manager} || '%')
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_MANAGER_ID)) LIKE UPPER('%' || #{search_action_manager} || '%')
)
</if>
<if test="search_action_user != null and search_action_user != ''">
AND (
UPPER(ECR.ACTION_USER_ID) LIKE UPPER('%' || #{search_action_user} || '%')
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_USER_ID)) LIKE UPPER('%' || #{search_action_user} || '%')
)
</if>
<if test="search_complete_date_from != null and search_complete_date_from != ''">
AND ECR.COMPLETE_DATE >= #{search_complete_date_from}
</if>
<if test="search_complete_date_to != null and search_complete_date_to != ''">
AND ECR.COMPLETE_DATE <![CDATA[<=]]> #{search_complete_date_to}
</if>
ORDER BY ECR.REQUEST_DATE DESC, ECR.REG_DATE DESC
</select>
<!-- ECR 상세 조회 -->
<select id="getEcrInfo" parameterType="map" resultType="map">
SELECT ECR.OBJID
, ECR.ECR_NO
, ECR.REQUEST_DATE
, ECR.REQUESTER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.REQUESTER_ID) AS REQUESTER_NAME
, ECR.PART_OBJID
, ECR.PART_NO
, ECR.PART_NAME
, ECR.ISSUE_CONTENT
, ECR.DUE_DATE
, ECR.ACTION_DEPT
, (SELECT DEPT_NAME FROM DEPT_INFO WHERE DEPT_CODE = ECR.ACTION_DEPT) AS ACTION_DEPT_NAME
, ECR.ACTION_MANAGER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_MANAGER_ID) AS ACTION_MANAGER_NAME
, ECR.ACTION_USER_ID
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = ECR.ACTION_USER_ID) AS ACTION_USER_NAME
, ECR.ACTION_CONTENT
, ECR.COMPLETE_DATE
, ECR.ATTACH_FILE_OBJID
, ECR.REMARK
, ECR.WRITER
, TO_CHAR(ECR.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
, ECR.ECR_DOC_SUMMARY
, ECR.ECR_DOC_REASON
, ECR.ECR_REV_NO
, ECR.ECR_REV_DATE
, ECR.ECR_DOC_FORM_NO
, ECR.ECR_DOC_AUTHOR
FROM PMS_QUALITY_ECR ECR
WHERE ECR.OBJID = #{OBJID}
</select>
<!-- ECR 시퀀스 조회 (ECR_NO 생성용: ECR-YYYYMM-순번) -->
<select id="getEcrSeq" resultType="int">
SELECT COALESCE(MAX(CAST(SUBSTRING(ECR_NO FROM 'ECR-[0-9]{6}-([0-9]+)') AS INTEGER)), 0) + 1
FROM PMS_QUALITY_ECR
WHERE ECR_NO LIKE 'ECR-' || #{YYYYMM} || '-%'
</select>
<!-- ECR 등록 -->
<insert id="insertEcr" parameterType="map">
INSERT INTO PMS_QUALITY_ECR (
OBJID
, ECR_NO
, REQUEST_DATE
, REQUESTER_ID
, PART_OBJID
, PART_NO
, PART_NAME
, ISSUE_CONTENT
, DUE_DATE
, ACTION_DEPT
, ACTION_MANAGER_ID
, ATTACH_FILE_OBJID
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{OBJID}
, #{ECR_NO}
, #{REQUEST_DATE}
, #{REQUESTER_ID}
, #{PART_OBJID}
, #{PART_NO}
, #{PART_NAME}
, #{ISSUE_CONTENT}
, #{DUE_DATE}
, #{ACTION_DEPT}
, #{ACTION_MANAGER_ID}
, #{ATTACH_FILE_OBJID}
, #{REMARK}
, #{WRITER}
, NOW()
)
</insert>
<!-- ECR 수정 -->
<update id="updateEcr" parameterType="map">
UPDATE PMS_QUALITY_ECR SET
REQUEST_DATE = #{REQUEST_DATE}
, REQUESTER_ID = #{REQUESTER_ID}
, PART_OBJID = #{PART_OBJID}
, PART_NO = #{PART_NO}
, PART_NAME = #{PART_NAME}
, ISSUE_CONTENT = #{ISSUE_CONTENT}
, DUE_DATE = #{DUE_DATE}
, ACTION_DEPT = #{ACTION_DEPT}
, ACTION_MANAGER_ID = #{ACTION_MANAGER_ID}
, REMARK = #{REMARK}
, MODIFIER = #{WRITER}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- ECR 결과 저장 -->
<update id="updateEcrResult" parameterType="map">
UPDATE PMS_QUALITY_ECR SET
ACTION_USER_ID = #{ACTION_USER_ID}
, ACTION_CONTENT = #{ACTION_CONTENT}
, COMPLETE_DATE = #{COMPLETE_DATE}
, MODIFIER = #{MODIFIER}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- 설계변경요청서 저장 -->
<update id="updateEcrDoc" parameterType="map">
UPDATE PMS_QUALITY_ECR SET
ECR_DOC_FORM_NO = #{ECR_DOC_FORM_NO}
, ECR_REV_NO = #{ECR_REV_NO}
, ECR_REV_DATE = #{ECR_REV_DATE}
, ECR_DOC_AUTHOR = #{ECR_DOC_AUTHOR}
, ECR_DOC_SUMMARY = #{ECR_DOC_SUMMARY}
, ECR_DOC_REASON = #{ECR_DOC_REASON}
, MODIFIER = #{MODIFIER}
, MOD_DATE = NOW()
WHERE OBJID = #{OBJID}
</update>
<!-- =====================================================
수입검사 상세 그리드 목록 (입고 결과 기준)
===================================================== -->
<!-- 수입검사 상세 그리드 목록 조회 (INVENTORY_MGMT_IN 기반) -->
<select id="getIncomingInspectionDetailList" 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
, 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
, (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
/* 불량수량 합계 (INCOMING_INSPECTION_DETAIL.DEFECT_QTY에 저장된 값 사용) */
, COALESCE(NULLIF(IID.DEFECT_QTY, '')::NUMERIC, 0) AS DEFECT_QTY_SUM
/* 불량율 (불량수량합계 / 입고수량 * 100) */
, CASE WHEN IMI.RECEIPT_QTY::NUMERIC > 0
THEN ROUND(COALESCE(NULLIF(IID.DEFECT_QTY, '')::NUMERIC, 0) / IMI.RECEIPT_QTY::NUMERIC * 100, 2)
ELSE NULL END AS LEFT_DEFECT_RATE
/* 검사성적서 파일 수 */
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = IID.OBJID AND AFI.DOC_TYPE = 'INSPECTION_REPORT' AND UPPER(AFI.STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
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
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>
<!-- 수입검사 상세 정보 조회 (발주서 기준 첫번째 검사 정보) -->
<select id="getIncomingInspectionDetailInfo" parameterType="map" resultType="map">
SELECT IID.INSPECTION_DATE
, IID.INSPECTOR_ID
FROM INCOMING_INSPECTION_DETAIL IID
WHERE IID.PURCHASE_ORDER_MASTER_OBJID = #{OBJID}
ORDER BY IID.REG_DATE DESC
LIMIT 1
</select>
<!-- 수입검사 상세 저장 (UPSERT) -->
<update id="saveIncomingInspectionDetail" parameterType="map">
INSERT INTO INCOMING_INSPECTION_DETAIL (
OBJID
, INVENTORY_IN_OBJID
, PURCHASE_ORDER_MASTER_OBJID
, REQUEST_DATE
, REQUEST_USER_ID
, INSPECTION_DATE
, INSPECTOR_ID
, INSPECTION_TYPE
, INSPECTION_YN
, DEFECT_TYPE
, DEFECT_REASON
, ACTION_STATUS
, INSPECTION_QTY
, DEFECT_QTY
, INSPECTION_RESULT
, ATTACH_FILE_OBJID
, REMARK
, WRITER
, REG_DATE
) VALUES (
#{NEW_OBJID}
, #{OBJID}
, #{PURCHASE_ORDER_MASTER_OBJID}
, #{REQUEST_DATE}
, #{REQUEST_USER_ID}
, #{INSPECTION_DATE}
, #{INSPECTOR_ID}
, #{INSPECTION_TYPE}
, #{INSPECTION_YN}
, #{DEFECT_TYPE}
, #{DEFECT_REASON}
, #{ACTION_STATUS}
, #{INSPECTION_QTY}
, #{DEFECT_QTY}
, #{INSPECTION_RESULT}
, #{ATTACH_FILE_OBJID}
, #{REMARK}
, #{WRITER}
, NOW()
)
ON CONFLICT (INVENTORY_IN_OBJID) DO UPDATE SET
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>