Files
wace_plm/WebContent/WEB-INF/classes/com/pms/mapper/part.xml
chpark da06c4684c Initial commit: WACE PLM with database initialization features
- Add Docker Compose configurations for dev, prod, and standalone environments
- Add database initialization scripts (init-db.sh, init-db-docker.sh)
- Add enhanced start-docker-linux.sh with DB init support
- Add comprehensive database initialization guide
- Support for automatic dbexport.pgsql import on first run
- Include safety checks for production environment
2025-08-29 15:46:08 +09:00

3399 lines
113 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="part">
<!-- PART 관리 목록 조회 -->
<select id="partMgmtList" parameterType="map" resultType="map">
SELECT * FROM
(
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT distinct t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE
)
SELECT
t1.part_mgmt_objid
,t1.part_mgmt_parent_objid
,t1.project_mgmt_objid
,t1.part_name
,t1.part_no
,t1.parent_part_no
,t1.spec_cd
,t1.mfa_cd
,t1.qty
,t1.process_cd
,t1.sort_cd
,t1.sup_cd
,t1.rev
,t1.is_last
,to_char(t1.rel_date,'yyyy-mm-dd') as rel_date
,to_char(t1.reg_date,'yyyy-mm-dd') as reg_date
,t1.reg_user_id
,(select user_name from user_info as o1 where o1.user_id = t1.reg_user_id) AS reg_user_name
,t1.change_cd
,t1.status
,t1.del_yn
,t1.rel_status
,t1.sized
,t1.material
,(select o.code_name from comm_code o where o.code_id = t1.sort_cd) AS sort_name
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T1.part_mgmt_objid AND DOC_TYPE='PART_FILE' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT
,t1.lev
,row_number() over (order by path,lev,part_no) as rnum
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
<if test="search_isLast != null and search_isLast != '' and 1 == search_isLast">
and t1.is_last = '1'
</if>
<if test=" part_no != null and part_no != '' ">
AND UPPER(t1.PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test="part_name !=null and part_name !=''">
AND UPPER(t1.PART_NAME) LIKE UPPER('%${part_name}%')
</if>
<if test="spec_cd !=null and spec_cd !=''">
AND UPPER(t1.SPEC_CD) LIKE UPPER('%${spec_cd}%')
</if>
<if test="process_cd !=null and process_cd !=''">
AND t1.PROCESS_CD LIKE '%${process_cd}%'
</if>
<if test="sort_cd !=null and sort_cd !=''">
AND t1.SORT_CD = #{sort_cd}
</if>
<if test="supply_cd !=null and supply_cd !=''">
AND t1.SUP_CD LIKE '%${supply_cd}%'
</if>
<if test="material !=null and material !=''">
AND t1.MATERIAL LIKE '%${material}%'
</if>
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_DATE(t1.REL_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_DATE(t1.REL_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
order by path,lev,part_no
) AS TT
WHERE 1=1
<if test="PAGE_END != null and PAGE_END != ''">
<![CDATA[ AND TT.RNUM <= #{PAGE_END}::integer ]]>
</if>
<if test="PAGE_START != null and PAGE_START != ''">
<![CDATA[ AND TT.RNUM >= #{PAGE_START}::integer ]]>
</if>
</select>
<select id="materpartMgmtList" parameterType="map" resultType="map">
SELECT * FROM (SELECT T.*,LEVEL AS PART_LEVEL ,
ROWNUM AS RNUM FROM (SELECT T.*
FROM
(SELECT DISTINCT PMS_PART_MGMT.*
FROM
(
SELECT DISTINCT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,QTY
,PROCESS_CD
,CODE_NAME(PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,REG_DATE
,REG_USER_ID
,IS_LAST
,REL_STATUS
FROM PART_MGMT T
WHERE 1=1
AND T.DEL_YN='N'
AND T.STATUS='complete'
AND IS_LAST = 1
AND PROJECT_MGMT_OBJID = #{projectno}
) PMS_PART_MGMT
WHERE 1=1
) T )T
WHERE 1=1
AND PROJECT_MGMT_OBJID = #{projectno}
AND SORT_CD = #{sort_cd}
<if test="sup_cd != null and sup_cd != '' ">
AND SUP_CD = #{sup_cd}
</if>
<if test="part_no != null and part_no != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test="process1_cd != null and process1_cd != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${process_cd}%')
</if>
<if test="part_stcd != null and part_stcd != '' ">
AND REL_STATUS = #{part_stcd}
</if>
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_CHAR(TO_DATE(REL_DATE,'YYYY-MM-DD')) <![CDATA[ >= ]]> TO_CHAR(TO_DATE(#{search_fromDate}, 'YYYY-MM-DD'))
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_CHAR(TO_DATE(REL_DATE,'YYYY-MM-DD')) <![CDATA[ <= ]]> TO_CHAR(TO_DATE(#{search_toDate}, 'YYYY-MM-DD'))
</if>
START WITH PART_NO = PARENT_PART_NO CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO
ORDER SIBLINGS BY PART_NO,PART_NAME )
</select>
<select id="searchSupMgmt" parameterType="map" resultType="map">
SELECT *
FROM
(
SELECT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,TRIM(PART_NAME) AS PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,QTY
,PROCESS_CD
,CODE_NAME(PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,REG_DATE
,REG_USER_ID
,LEVEL AS PART_LEVEL
FROM PART_MGMT T
WHERE 1=1
AND T.DEL_YN='N'
AND T.STATUS='complete'
AND T.IS_LAST = 1
AND T.PROJECT_MGMT_OBJID = #{projectno}
<if test=" part_no != null and part_no != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test=" process1_cd != null and process1_cd != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${process_cd}%')
</if>
START WITH T.PART_NO = T.PARENT_PART_NO
CONNECT BY NOCYCLE PRIOR T.PART_NO = T.PARENT_PART_NO
ORDER SIBLINGS BY PARENT_PART_NO,REL_DATE DESC
) T ,MATERIAL_COMPANY_MGMT T1
WHERE T.PART_MGMT_OBJID = T1.PART_MGMT_OBJID
<if test=" sup_cd != null and sup_cd != '' ">
AND T1.SUP_CD = #{sup_cd}
</if>
</select>
<select id="materpartSupMgmtList" parameterType="map" resultType="map">
SELECT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,TRIM(PART_NAME) AS PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,QTY
,PROCESS_CD
,CODE_NAME(PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,REG_DATE
,REG_USER_ID
FROM PART_MGMT T
WHERE T.SORT_CD IS NOT NULL
AND T.DEL_YN='N'
AND T.STATUS='complete'
AND T.IS_LAST = 1
AND T.PROJECT_MGMT_OBJID = #{projectno}
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_CHAR(TO_DATE(REL_DATE,'YYYY-MM-DD')) <![CDATA[ >= ]]> TO_CHAR(TO_DATE(#{search_fromDate}, 'YYYY-MM-DD'))
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_CHAR(TO_DATE(REL_DATE,'YYYY-MM-DD')) <![CDATA[ <= ]]> TO_CHAR(TO_DATE(#{search_toDate}, 'YYYY-MM-DD'))
</if>
<if test=" part_no != null and part_no != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test=" sup_gubun != null and sup_gubun != '' ">
AND T.SUP_CD IS NULL
</if>
<if test=" sup_cd != null and sup_cd != '' ">
AND T.SUP_CD = #{sup_cd}
</if>
<if test=" process1_cd != null and process1_cd != '' ">
AND UPPER(PART_NO) LIKE UPPER('%${process_cd}%')
</if>
<if test="sort_cd !=null and sort_cd !=''">
AND SORT_CD = #{sort_cd}
</if>
ORDER BY PART_NO
</select>
<!-- PART 관리 목록 조회 -->
<select id="partMgmtTempList" parameterType="map" resultType="map">
<!-- SELECT *
FROM
(SELECT PMS_PART_MGMT.*
FROM
(
-->
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE
)
SELECT
t1.part_mgmt_objid
,t1.part_mgmt_parent_objid
,t1.project_mgmt_objid
,t1.part_name
,t1.part_no
,t1.parent_part_no
,t1.spec_cd
,t1.mfa_cd
,t1.qty
,(SELECT O.CODE_NAME FROM COMM_CODE O WHERE O.CODE_ID = t1.process_cd) AS process_name
,t1.process_cd
,t1.sort_cd
,(SELECT O.CODE_NAME FROM COMM_CODE O WHERE O.CODE_ID = t1.sort_cd) AS sort_name
,t1.sup_cd
,(select supply_name from supply_mng o where o.supply_code = t1.sup_cd) as sup_name
,t1.rev
,t1.is_last
,t1.rel_date
,to_char(t1.rel_date,'yyyy-mm-dd') as rel_date_title
,to_char(t1.reg_date,'yyyy-mm-dd') as reg_date
,(SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = t1.reg_user_id) WRITER_TITLE
,t1.reg_user_id
,t1.change_cd
,t1.status
,t1.del_yn
,t1.rel_status
,t1.sized
,t1.material
,t1.lev
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='write'
<if test=" projectno != null and projectno != '' ">
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
</if>
AND t1.REG_USER_ID = #{CONNECTUSERID}
<if test=" part_no != null and part_no != '' ">
AND UPPER(t1.PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test="part_name !=null and part_name !=''">
AND UPPER(t1.PART_NAME) LIKE UPPER('%${part_name}%')
</if>
<if test="spec_cd !=null and spec_cd !=''">
AND UPPER(t1.SPEC_CD) LIKE UPPER('%${spec_cd}%')
</if>
<if test="process_cd !=null and process_cd !=''">
AND t1.PROCESS_CD LIKE '%${process_cd}%'
</if>
<if test="material !=null and material !=''">
AND t1.MATERIAL LIKE '%${material}%'
</if>
<if test="sort_cd !=null and sort_cd !=''">
AND t1.SORT_CD = #{sort_cd}
</if>
<if test="supply_cd !=null and supply_cd !=''">
AND t1.SUP_CD LIKE '%${supply_cd}%'
</if>
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_DATE(t1.REQ_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_DATE(t1.REQ_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
order by path,lev,part_no
<!-- ) PMS_PART_MGMT
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_START != ''">
<![CDATA[ AND RNUM >= #{PAGE_START} ]]>
</if> -->
</select>
<!-- PART 관리 목록 조회 -->
<select id="partMgmtTempFormList" parameterType="map" resultType="map">
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE -- NOCYCLE 지정
)
SELECT
t1.part_mgmt_objid
,t1.part_mgmt_parent_objid
,t1.project_mgmt_objid
,t1.part_name
,t1.part_no
,t1.parent_part_no
,t1.spec_cd
,t1.mfa_cd
,t1.qty
,t1.process_cd
,t1.sort_cd
,code_name(t1.sort_cd) as sort_name
,t1.sup_cd
,t1.rev
,to_char(t1.rel_date,'yyyy-mm-dd') as rel_date
,t1.reg_date
,t1.reg_user_id
,t1.sized
,t1.material
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='write'
AND (t1.rev='' or t1.rev is null)
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
order by path,lev,part_no
</select>
<select id="partMgmtListCnt" parameterType="map" resultType="map">
SELECT CEIL(CAST(TOTAL_CNT AS FLOAT)/#{COUNT_PER_PAGE})::numeric::integer as MAX_PAGE_SIZE
,TOTAL_CNT::integer
FROM (
SELECT COUNT(1)::float AS TOTAL_CNT
FROM(
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT distinct t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE -- NOCYCLE 지정
)
SELECT *
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='complete'
<if test=" projectno != null and projectno != '' ">
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
</if>
<if test="search_isLast != null and search_isLast != '' and 1 == search_isLast">
and t1.is_last = '1'
</if>
<if test=" part_no != null and part_no != '' ">
AND UPPER(t1.PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test="part_name !=null and part_name !=''">
AND UPPER(t1.PART_NAME) LIKE UPPER('%${part_name}%')
</if>
<if test="spec_cd !=null and spec_cd !=''">
AND UPPER(t1.SPEC_CD) LIKE UPPER('%${spec_cd}%')
</if>
<if test="process_cd !=null and process_cd !=''">
AND t1.PROCESS_CD LIKE '%${process_cd}%'
</if>
<if test="sort_cd !=null and sort_cd !=''">
AND t1.SORT_CD = #{sort_cd}
</if>
<if test="supply_cd !=null and supply_cd !=''">
AND t1.SUP_CD LIKE '%${supply_cd}%'
</if>
<if test="material !=null and material !=''">
AND t1.MATERIAL LIKE '%${material}%'
</if>
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_DATE(t1.REL_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_DATE(t1.REL_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
) AS TT
) AS TTT
</select>
<select id="partMgmtTempListCnt" parameterType="map" resultType="map">
SELECT CEIL(TOTAL_CNT/#{COUNT_PER_PAGE})::numeric::integer MAX_PAGE_SIZE,
TOTAL_CNT::integer
FROM (
SELECT COUNT(1)::float TOTAL_CNT
FROM(
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,size
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE -- NOCYCLE 지정
)
SELECT *
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='write'
<if test=" projectno != null and projectno != '' ">
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
</if>
AND t1.REG_USER_ID = #{CONNECTUSERID}
<if test=" part_no != null and part_no != '' ">
AND UPPER(t1.PART_NO) LIKE UPPER('%${part_no}%')
</if>
<if test="part_name !=null and part_name !=''">
AND UPPER(t1.PART_NAME) LIKE UPPER('%${part_name}%')
</if>
<if test="spec_cd !=null and spec_cd !=''">
AND UPPER(t1.SPEC_CD) LIKE UPPER('%${spec_cd}%')
</if>
<if test="process_cd !=null and process_cd !=''">
AND t1.PROCESS_CD LIKE '%${process_cd}%'
</if>
<if test="sort_cd !=null and sort_cd !=''">
AND t1.SORT_CD = #{sort_cd}
</if>
<if test="supply_cd !=null and supply_cd !=''">
AND t1.SUP_CD LIKE '%${supply_cd}%'
</if>
<if test="material !=null and material !=''">
AND t1.MATERIAL LIKE '%${material}%'
</if>
<if test="search_fromDate != null and !''.equals(search_fromDate)">
AND TO_DATE(t1.REQ_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and !''.equals(search_toDate)">
AND TO_DATE(t1.REQ_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
order by path,lev,part_no
) T
) T
</select>
<!-- //part 상세조회 -->
<select id="getpartMgmtInfo" parameterType="map" resultType="map">
SELECT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,(SELECT PROJECT_NO FROM ORDER_MGMT O1 WHERE O1.ORDER_MGMT_OBJID = T.PROJECT_MGMT_OBJID) AS PROJECT_NO
,(SELECT O.ORDER_TITLE FROM ORDER_MGMT O WHERE O.ORDER_MGMT_OBJID = T.PROJECT_MGMT_OBJID) AS PROJECT_TITLE
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,MFA_CD
,QTY
,PROCESS_CD
,SORT_CD
,SUP_CD
,REV
,IS_LAST
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,TO_CHAR(REG_DATE,'YYYY-MM-DD') AS REG_DATE
,REG_USER_ID
,CHANGE_CD
,SIZED
,MATERIAL
FROM PART_MGMT T
WHERE T.PART_MGMT_OBJID=#{objid}::integer
</select>
<!-- //part 상세조회 -->
<select id="getpartRev" parameterType="map" resultType="map">
SELECT
coalesce(T.REV,'0') AS REV
FROM PART_MGMT T
WHERE T.PART_MGMT_OBJID=#{targetObjId}::integer
</select>
<!-- //차종, 제품, 사양을 통해 BOM 구조등록 ObjId 조회 -->
<select id="getBOMStructureStandardObjId" parameterType="map" resultType="string">
SELECT OBJID
FROM PART_BOM_REPORT A
WHERE 1=1
<!-- AND OEM_OBJID = ${search_oemObjId} -->
AND CAR_OBJID = ${search_carObjId}
AND PRODUCT_OBJID = ${search_productObjId}
<!-- AND REGION_OBJID = ${search_regionObjId} -->
</select>
<!-- //bomObjId를 통해 BOM 구조등록 기본정보 조회 -->
<select id="getBOMStructureStandardInfoByObjId" parameterType="string" resultType="map">
SELECT OBJID
, CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID::numeric) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID::numeric) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID::numeric) AS CAR_MODEL_CODE
, OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = A.OEM_OBJID::numeric) AS OEM_NAME
, (SELECT OEM_CODE FROM OEM_MNG WHERE OBJID = A.OEM_OBJID::numeric) AS OEM_CODE
, PRODUCT_OBJID
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = A.PRODUCT_OBJID::text) AS PRODUCT_NAME
<!-- , (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID) AS PRODUCT_NAME -->
, REGION_OBJID
<!-- , (SELECT REGION_NAME FROM REGION_MNG WHERE OBJID = A.REGION_OBJID) AS REGION_NAME -->
, '' AS REGION_NAME
, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE
, REGDATE AS REGDATE_ORG
FROM PART_BOM_REPORT A
WHERE 1=1
AND OBJID = #{bomObjId}::numeric
</select>
<!-- //BOM 구조등록 기본정보 등록 -->
<insert id="createBOMReportStructureStandardInfo" parameterType="map">
INSERT INTO PART_BOM_REPORT (
OBJID
, OEM_OBJID
, CAR_OBJID
, PRODUCT_OBJID
, REGION_OBJID
, WRITER
, REGDATE
) VALUES (
${bomObjId}
, ${oemObjId}
, ${carObjId}
, ${productObjId}
, 0
, #{writer}
, NOW()
)
</insert>
<!-- 파트정보를 merge 한다. -->
<!-- <update id="mergePartInfo" parameterType="map">
MERGE INTO PART_INFO T USING DUAL ON ( T.OBJID = #{objid})
WHEN MATCHED THEN
UPDATE
SET
T.OEM_OBJID = #{oem},
T.CAR_OBJID = #{car},
T.PRODUCT_GROUP_OBJID = #{productFamily},
T.PRODUCT_OBJID = #{product},
T.PART_NO = #{partNo},
T.RH_PART_OBJID = #{rhPartObjId},
T.PART_NAME = #{partName},
T.DRAWING_RELEASE_TYPE = #{drawReleaseType},
T.PART_TYPE = #{partType},
T.REV = UPPER(#{revision}),
T.MATERIAL_TYPE_OBJID = #{materialType},
T.DRAWING_TYPE = #{drawType},
T.DRAWING_NO_OBJID = #{drawingNoObjId},
T.MATERIAL_OBJID = #{material},
T.PART_OPTION = #{optionSpec},
T.THICKNESS = #{thickness},
T.WEIGHT = #{weight},
T.APPLY_POINT_OBJID = #{applyPointType},
T.MNG_ITEM_TYPE = #{mngType},
T.IS_LAST = #{isLast},
T.STATUS = #{status},
T.CAVITY = #{cavity},
T.REMARKS = #{remarks},
T.MOLD_CLASSIFICATION = #{mod_c},
T.COMPANY_MOLD = #{com_m},
T.COMPANY_SUP_MATERIAL = #{com_sm},
T.COMPANY_PLATING_PAINTING = #{com_pp},
T.COMPANY_ELEMENT = #{com_em},
T.SPRUE = #{sprue},
T.EO_NO = #{ecoNo},
T.EO_ISSUE_DATE = #{ecoDate},
T.RH_PART_NO = #{erpno},
T.PLATED = #{plated},
T.STAMP = #{stamp}
WHEN NOT MATCHED THEN
INSERT(
OBJID,
OEM_OBJID,
CAR_OBJID,
PRODUCT_GROUP_OBJID,
PRODUCT_OBJID,
PART_NO,
RH_PART_OBJID,
PART_NAME,
DRAWING_RELEASE_TYPE,
PART_TYPE,
REV,
MATERIAL_TYPE_OBJID,
DRAWING_TYPE,
DRAWING_NO_OBJID,
MATERIAL_OBJID,
PART_OPTION,
THICKNESS,
WEIGHT,
APPLY_POINT_OBJID,
MNG_ITEM_TYPE,
IS_LAST,
WRITER,
REGDATE,
STATUS,
CAVITY,
REMARKS,
MOLD_CLASSIFICATION,
COMPANY_MOLD,
COMPANY_SUP_MATERIAL,
COMPANY_PLATING_PAINTING,
COMPANY_ELEMENT,
SPRUE,
EO_NO,
EO_ISSUE_DATE,
RH_PART_NO,
PLATED,
STAMP
)
VALUES
(
#{objid},
#{oem},
#{car},
#{productFamily},
#{product},
#{partNo},
#{rhPartObjId},
#{partName},
#{drawReleaseType},
#{partType},
UPPER(#{revision}),
#{materialType},
#{drawType},
#{drawingNoObjId},
#{material},
#{optionSpec},
#{thickness},
#{weight},
#{applyPointType},
#{mngType},
#{isLast},
#{writer},
SYSDATE,
#{status},
#{cavity},
#{remarks},
#{mod_c},
#{com_m},
#{com_sm},
#{com_pp},
#{com_em},
#{sprue},
#{ecoNo},
#{ecoDate},
#{erpno},
#{plated},
#{stamp}
)
</update> -->
<!-- Excel Import 파트정보를 merge 한다. -->
<update id="mergeImportPartInfo" parameterType="map">
MERGE INTO PART_INFO T USING DUAL ON ( T.PART_NO = #{partNo} AND T.REV = #{revision} AND T.STATUS = #{status})
WHEN MATCHED THEN
UPDATE
SET
T.OEM_OBJID = #{oem},
T.CAR_OBJID = #{car},
T.PRODUCT_GROUP_OBJID = #{productFamily},
T.PRODUCT_OBJID = #{product},
T.RH_PART_OBJID = #{rhPartObjId},
T.PART_NAME = #{partName},
T.DRAWING_RELEASE_TYPE = #{drawReleaseType},
T.PART_TYPE = #{partType},
T.MATERIAL_TYPE_OBJID = #{materialType},
T.DRAWING_TYPE = #{drawType},
T.DRAWING_NO_OBJID = #{drawingNoObjId},
T.MATERIAL_OBJID = #{material},
T.PART_OPTION = #{optionSpec},
T.THICKNESS = #{thickness},
T.WEIGHT = #{weight},
T.APPLY_POINT_OBJID = #{applyPointType},
T.MNG_ITEM_TYPE = #{mngType},
T.IS_LAST = #{isLast}
WHEN NOT MATCHED THEN
INSERT(
OBJID,
OEM_OBJID,
CAR_OBJID,
PRODUCT_GROUP_OBJID,
PRODUCT_OBJID,
PART_NO,
RH_PART_OBJID,
PART_NAME,
DRAWING_RELEASE_TYPE,
PART_TYPE,
REV,
MATERIAL_TYPE_OBJID,
DRAWING_TYPE,
DRAWING_NO_OBJID,
MATERIAL_OBJID,
PART_OPTION,
THICKNESS,
WEIGHT,
APPLY_POINT_OBJID,
MNG_ITEM_TYPE,
IS_LAST,
WRITER,
REGDATE,
STATUS
)
VALUES
(
#{objid},
#{oem},
#{car},
#{productFamily},
#{product},
#{partNo},
#{rhPartObjId},
#{partName},
#{drawReleaseType},
#{partType},
UPPER(#{revision}),
#{materialType},
#{drawType},
#{drawingNoObjId},
#{material},
#{optionSpec},
#{thickness},
#{weight},
#{applyPointType},
#{mngType},
#{isLast},
#{writer},
SYSDATE,
#{status}
)
</update>
<update id="mergeRevisionPartInfo" parameterType="map">
MERGE INTO PART_INFO T USING DUAL ON ( T.OBJID = #{objid})
WHEN MATCHED THEN
UPDATE
SET
T.REV = UPPER(#{revision}),
T.RH_PART_OBJID = #{rhPartObjId},
T.DRAWING_NO_OBJID = #{drawingNoObjId},
T.IS_LAST = #{isLast},
T.STATUS = #{status}
WHEN NOT MATCHED THEN
INSERT(
OBJID,
REV,
IS_LAST,
WRITER,
REGDATE,
RH_PART_OBJID,
DRAWING_NO_OBJID,
STATUS
)
VALUES
(
#{objid},
UPPER(#{revision}),
#{isLast},
#{writer},
SYSDATE,
#{rhPartObjId},
#{drawingNoObjId},
#{status}
)
</update>
<!-- part정보를 삭제한다. -->
<delete id="deletePart" parameterType="map">
DELETE PART_INFO WHERE OBJID = #{objid}
</delete>
<!-- 작성중 part정보 프로젝트 번호로 모두 삭제를 -->
<delete id="deleteAlltempData" parameterType="map">
DELETE FROM PART_MGMT
WHERE PROJECT_MGMT_OBJID = #{PROJECT_MGMT_OBJID}::integer
AND DEL_YN='N'
AND STATUS='write'
AND REV IS NULL
</delete>
<!-- PART 정보 연결된 하위 삭제 업데이트 -->
<update id="updatedeletePartInfo" parameterType="map">
UPDATE PART_MGMT
SET DEL_YN = 'Y'
WHERE PART_MGMT_OBJID IN(
SELECT O.PART_MGMT_OBJID FROM PART_MGMT O
START WITH O.PART_MGMT_OBJID=#{objId}
CONNECT BY NOCYCLE PRIOR O.PART_NO = O.PARENT_PART_NO)
</update>
<!-- PART 정보 업데이트 -->
<update id="updatePartTempInfo" parameterType="map">
UPDATE PART_MGMT
SET reg_date = now()
,part_name = #{part_name}
,spec_cd =#{spec_cd}
,qty =#{qty}
,process_cd =#{process_cd}
,sort_cd =#{sort_cd}
,sup_cd =#{supply_cd}
,mfa_cd =#{mfa_cd}
,change_cd =#{change_cd}
,sized =#{sized}
,material =#{material}
WHERE PART_MGMT_OBJID = #{objId}::integer
</update>
<!-- PART 복제 -->
<insert id="insertPartCopy" parameterType="map">
INSERT INTO PART_MGMT (
select DISTINCT
PART_MGMT_OBJID+1
,PART_MGMT_PARENT_OBJID
,#{copyprojectno}
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,MFA_CD
,QTY
,PROCESS_CD
,SORT_CD
,SUP_CD
,REV
,IS_LAST
,REL_DATE
,REG_DATE
,REG_USER_ID
,CHANGE_CD
,STATUS
,DEL_YN
,
CASE WHEN SORT_CD IS NOT NULL
THEN 'PRTS00100'
ELSE ''
END AS REL_STATUS
,PRICE
,SUP_PRICE
FROM PART_MGMT T
WHERE T.PROJECT_MGMT_OBJID=#{projectno}
START WITH PART_NO = PARENT_PART_NO CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO )
</insert>
<!-- PART 도면 복제 -->
<insert id="insertPartCopyFile" parameterType="map">
INSERT INTO ATTACH_FILE_INFO (
select
T1.OBJID+1
,T1.TARGET_OBJID+1
,T1.SAVED_FILE_NAME
,T1.REAL_FILE_NAME
,T1.DOC_TYPE
,T1.DOC_TYPE_NAME
,T1.FILE_SIZE
,T1.FILE_EXT
,T1.FILE_PATH
,T1.WRITER
,T1.REGDATE
,T1.STATUS
FROM PART_MGMT T , ATTACH_FILE_INFO T1
WHERE T.PROJECT_MGMT_OBJID=#{projectno}
AND T.PART_MGMT_OBJID = T1.TARGET_OBJID)
</insert>
<!-- 해당파트의 상태 및 최종여부 정보를 변경한다.. -->
<update id="changePartStatus" parameterType="map">
<!-- UPDATE PART_MGMT SET STATUS = 'complete', IS_LAST = #{isLast} ,REV = #{REV} ,REL_DATE = SYSDATE
WHERE PART_MGMT_OBJID IN(SELECT T.PART_MGMT_OBJID FROM PART_MGMT T
WHERE T.STATUS='write'
START WITH PART_MGMT_OBJID = #{targetObjId}
CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO) -->
UPDATE PART_MGMT SET STATUS = 'complete', IS_LAST = #{isLast} ,REV = #{REV} ,REL_DATE = now()
WHERE PART_MGMT_OBJID = #{targetObjId}::integer
</update>
<!-- 해당파트의 상태 및 최종여부 단건 배포. -->
<update id="changeOnePartStatus" parameterType="map">
UPDATE PART_MGMT
SET STATUS = 'complete'
,IS_LAST = '1'
,REL_DATE = now()
,PART_NAME = #{part_name}
,SPEC_CD =#{spec_cd}
,QTY = #{qty}
,PROCESS_CD =#{process_cd}
,SORT_CD =#{sort_cd}
,SUP_CD=#{supply_cd}
,CHANGE_CD = #{change_cd}
,MFA_CD = #{mfa_cd}
WHERE PART_MGMT_OBJID = #{objId}::integer
</update>
<!-- 파트 확정 시 동일 품번의 is_last를 0으로 변경한다. -->
<update id="changeSamePartNoIsLast" parameterType="map">
UPDATE PART_MGMT
SET IS_LAST = '0'
WHERE PART_NO = (SELECT o.PART_NO FROM PART_MGMT AS o WHERE o.PART_MGMT_OBJID = #{targetObjId}::integer)
AND PARENT_PART_NO = (SELECT o.PARENT_PART_NO FROM PART_MGMT AS o WHERE o.PART_MGMT_OBJID = #{targetObjId}::integer)
</update>
<!-- 파트 목록을 가져온다(상태값 필수) -->
<select id="getPartList" parameterType="map" resultType="map">
SELECT ROWNUM RNUM,
T.*
FROM
(SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_NAME,
(SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_NAME,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = PART.PRODUCT_GROUP_OBJID) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = PART.PRODUCT_OBJID) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
PART.RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
DECODE(PART.DRAWING_RELEASE_TYPE,'dev','개발','product','양산') DRAWING_RELEASE_TYPE_TITLE,
PART.PART_TYPE,
PART.EO_OBJID,
PART.EO_NO,
PART.EO_ISSUE_DATE,
TO_CHAR(PART.EO_ISSUE_DATE,'YYYY-MM-DD') EO_ISSUE_DATE_TITLE,
PART.REV,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME FROM MATERIAL_TYPE_MNG WHERE OBJID = PART.MATERIAL_TYPE_OBJID) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
DECODE(PART.DRAWING_TYPE,'draw','D','shownOn','S') AS DRAWING_TYPE_TITLE,
PART.DRAWING_NO_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.DRAWING_NO_OBJID) DRAWING_NO,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME FROM MATERIAL_MNG WHERE OBJID = PART.MATERIAL_OBJID) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME FROM option_spec_mng WHERE OBJID = PART.PART_OPTION) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
(SELECT APPLY_POINT_NAME FROM APPLY_POINT_MNG WHERE OBJID = PART.APPLY_POINT_OBJID) APPLY_POINT_NAME,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_ECD' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS ECD_OBJID,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_MNG_ITEM' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS MNG_ITEM_FILE_OBJID,
(SELECT SAVED_FILE_NAME FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS SAVED_FILE_NAME,
(SELECT REAL_FILE_NAME FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS REAL_FILE_NAME,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE UPPER(DOC_TYPE) = 'PART_CONVERT_2D' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS CONVERT_2D_OBJID,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE UPPER(DOC_TYPE) = 'PART_CONVERT_3D' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS CONVERT_3D_OBJID,
(SELECT REPLACE(FILE_PATH, '\', '\\') FILE_PATH FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS FILE_PATH,
PART.IS_LAST,
PART.WRITER,
PART.CAVITY,
PART.REMARKS,
PART.MOLD_CLASSIFICATION,
PART.COMPANY_MOLD,
PART.COMPANY_SUP_MATERIAL,
PART.COMPANY_PLATING_PAINTING,
PART.COMPANY_ELEMENT,
PART.SPRUE,
PART.STAMP,
PART.PLATED,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','COMPLETE','확정','REVISION','작성중(Revision)') STATUS_STR,
(SELECT WM_CONCAT(CODE_NAME) COMM_NAME FROM part_product_category P, comm_code C WHERE P.COMM_CODE = C.code_id AND P.part_objid = PART.OBJID GROUP BY PART_OBJID) COMM_NAME,
<if test=" actionType != null and actionType != '' and actionType == 'excel'">
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'changeGeometry') CHANGE_GEOMETRY_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'materialThickChange') MATERIAL_THICK_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'cycleChange') CYCLE_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'constructChange') CONSTRUCT_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'weldingSpot') WELDING_SPOT_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'structurGlue') STRUCTUR_GLUE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'first') FIRST_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'etc') ETC_FLAG,
</if>
PART.STATUS
FROM PART_INFO PART
WHERE 1=1
<if test=" isLast != null and isLast != '' ">
AND IS_LAST = #{isLast}
</if>
ORDER BY PART.PART_NO DESC
)T
WHERE 1=1
<if test=" status != null and status != '' ">
<choose>
<when test=" status == 'create' ">
AND UPPER(T.STATUS) IN ('CREATE','REVISION')
</when>
<when test=" status == 'complete' ">
AND UPPER(T.STATUS) IN UPPER(#{status})
</when>
<otherwise>
AND UPPER(T.STATUS) IN ('CREATE','REVISION','COMPLETE')
</otherwise>
</choose>
</if>
<if test=" search_oem != null and search_oem != '' ">
AND T.OEM_OBJID = #{search_oem}
</if>
<if test=" search_car != null and search_car != '' ">
AND T.CAR_OBJID = #{search_car}
</if>
<if test=" search_productGroup != null and search_productGroup != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productGroup}
</if>
<if test=" search_productFamily != null and search_productFamily != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productFamily}
</if>
<if test=" search_product != null and search_product != '' ">
AND T.PRODUCT_OBJID = #{search_product}
</if>
<choose>
<when test="multiSearch != null and !''.equals(multiSearch)">
AND UPPER(T.PART_NO) IN <foreach item="item" index="index" collection="partNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
</when>
<otherwise>
<if test=" search_partNo != null and search_partNo != '' ">
AND UPPER(T.PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
</otherwise>
</choose>
<if test=" search_partName != null and search_partName != '' ">
AND UPPER(T.PART_NAME) LIKE UPPER('%${search_partName}%')
</if>
<if test=" search_material != null and search_material != '' ">
AND T.MATERIAL_OBJID = #{search_material}
</if>
<if test=" search_revision != null and search_revision != '' ">
AND UPPER(T.REV) LIKE UPPER('%${search_revision}%')
</if>
<if test=" search_eoNo != null and search_eoNo != '' ">
AND UPPER(T.EO_NO) LIKE UPPER('%${search_eoNo}%')
</if>
<if test=" search_drawReleaseType != null and search_drawReleaseType != '' ">
AND T.DRAWING_RELEASE_TYPE = #{search_drawReleaseType}
</if>
<choose>
<when test="multiSearchThickness != null and !''.equals(multiSearchThickness)">
AND T.THICKNESS IN <foreach item="item" index="index" collection="thicknessArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
</when>
<otherwise>
<if test=" search_thickness != null and search_thickness != '' ">
AND T.THICKNESS LIKE '%${search_thickness}%'
</if>
</otherwise>
</choose>
<choose>
<when test="multiSearchDrawingNo != null and !''.equals(multiSearchDrawingNo)">
AND UPPER(T.DRAWING_NO) IN <foreach item="item" index="index" collection="drawingNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
OR UPPER(T.PART_NO) IN <foreach item="item" index="index" collection="drawingNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
</when>
<otherwise>
<if test=" search_drawingNo != null and search_drawingNo != '' ">
AND UPPER(T.DRAWING_NO) LIKE UPPER('%${search_drawingNo}%')
OR UPPER(T.PART_NO) LIKE UPPER('%${search_drawingNo}%')
</if>
</otherwise>
</choose>
</select>
<!-- 파트 Revision 목록을 가져온다(상태값 필수) -->
<select id="getPartRevisionList" parameterType="map" resultType="map">
SELECT ROWNUM RNUM, TT.*
FROM (
SELECT T.*
FROM(
SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_NAME,
(SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_NAME,
(SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_CODE,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = PART.PRODUCT_GROUP_OBJID) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = PART.PRODUCT_OBJID) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.RH_PART_OBJID) RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
DECODE(PART.DRAWING_RELEASE_TYPE,'dev','개발','product','양산') DRAWING_RELEASE_TYPE_TITLE,
PART.PART_TYPE,
PART.EO_OBJID,
PART.EO_NO,
PART.EO_ISSUE_DATE,
TO_CHAR(PART.EO_ISSUE_DATE,'YYYY-MM-DD') EO_ISSUE_DATE_TITLE,
PART.REV,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME FROM MATERIAL_TYPE_MNG WHERE OBJID = PART.MATERIAL_TYPE_OBJID) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
DECODE(PART.DRAWING_TYPE,'draw','D','shownOn','S') AS DRAWING_TYPE_TITLE,
PART.DRAWING_NO_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.DRAWING_NO_OBJID) DRAWING_NO,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME FROM MATERIAL_MNG WHERE OBJID = PART.MATERIAL_OBJID) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME FROM option_spec_mng WHERE OBJID = PART.PART_OPTION) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
(SELECT APPLY_POINT_NAME FROM APPLY_POINT_MNG WHERE OBJID = PART.APPLY_POINT_OBJID) APPLY_POINT_NAME,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_ECD' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS ECD_OBJID,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_MNG_ITEM' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS MNG_ITEM_FILE_OBJID,
(SELECT SAVED_FILE_NAME FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS SAVED_FILE_NAME,
(SELECT REAL_FILE_NAME FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS REAL_FILE_NAME,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE UPPER(DOC_TYPE) = 'PART_CONVERT_2D' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS CONVERT_2D_OBJID,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE UPPER(DOC_TYPE) = 'PART_CONVERT_3D' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS CONVERT_3D_OBJID,
(SELECT REPLACE(FILE_PATH, '\', '\\') FILE_PATH FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PART.OBJID AND DOC_TYPE = 'PART_SHAPE' AND UPPER(STATUS) = 'ACTIVE') AS FILE_PATH,
PART.IS_START_DEV_PART IS_START_DEV_PART_ORG,
NVL2(PART.IS_START_DEV_PART,PART.IS_START_DEV_PART,'1') IS_START_DEV_PART,
PART.IS_LAST,
PART.WRITER,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','COMPLETE','확정','REVISION','작성중(Revision)') STATUS_STR,
<if test=" actionType != null and actionType != '' and actionType == 'excel'">
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'changeGeometry') CHANGE_GEOMETRY_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'materialThickChange') MATERIAL_THICK_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'cycleChange') CYCLE_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'constructChange') CONSTRUCT_CHANGE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'weldingSpot') WELDING_SPOT_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'structurGlue') STRUCTUR_GLUE_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'first') FIRST_FLAG,
(SELECT DECODE(COUNT(1),0,'N','Y') FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID AND ITEM_NAME = 'etc') ETC_FLAG,
</if>
(SELECT WM_CONCAT(DECODE(ITEM_NAME,'changeGeometry','형상변경','materialThickChange','재질/두께변경','cycleChange','주기변경','constructChange','구성변경','weldingSpot','용접점','structurGlue','구조용접착제','first','초도','etc','기타','none','해당무')) FROM REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = PART.OBJID) AS CHANGE_ITEM_TITLE,
PART.STATUS
FROM PART_INFO PART
WHERE 1=1
<if test=" isLast != null and isLast != '' ">
AND IS_LAST = #{isLast}
</if>
<if test=" status != null and status != '' ">
<choose>
<when test=" status == 'create' ">
AND UPPER(STATUS) IN ('CREATE','REVISION')
</when>
<when test=" status == 'complete' ">
AND UPPER(STATUS) IN UPPER(#{status})
</when>
<otherwise>
AND UPPER(STATUS) IN ('CREATE','REVISION','COMPLETE')
</otherwise>
</choose>
</if>
ORDER BY PART.EO_ISSUE_DATE DESC NULLS LAST
)T
WHERE 1=1
<!-- 시작 Part조회를 위한 조건 추가 -->
<if test=" isStartDevPart != null and isStartDevPart != '' ">
AND T.IS_START_DEV_PART = #{isStartDevPart}
</if>
<if test=" search_oem != null and search_oem != '' ">
AND T.OEM_OBJID = #{search_oem}
</if>
<if test=" search_car != null and search_car != '' ">
AND T.CAR_OBJID = #{search_car}
</if>
<if test=" search_productGroup != null and search_productGroup != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productGroup}
</if>
<if test=" search_productFamily != null and search_productFamily != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productFamily}
</if>
<if test=" search_product != null and search_product != '' ">
AND T.PRODUCT_OBJID = #{search_product}
</if>
<choose>
<when test="multiSearch != null and !''.equals(multiSearch)">
AND UPPER(T.PART_NO) IN <foreach item="item" index="index" collection="partNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
</when>
<otherwise>
<if test=" search_partNo != null and search_partNo != '' ">
AND UPPER(T.PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
</otherwise>
</choose>
<if test=" search_partName != null and search_partName != '' ">
AND UPPER(T.PART_NAME) LIKE UPPER('%${search_partName}%')
</if>
<if test=" search_material != null and search_material != '' ">
AND T.MATERIAL_OBJID = #{search_material}
</if>
<if test=" search_revision != null and search_revision != '' ">
AND UPPER(T.REV) LIKE UPPER('%${search_revision}%')
</if>
<if test=" search_eoNo != null and search_eoNo != '' ">
AND UPPER(T.EO_NO) LIKE UPPER('%${search_eoNo}%')
</if>
<if test=" search_drawingNo != null and search_drawingNo != '' ">
AND UPPER(T.DRAWING_NO) LIKE UPPER('%${search_drawingNo}%')
</if>
<if test=" search_drawReleaseType != null and search_drawReleaseType != '' ">
AND T.DRAWING_RELEASE_TYPE = #{search_drawReleaseType}
</if>
<if test=" search_eoNo != null and search_eoNo != '' ">
AND UPPER(EO_NO) LIKE UPPER('%${search_eoNo}%')
</if>
<if test="search_fromDate != null and search_fromDate != ''">
AND TO_DATE(EO_ISSUE_DATE_TITLE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and search_toDate != ''">
AND TO_DATE(EO_ISSUE_DATE_TITLE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
<choose>
<when test="multiSearchThickness != null and !''.equals(multiSearchThickness)">
AND T.THICKNESS IN <foreach item="item" index="index" collection="thicknessArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
</when>
<otherwise>
<if test=" search_thickness != null and search_thickness != '' ">
AND T.THICKNESS LIKE '%${search_thickness}%'
</if>
</otherwise>
</choose>
<choose>
<when test="multiSearchDrawingNo != null and !''.equals(multiSearchDrawingNo)">
AND (UPPER(T.DRAWING_NO) IN <foreach item="item" index="index" collection="drawingNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>
OR UPPER(T.PART_NO) IN <foreach item="item" index="index" collection="drawingNoArr" open="(" separator="," close=")">UPPER(#{item})</foreach>)
</when>
<otherwise>
<if test=" search_drawingNo != null and search_drawingNo != '' ">
AND(UPPER(T.DRAWING_NO) LIKE UPPER('%${search_drawingNo}%')
OR UPPER(T.PART_NO) LIKE UPPER('%${search_drawingNo}%'))
</if>
</otherwise>
</choose>
) TT
</select>
<!-- 파트 중복여부 확인 -->
<select id="getDuplicatePartList" parameterType="map" resultType="map">
SELECT
OBJID
,PART_NO
,STATUS
,REV
FROM PART_INFO
WHERE 1=1
<if test=" targetObjId != null and targetObjId != '' ">
AND OBJID NOT IN(#{targetObjId})
</if>
<if test=" search_partNo != null and search_partNo != '' ">
AND PART_NO = #{search_partNo}
</if>
<if test=" search_revision != null and search_revision != '' ">
AND UPPER(REV) = UPPER(#{search_revision})
</if>
</select>
<!-- 파트가 EO당 하나만 연결가능하다는 전제하에 연결 가능한 파트 목록을 가져온다(상태값 필수) -->
<select id="getConnectablePartList" parameterType="map" resultType="map">
SELECT ROWNUM RNUM,
T.*
FROM
(SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME
FROM OEM_MNG
WHERE OBJID = PART.OEM_OBJID
) OEM_NAME,
(SELECT OEM_CODE
FROM OEM_MNG
WHERE OBJID = PART.OEM_OBJID
) OEM_CODE,
(SELECT CAR_NAME
FROM CAR_MNG
WHERE OBJID = PART.CAR_OBJID
) CAR_NAME,
(SELECT CAR_CODE
FROM CAR_MNG
WHERE OBJID = PART.CAR_OBJID
) CAR_CODE,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME
FROM PRODUCT_GROUP_MNG
WHERE OBJID = PART.PRODUCT_GROUP_OBJID
) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME
FROM PRODUCT_MNG
WHERE OBJID = PART.PRODUCT_OBJID
) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.RH_PART_OBJID) RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
DECODE(PART.DRAWING_RELEASE_TYPE,'dev','개발','product','양산') DRAWING_RELEASE_TYPE_TITLE,
PART.PART_TYPE,
PART.EO_OBJID,
PART.REV,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME
FROM MATERIAL_TYPE_MNG
WHERE OBJID = PART.MATERIAL_TYPE_OBJID
) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
DECODE(PART.DRAWING_TYPE,'draw','D','shownOn','S') AS DRAWING_TYPE_TITLE,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME
FROM MATERIAL_MNG
WHERE OBJID = PART.MATERIAL_OBJID
) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME
FROM option_spec_mng
WHERE OBJID = PART.PART_OPTION
) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_ECD' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS ECD_OBJID,
(SELECT OBJID FROM ATTACH_FILE_INFO WHERE DOC_TYPE = 'PART_MNG_ITEM' AND TARGET_OBJID = PART.OBJID AND UPPER(STATUS) = 'ACTIVE') AS MNG_ITEM_FILE_OBJID,
PART.IS_LAST,
PART.WRITER,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','확정') STATUS_STR,
PART.STATUS
FROM PART_INFO PART
)T
WHERE T.STATUS = #{status}
AND T.EO_OBJID IS NULL
<if test=" search_oem != null and search_oem != '' ">
AND T.OEM_OBJID = #{search_oem}
</if>
<if test=" search_car != null and search_car != '' ">
AND T.CAR_OBJID = #{search_car}
</if>
<if test=" search_productGroup != null and search_productGroup != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productGroup}
</if>
<if test=" search_productFamily != null and search_productFamily != '' ">
AND T.PRODUCT_GROUP_OBJID = #{search_productFamily}
</if>
<if test=" search_product != null and search_product != '' ">
AND T.PRODUCT_OBJID = #{search_product}
</if>
<if test=" search_partNo != null and search_partNo != '' ">
AND upper(T.PART_NO) like UPPER('%${search_partNo}%')
</if>
<if test=" search_partName != null and search_partName != '' ">
AND upper(T.PART_NAME) like UPPER('%${search_partName}%')
</if>
<if test=" search_material != null and search_material != '' ">
AND T.MATERIAL_OBJID = #{search_material}
</if>
<if test=" search_thickness != null and search_thickness != '' ">
AND T.THICKNESS = #{search_thickness}
</if>
<if test=" search_revision != null and search_revision != '' ">
AND UPPER(T.REV) like UPPER('%${search_revision}%')
</if>
<if test=" search_eoNo != null and search_eoNo != '' ">
AND T.EO_NO = #{search_eoNo}
</if>
<if test=" search_drawReleaseType != null and search_drawReleaseType != '' ">
AND T.DRAWING_RELEASE_TYPE = #{search_drawReleaseType}
</if>
<if test=" search_thickness != null and search_thickness != '' ">
AND T.THICKNESS = #{search_thickness}
</if>
<if test=" search_isLast != null and search_isLast != '' and 1 == search_isLast">
AND T.IS_LAST = #{search_isLast}
</if>
</select>
<!-- 파트의 상세 정보를 가져온다. -->
<select id="getPartInfoDetail" parameterType="map" resultType="map">
SELECT ROWNUM RNUM,
T.*
FROM
(SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_NAME,
(SELECT OEM_CODE FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_CODE,
(SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_NAME,
(SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_CODE,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = PART.PRODUCT_GROUP_OBJID) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = PART.PRODUCT_OBJID) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
PART.RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
DECODE(PART.DRAWING_RELEASE_TYPE,'dev','개발','product','양산') DRAWING_RELEASE_TYPE_TITLE,
PART.PART_TYPE,
PART.EO_OBJID,
TO_CHAR(EO_ISSUE_DATE,'YYYY-MM-DD') AS EO_ISSUE_DATE,
PART.EO_NO,
PART.REV,
(SELECT COUNT(1) FROM PART_INFO WHERE OBJID != PART.OBJID AND PART_NO = PART.PART_NO AND STATUS = 'revision') REV_CNT,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME FROM MATERIAL_TYPE_MNG WHERE OBJID = PART.MATERIAL_TYPE_OBJID) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
PART.DRAWING_NO_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.DRAWING_NO_OBJID) DRAWING_NO,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME FROM MATERIAL_MNG WHERE OBJID = PART.MATERIAL_OBJID) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME FROM OPTION_SPEC_MNG WHERE OBJID = PART.PART_OPTION) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
PART.IS_LAST,
PART.WRITER,
PART.CAVITY,
PART.REMARKS,
PART.MOLD_CLASSIFICATION,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PART.MOLD_CLASSIFICATION) MOLD_CLASSIFICATION_NAME,
PART.COMPANY_MOLD,
PART.COMPANY_SUP_MATERIAL,
PART.COMPANY_PLATING_PAINTING,
PART.COMPANY_ELEMENT,
PART.SPRUE,
PART.STAMP,
PART.PLATED,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','확정') STATUS_STR,
PART.STATUS,
<!-- 해당 파트 관리항목 중 확인 해야할 내용 Count를 가져온다. -->
(SELECT COUNT(1) FROM PART_MNG_ITEM_RECEPT WHERE TARGET_OBJID = PART.OBJID AND USER_ID = #{userId}) PART_MNG_ITEM_CNT,
(SELECT COUNT(1) FROM PART_INFO WHERE PART_NO = PART.PART_NO AND OBJID != PART.OBJID) DUPLICATE_PART_CNT
FROM PART_INFO PART
)T
WHERE T.OBJID = #{objid}
</select>
<!-- Import 시 Update 대상이 되는 파트의 정보를 가져온다. -->
<select id="getImportTargetPartInfoDetail" parameterType="map" resultType="map">
SELECT ROWNUM RNUM,
T.*
FROM
(SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_NAME,
(SELECT OEM_CODE FROM OEM_MNG WHERE OBJID = PART.OEM_OBJID) OEM_CODE,
(SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_NAME,
(SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = PART.CAR_OBJID) CAR_CODE,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = PART.PRODUCT_GROUP_OBJID) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = PART.PRODUCT_OBJID) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.RH_PART_OBJID) RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
DECODE(PART.DRAWING_RELEASE_TYPE,'dev','개발','product','양산') DRAWING_RELEASE_TYPE_TITLE,
PART.PART_TYPE,
PART.EO_OBJID,
(SELECT EO_NO FROM EO_INFO WHERE OBJID = PART.EO_OBJID) EO_NO,
TO_CHAR((SELECT EO_ISSUE_DATE FROM EO_INFO WHERE OBJID = PART.EO_OBJID),'YYYY-MM-DD') EO_ISSUE_DATE,
PART.REV,
(SELECT COUNT(1) FROM PART_INFO WHERE OBJID != PART.OBJID AND PART_NO = PART.PART_NO AND STATUS = 'revision') REV_CNT,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME FROM MATERIAL_TYPE_MNG WHERE OBJID = PART.MATERIAL_TYPE_OBJID) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
PART.DRAWING_NO_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.DRAWING_NO_OBJID) DRAWING_NO,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME FROM MATERIAL_MNG WHERE OBJID = PART.MATERIAL_OBJID) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME FROM OPTION_SPEC_MNG WHERE OBJID = PART.PART_OPTION) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
PART.IS_LAST,
PART.WRITER,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','확정') STATUS_STR,
PART.STATUS
FROM PART_INFO PART
)T
WHERE T.PART_NO = #{partNo}
<if test="status != null and !''.equals(status)">
AND T.STATUS = #{status}
</if>
AND T.REV = #{revision}
</select>
<!-- 접속한 인원의 파트 관리항목 확인여부 목록을 가져온다. -->
<select id="getPartMngItemList" parameterType="map" resultType="map">
SELECT
DOC_TYPE_NAME
,FILE_EXT
,REPLACE(FILE_PATH, '\', '\\') FILE_PATH
,OBJID
,REAL_FILE_NAME
,REGDATE
,SAVED_FILE_NAME
,STATUS
,TARGET_OBJID
,WRITER
FROM ATTACH_FILE_INFO FILE_INFO
WHERE TARGET_OBJID = #{objid}
AND UPPER(DOC_TYPE) IN ('PART_MNG_ITEM')
</select>
<!-- 파일다운로드/확인 시 merge 한다. -->
<update id="mergePartMngItemCheck" parameterType="map">
MERGE INTO PART_MNG_ITEM_RECEPT T USING DUAL ON ( T.TARGET_OBJID = #{partObjId} and T.SUB_OBJID = #{fileObjId} AND T.USER_ID = #{userId})
WHEN MATCHED THEN
UPDATE
SET
STATUS = #{status}
WHEN NOT MATCHED THEN
INSERT
(
OBJID
,TARGET_OBJID
,USER_ID
,STATUS
,SUB_OBJID
,REG_DATE
)
VALUES
(
#{newObjId}
,#{partObjId}
,#{userId}
,#{status}
,#{fileObjId}
,SYSDATE
)
</update>
<!-- 파트에 연결된 SPEC 정보를 가져온다. -->
<select id="getPartRelSpecList" parameterType="map" resultType="map">
SELECT REL.MASTER_OBJID,
REL.OBJID,
REL.REGDATE,
REL.SUB_OBJID,
REL.WRITER,
DOC_INFO.SPEC_NO,
DOC_INFO.DOC_NAME,
DOC_CATE.CATEGORY_NAME
FROM REL_PART_SPEC REL,
STANDARD_DOC_INFO DOC_INFO,
STANDARD_DOC_CATEGORY DOC_CATE
WHERE DOC_INFO.OBJID = REL.SUB_OBJID
AND DOC_INFO.CATEGORY_OBJID = DOC_CATE.OBJID
AND REL.MASTER_OBJID = #{objid}
</select>
<select id="getSPECConnectedList" parameterType="map" resultType="map">
SELECT
LEAF
,AFTER_SPEC_NO AS SPEC_NO
,SUB_OBJID
,DOC_NAME
FROM (
SELECT
LEVEL
,CONNECT_BY_ISLEAF LEAF
,SPEC_LINK.OBJID
,SPEC_LINK.CATEGORY_OBJID
,SPEC_LINK.AFTER_SPEC_NO
,(SELECT OBJID FROM STANDARD_DOC_INFO WHERE CATEGORY_OBJID = SPEC_LINK.CATEGORY_OBJID AND SPEC_NO = SPEC_LINK.AFTER_SPEC_NO) SUB_OBJID
,(SELECT DOC_NAME FROM STANDARD_DOC_INFO WHERE CATEGORY_OBJID = SPEC_LINK.CATEGORY_OBJID AND SPEC_NO = SPEC_LINK.AFTER_SPEC_NO) DOC_NAME
,SPEC_LINK.BEFORE_SPEC_NO
FROM SPEC_LINK_INFO SPEC_LINK
START WITH SPEC_LINK.BEFORE_SPEC_NO = (SELECT (SELECT SPEC_NO FROM STANDARD_DOC_INFO WHERE OBJID = REL.SUB_OBJID) AS SPEC_NO FROM REL_PART_SPEC REL WHERE MASTER_OBJID = #{objid} AND SUB_OBJID = #{specObjId})
AND SPEC_LINK.CATEGORY_OBJID = (SELECT (SELECT CATEGORY_OBJID FROM STANDARD_DOC_INFO WHERE OBJID = REL.SUB_OBJID) AS SPEC_CATEGORY_OBJID FROM REL_PART_SPEC REL WHERE MASTER_OBJID = #{objid} AND SUB_OBJID = #{specObjId})
CONNECT BY PRIOR SPEC_LINK.AFTER_SPEC_NO = SPEC_LINK.BEFORE_SPEC_NO
)SPEC WHERE LEAF = 1
</select>
<!-- 파트에 기변항목 정보를 가져온다. -->
<select id="getPartRelChangeItemList" parameterType="map" resultType="map">
SELECT ITEM_NAME,
MASTER_OBJID,
OBJID,
REGDATE,
WRITER
FROM REL_PART_CHANGE_ITEM
WHERE MASTER_OBJID = #{objid}
</select>
<!-- 파트에 생산구분 정보를 가져온다. -->
<select id="getPartProductCategoryItemList" parameterType="map" resultType="map">
SELECT COMM_CODE,
PART_OBJID,
OBJID,
REGDATE,
PARENT_COMM_CODE
FROM part_product_category where PART_OBJID = #{objid}
</select>
<!-- 파트와 연결된 SPEC을 삭제한다. -->
<delete id="deletePartRelSpec" parameterType="map">
DELETE REL_PART_SPEC WHERE MASTER_OBJID = #{objid}
</delete>
<!-- PART 삭제 -->
<delete id="deleteRealPart" parameterType="map">
<!-- DELETE PART_MGMT WHERE PART_MGMT_OBJID = #{partObjid} -->
delete from part_mgmt where part_mgmt_objid in(with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,price
,sup_price
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
WHERE t3.parent_part_no = t1.part_no
AND t3.parent_part_no != t3.part_no
AND t1.part_mgmt_objid = #{partObjid}::integer
and NOT CYCLE -- NOCYCLE 지정
)
SELECT part_mgmt_objid
from t1
WHERE t1.STATUS='write'
)
</delete>
<!-- 파트정보와 SPEC 정보를 연결한다. -->
<update id="mergePartRelSpec" parameterType="map">
MERGE INTO REL_PART_SPEC T USING DUAL ON ( T.MASTER_OBJID = #{objid} AND T.SUB_OBJID = #{specObjid})
WHEN NOT MATCHED THEN
INSERT
(
OBJID,
MASTER_OBJID,
SUB_OBJID,
WRITER,
REGDATE
)
VALUES
(
#{relObjid},
#{objid},
#{specObjid},
#{writer},
SYSDATE
)
</update>
<!-- 파트에 연결된 첨부파일을 삭제한다. -->
<delete id="deletePartRelAttachFile" parameterType="map">
DELETE ATTACH_FILE_INFO WHERE TARGET_OBJID = #{objid} AND DOC_TYPE = #{docType}
</delete>
<!-- 기변항목과 part정보를 삭제한다. -->
<delete id="deletePartRelChangeItem" parameterType="map">
DELETE REL_PART_CHANGE_ITEM WHERE MASTER_OBJID = #{objid}
</delete>
<!-- 생산구분과 part정보를 삭제한다. -->
<delete id="deletePartProductCategoryItem" parameterType="map">
DELETE part_product_category WHERE PART_OBJID = #{objid}
</delete>
<!-- 파트정보와 기변항목을 연결한다. -->
<update id="mergePartRelChangeItem" parameterType="map">
MERGE INTO REL_PART_CHANGE_ITEM T USING DUAL ON ( T.MASTER_OBJID = #{objid} AND ITEM_NAME = #{changeItem})
WHEN NOT MATCHED THEN
INSERT
(
OBJID,
MASTER_OBJID,
ITEM_NAME,
WRITER,
REGDATE
)
VALUES
(
#{relObjid},
#{objid},
#{changeItem},
#{writer},
SYSDATE
)
</update>
<!-- 파트정보와 생산구분을 연결한다. -->
<update id="mergePartProductCategoryItem" parameterType="map">
MERGE INTO part_product_category T USING DUAL ON ( T.PART_OBJID = #{objid} AND COMM_CODE = #{changeItem})
WHEN NOT MATCHED THEN
INSERT
(
OBJID,
PART_OBJID,
COMM_CODE,
REGDATE,
PARENT_COMM_CODE
)
VALUES
(
#{relObjid},
#{objid},
#{changeItem},
SYSDATE,
#{parent_comm_code}
)
</update>
<!-- Part와 동일한 품번을 가지는 Part 목록을 가져와 IS_LAST를 지정한다. -->
<select id="getChangePartIsLast" parameterType="map" resultType="map">
SELECT
T.*
FROM
(SELECT PART.OBJID,
PART.OEM_OBJID,
PART.CAR_OBJID,
(SELECT OEM_NAME
FROM OEM_MNG
WHERE OBJID = PART.OEM_OBJID
) OEM_NAME,
(SELECT CAR_NAME
FROM CAR_MNG
WHERE OBJID = PART.CAR_OBJID
) CAR_NAME,
PART.PRODUCT_GROUP_OBJID,
PART.PRODUCT_OBJID,
(SELECT PRODUCT_GROUP_NAME
FROM PRODUCT_GROUP_MNG
WHERE OBJID = PART.PRODUCT_GROUP_OBJID
) PRODUCT_GROUP_NAME,
(SELECT PRODUCT_NAME
FROM PRODUCT_MNG
WHERE OBJID = PART.PRODUCT_OBJID
) PRODUCT_NAME,
PART.PART_NO,
PART.RH_PART_OBJID,
(SELECT PART_NO FROM PART_INFO WHERE OBJID = PART.RH_PART_OBJID) RH_PART_NO,
PART.PART_NAME,
PART.DRAWING_RELEASE_TYPE,
PART.PART_TYPE,
PART.EO_OBJID,
(SELECT EO_NO FROM EO_INFO WHERE OBJID = PART.EO_OBJID) EO_NO,
TO_CHAR((SELECT EO_ISSUE_DATE FROM EO_INFO WHERE OBJID = PART.EO_OBJID),'YYYY-MM-DD') EO_ISSUE_DATE,
PART.REV,
PART.MATERIAL_TYPE_OBJID,
(SELECT MATERIAL_TYPE_NAME
FROM MATERIAL_TYPE_MNG
WHERE OBJID = PART.MATERIAL_TYPE_OBJID
) MATERIAL_TYPE_NAME,
PART.DRAWING_TYPE,
PART.MATERIAL_OBJID,
(SELECT MATERIAL_NAME
FROM MATERIAL_MNG
WHERE OBJID = PART.MATERIAL_OBJID
) MATERIAL_NAME,
PART.PART_OPTION,
(SELECT OPTION_NAME
FROM OPTION_SPEC_MNG
WHERE OBJID = PART.PART_OPTION
) PART_OPTION_NAME,
PART.THICKNESS,
PART.WEIGHT,
PART.APPLY_POINT_OBJID,
PART.MNG_ITEM_TYPE MNG_ITEM_TYPE_ORG,
DECODE(UPPER(PART.MNG_ITEM_TYPE),'MANAGEMENT','Y','N') MNG_ITEM_TYPE,
DECODE(PART.IS_LAST,'1','Y','0','N') IS_LAST_TITLE,
PART.IS_LAST,
PART.WRITER,
TO_CHAR(PART.REGDATE,'YYYY-MM-DD') REGDATE,
PART.REGDATE REGDATE_ORG,
DECODE(UPPER(PART.STATUS),'CREATE','작성중','확정') STATUS_STR,
PART.STATUS
FROM PART_INFO PART
)T
WHERE T.PART_NO = (SELECT PART_NO FROM PART_INFO WHERE OBJID = #{objid})
</select>
<!-- oldObjId에 해당하는 파트 정보를 통해 Revision을 생성한다. -->
<insert id="createPartRevision" parameterType="map">
INSERT
INTO PART_INFO
(
OBJID,
<!-- APPLY_POINT_OBJID, -->
CAR_OBJID,
DRAWING_NO_OBJID,
DRAWING_RELEASE_TYPE,
DRAWING_TYPE,
IS_LAST,
MATERIAL_OBJID,
MATERIAL_TYPE_OBJID,
MNG_ITEM_TYPE,
OEM_OBJID,
PART_NAME,
PART_NO,
PART_OPTION,
PART_TYPE,
PRODUCT_GROUP_OBJID,
PRODUCT_OBJID,
REGDATE,
RH_PART_OBJID,
STATUS,
THICKNESS,
WEIGHT,
WRITER
)
SELECT
#{newObjId},
<!-- APPLY_POINT_OBJID, -->
CAR_OBJID,
DRAWING_NO_OBJID,
DRAWING_RELEASE_TYPE,
DRAWING_TYPE,
'0',
MATERIAL_OBJID,
MATERIAL_TYPE_OBJID,
MNG_ITEM_TYPE,
OEM_OBJID,
PART_NAME,
PART_NO,
PART_OPTION,
PART_TYPE,
PRODUCT_GROUP_OBJID,
PRODUCT_OBJID,
SYSDATE,
RH_PART_OBJID,
#{status},
THICKNESS,
WEIGHT,
#{writer}
FROM PART_INFO
WHERE OBJID = #{oldObjId}
</insert>
<!-- oldObjId에 해당하는 파트 정보를 통해 Revision을 생성한다. -->
<insert id="insertNewPartRevision" parameterType="map">
INSERT
INTO PART_MGMT
(
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,MFA_CD
,QTY
,PROCESS_CD
,SORT_CD
,SUP_CD
,REV
,IS_LAST
,REL_DATE
,REG_DATE
,REG_USER_ID
,CHANGE_CD
,STATUS
,DEL_YN
,REL_STATUS
,SIZED
,MATERIAL
)
SELECT
#{objId}::integer
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,MFA_CD
,QTY
,PROCESS_CD
,SORT_CD
,SUP_CD
,#{rev}
,'0'
,null
,now()
,REG_USER_ID
,#{change_cd}
,'write'
,DEL_YN
,'PRTS00100'
,SIZED
,MATERIAL
FROM PART_MGMT
WHERE PART_MGMT_OBJID = #{part_mgmt_objid}::integer
</insert>
<!-- 첨부한 파일 목록을 가져온다. -->
<select id="getUploadFileList" resultType="map" parameterType="map">
SELECT * FROM (
SELECT OBJID
, TARGET_OBJID
, SAVED_FILE_NAME
, REAL_FILE_NAME
, REPLACE(REAL_FILE_NAME,'-','') REMOVE_CHAR_REAL_FILE_NAME
, DOC_TYPE
, DOC_TYPE_NAME
, FILE_SIZE
, FILE_EXT
, UPPER(FILE_EXT) UPPER_FILE_EXT
, REPLACE(FILE_PATH, '\', '\\') AS FILE_PATH
, WRITER
, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE
, REGDATE AS REGDATE_ORG
, STATUS
FROM ATTACH_FILE_INFO
WHERE 1=1
AND TARGET_OBJID = ${targetObjId}
AND STATUS = 'Active'
<if test="docType != null and !''.equals(docType)">
AND DOC_TYPE = #{docType}
</if>
<!-- 일괄다운로드시 여러 DOC_TYPE 조회 시 사용 -->
<if test="docTypeList != null and docTypeList.size != 0">
AND DOC_TYPE IN
<foreach collection="docTypeList" item="docType" index="index" separator="," open="(" close=")">
#{docType}
</foreach>
</if>
)WHERE 1=1
<if test="realFileName != null and !''.equals(realFileName)">
AND REMOVE_CHAR_REAL_FILE_NAME LIKE '%${realFileName}%'
</if>
ORDER BY REGDATE_ORG DESC
</select>
<!-- 첨부한 파일의 targetObjId를 변경한다. -->
<update id="updatePartImportAttachFile" parameterType="map">
UPDATE ATTACH_FILE_INFO SET TARGET_OBJID = #{partObjId}, DOC_TYPE = #{docType}, DOC_TYPE_NAME = #{docTypeName} WHERE OBJID = #{fileObjId}
</update>
<!-- 기존 파트에 첨부파일 연결여부를 확인하여 이미 연결되어 있는 경우 삭제한다. -->
<delete id="deletePartImportAttachFile" parameterType="map">
DELETE ATTACH_FILE_INFO WHERE TARGET_OBJID = #{partObjId} AND DOC_TYPE = #{docType}
</delete>
<!-- **************************************************************************** -->
<!-- //구조등록 좌측 트리메뉴 -->
<select id="getBOMTreeList" parameterType="map" resultType="map">
<!--
SELECT LEVEL
, A.PART_NO
, LPAD(' ', 3*(LEVEL-1))||A.PART_NO LPAD_PART_NO
, (SELECT PART_NAME FROM PART_INFO WHERE PART_NO = A.PART_NO AND IS_LAST = 1) AS PART_NAME
, A.PARENT_PART_NO
, A.QTY
, (SELECT COUNT(*) FROM PART_BOM_QTY WHERE PARENT_PART_NO = A.PART_NO) AS SUB_PART_CNT
, (SELECT WM_CONCAT(DISTINCT PART_NO) FROM PART_BOM_QTY WHERE BOM_REPORT_OBJID = A.BOM_REPORT_OBJID START WITH PART_NO = A.PART_NO CONNECT BY PRIOR PARENT_PART_NO = PART_NO AND PRIOR BOM_REPORT_OBJID = A.BOM_REPORT_OBJID) AS PARENT_PARTS
FROM PART_BOM_QTY A
WHERE 1=1
AND BOM_REPORT_OBJID = #{bomReportObjId}
START WITH PARENT_PART_NO IS NULL
CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO AND PRIOR BOM_REPORT_OBJID = BOM_REPORT_OBJID
-->
<!-- SELECT LEVEL
, A.OBJID
, A.PART_NO
, LPAD(' ',(LEVEL-1))||A.PART_NO LPAD_PART_NO
, (SELECT PART_NAME FROM PART_INFO WHERE PART_NO = A.PART_NO AND IS_LAST = 1) AS PART_NAME
, A.PARENT_PART_NO
, A.QTY
, (SELECT COUNT(*) FROM PART_BOM_QTY WHERE PARENT_PART_NO = A.PART_NO) AS SUB_PART_CNT
, (SELECT WM_CONCAT(DISTINCT PART_NO) FROM PART_BOM_QTY WHERE BOM_REPORT_OBJID = A.BOM_REPORT_OBJID START WITH PART_NO = A.PART_NO CONNECT BY PRIOR PARENT_PART_NO = PART_NO AND PRIOR BOM_REPORT_OBJID = A.BOM_REPORT_OBJID) AS PARENT_PARTS
FROM PART_BOM_QTY A
WHERE 1=1
START WITH PARENT_PART_NO IS NULL AND BOM_REPORT_OBJID = #{bomReportObjId}
CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO AND PRIOR BOM_REPORT_OBJID = BOM_REPORT_OBJID -->
WITH RECURSIVE VIEW_BOM(
OBJID,
PART_NO,
BOM_REPORT_OBJID,
LEV,
PATH,
CYCLE
) AS (
SELECT
A.OBJID,
A.PART_NO,
A.BOM_REPORT_OBJID,
1,
ARRAY [A.PART_NO],
FALSE
FROM
PART_BOM_QTY A
WHERE 1=1
AND A.PARENT_PART_NO IS NULL AND A.BOM_REPORT_OBJID = #{bomReportObjId}::NUMERIC
UNION ALL
SELECT
B.OBJID,
B.PART_NO,
B.BOM_REPORT_OBJID,
LEV + 1,
PATH,
B.PARENT_PART_NO = ANY(PATH)
FROM
PART_BOM_QTY B
JOIN
VIEW_BOM
ON B.PARENT_PART_NO = VIEW_BOM.PART_NO
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
*
FROM VIEW_BOM
WHERE 1=1
ORDER BY
PATH
</select>
<!-- //BOM 구조등록 -->
<insert id="relatePartInfo" parameterType="map">
INSERT INTO PART_BOM_QTY(BOM_REPORT_OBJID, OBJID, PARENT_OBJID, PARENT_PART_NO, PART_NO, QTY, REGION_OBJID, REGDATE) VALUES (
#{bomReportObjId}
, #{partObjId}
, #{parentObjId}
, #{parentPartNo}
, #{partNo}
, #{qty}
, #{regionObjId}
, SYSDATE
)
</insert>
<!-- //BOM_LEVEL 구조 레벨 등록 -->
<insert id="relatePartLevelInfo" parameterType="map">
INSERT INTO PART_BOM_LEVEL(BOM_REPORT_OBJID, BOM_LAVEL, OBJID, PART_BOM_QTY_OBJID, REGDATE) VALUES (
#{bom_report_objid}
, #{bom_lavel}
, #{objid}
, #{part_bom_qty_objid}
, SYSDATE
)
</insert>
<!-- //BOM 구조삭제 -->
<delete id="deletePartRelateInfo" parameterType="map">
DELETE FROM PART_BOM_QTY
WHERE OBJID IN (
SELECT OBJID
FROM PART_BOM_QTY
WHERE 1=1
START WITH OBJID = #{leftPartObjId}
CONNECT BY PRIOR OBJID = PARENT_OBJID
)
<!-- 이상한 쿼리 -->
<!-- DELETE FROM PART_BOM_QTY
WHERE 1=1
AND BOM_REPORT_OBJID = #{objId}
<choose>
<when test="leftParentPartNo == null or ''.equals(leftParentPartNo)">
AND PARENT_PART_NO IS NULL
</when>
<otherwise>
AND PARENT_PART_NO = #{leftParentPartNo}
</otherwise>
</choose>
AND OBJID IN (
SELECT OBJID
FROM PART_BOM_QTY
WHERE 1=1
START WITH PART_NO = #{leftPartNo}
CONNECT BY PRIOR PART_NO = PARENT_PART_NO
) -->
</delete>
<!-- //BOM 구조삭제 후, DUMMY DATA 삭제 -->
<delete id="deleteDummyAfterDeletePartRelatedInfo" parameterType="map">
DELETE
FROM PART_BOM_QTY
WHERE 1=1
AND BOM_REPORT_OBJID = #{objId}
AND OBJID NOT IN (
SELECT OBJID
FROM PART_BOM_QTY
WHERE 1=1
START WITH PARENT_PART_NO IS NULL
CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO AND PRIOR BOM_REPORT_OBJID = BOM_REPORT_OBJID
)
</delete>
<!-- //구조등록 목록조회 -->
<select id="getBOMStandardStructureList" parameterType="map" resultType="map">
SELECT ROW_NUMBER() OVER(ORDER BY REGDATE_ORG DESC) AS RNUM, AA.*
FROM (
SELECT A.OBJID
, A.CAR_OBJID
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, A.OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = A.OEM_OBJID) AS OEM_NAME
, (SELECT OEM_CODE FROM OEM_MNG WHERE OBJID = A.OEM_OBJID) AS OEM_CODE
, A.PRODUCT_OBJID
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID) AS PRODUCT_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID)) AS PRODUCT_GROUP_NAME
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID) AS PRODUCT_NAME
, A.REGION_OBJID
<!-- , (SELECT REGION_NAME FROM REGION_MNG WHERE OBJID = A.REGION_OBJID) AS REGION_NAME -->
, '' AS REGION_NAME
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS USER_NAME
, REGDATE AS REGDATE_ORG
, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE
FROM PART_BOM_REPORT A
WHERE 1=1
) AA
WHERE 1=1
<!-- <if test="PAGE_END != null and PAGE_END != '' and actionType != 'excel'">
<![CDATA[ AND RNUM <= #{PAGE_END} ]]>
</if>
<if test="PAGE_START != null and PAGE_START != '' and actionType != 'excel'">
<![CDATA[ AND RNUM >= #{PAGE_START} ]]>
</if>
-->
<if test="search_oemObjId != null and !''.equals(search_oemObjId)">
AND OEM_OBJID = #{search_oemObjId}
</if>
<if test="search_carTypeObjId != null and !''.equals(search_carTypeObjId)">
AND CAR_OBJID = #{search_carTypeObjId}
</if>
<if test="search_productGroupObjId != null and !''.equals(search_productGroupObjId)">
AND PRODUCT_GROUP_OBJID = #{search_productGroupObjId}
</if>
<if test="search_productObjId != null and !''.equals(search_productObjId)">
AND PRODUCT_OBJID = #{search_productObjId}
</if>
<if test="search_regionObjId != null and !''.equals(search_regionObjId)">
AND REGION_OBJID = #{search_regionObjId}
</if>
ORDER BY REGDATE_ORG DESC
</select>
<select id="getBOMStandardStructureListCnt" 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.OBJID
, A.CAR_OBJID
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_CODE
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = A.CAR_OBJID) AS CAR_NAME
, A.OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = A.OEM_OBJID) AS OEM_NAME
, (SELECT OEM_CODE FROM OEM_MNG WHERE OBJID = A.OEM_OBJID) AS OEM_CODE
, A.PRODUCT_OBJID
, (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID) AS PRODUCT_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID)) AS PRODUCT_GROUP_NAME
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PRODUCT_OBJID) AS PRODUCT_NAME
, A.REGION_OBJID
<!-- , (SELECT REGION_NAME FROM REGION_MNG WHERE OBJID = A.REGION_OBJID) AS REGION_NAME -->
, '' AS REGION_NAME
, A.WRITER
, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS DEPT_NAME
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = A.WRITER) AS USER_NAME
, REGDATE AS REGDATE_ORG
, TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REGDATE
FROM PART_BOM_REPORT A
WHERE 1=1
)
WHERE 1=1
<if test="search_oemObjId != null and !''.equals(search_oemObjId)">
AND OEM_OBJID = #{search_oemObjId}
</if>
<if test="search_carTypeObjId != null and !''.equals(search_carTypeObjId)">
AND CAR_OBJID = #{search_carTypeObjId}
</if>
<if test="search_productGroupObjId != null and !''.equals(search_productGroupObjId)">
AND PRODUCT_GROUP_OBJID = #{search_productGroupObjId}
</if>
<if test="search_productObjId != null and !''.equals(search_productObjId)">
AND PRODUCT_OBJID = #{search_productObjId}
</if>
<if test="search_regionObjId != null and !''.equals(search_regionObjId)">
AND REGION_OBJID = #{search_regionObjId}
</if>
)
WHERE 1=1
</select>
<!-- //1레벨에 같은 part no가 있는지 체크 -->
<select id="getSameTopPartNoCnt" parameterType="map" resultType="map">
SELECT COUNT(*) AS CNT
FROM PART_BOM_QTY
WHERE 1=1
AND PARENT_PART_NO IS NULL
AND BOM_REPORT_OBJID = #{objId}
AND PART_NO IN <foreach item="item" index="index" collection="rightCheckedArr" open="(" separator="," close=")">#{item}</foreach>
</select>
<!-- //qty 수량 조정 -->
<update id="structureQtySave" parameterType="map">
UPDATE PART_BOM_QTY SET QTY = #{qty} WHERE PART_NO = #{partNo}
<choose>
<when test="parentPartNo != null and !''.equals(parentPartNo)">
AND PARENT_PART_NO = #{parentPartNo}
</when>
<otherwise>
AND PARENT_PART_NO IS NULL
AND BOM_REPORT_OBJID = #{bomReportObjId}
</otherwise>
</choose>
</update>
<!-- //구조등록 Excel Import시 임시 테이블에 값 등록 -->
<insert id="insertStructureTempExcelImportData" parameterType="map">
INSERT INTO STRUCTURE_TEMP_XLS_IMPORT_DATA (
TARGET_OBJID
, NO
, PARENT_PART_NO
, PART_NO
, QTY
, REGDATE
, MSG
, OBJID
) VALUES (
#{targetObjId}
, #{no}
, #{parentPartNo}
, #{partNo}
, #{qty}
, SYSDATE
, #{msg}
, #{objId}
)
</insert>
<!-- //구조등록 Excel Import 테이블 값 조회 -->
<select id="selectStructureTempExcelImportData" resultType="map" parameterType="map">
SELECT A.TARGET_OBJID
, A.NO
, A.PARENT_PART_NO
, A.PART_NO
, A.QTY
, A.MSG
, (SELECT COUNT(*) FROM PART_INFO WHERE TRIM(PART_NO) = TRIM(A.PARENT_PART_NO) AND UPPER(STATUS) = UPPER('COMPLETE')) AS PARENT_PART_COMPLETE_CNT
, (SELECT COUNT(*) FROM PART_INFO WHERE TRIM(PART_NO) = TRIM(A.PART_NO) AND UPPER(STATUS) = UPPER('COMPLETE')) AS PART_COMPLETE_CNT
, (SELECT WM_CONCAT(DISTINCT PART_NO) FROM STRUCTURE_TEMP_XLS_IMPORT_DATA WHERE TARGET_OBJID = A.TARGET_OBJID AND PART_NO != A.PART_NO START WITH PART_NO = A.PART_NO CONNECT BY NOCYCLE PRIOR PARENT_PART_NO = PART_NO AND PRIOR TARGET_OBJID = A.TARGET_OBJID) AS PARENT_PARTS
, (SELECT COUNT(*) FROM STRUCTURE_TEMP_XLS_IMPORT_DATA WHERE TARGET_OBJID = A.TARGET_OBJID AND PARENT_PART_NO IS NULL AND PART_NO = A.PART_NO) AS TOP_LEVEL_PART_CNT
FROM STRUCTURE_TEMP_XLS_IMPORT_DATA A
WHERE 1=1
AND TARGET_OBJID = #{targetObjId}
ORDER BY TO_NUMBER(NO) ASC
</select>
<!-- //구조등록 Excel Import 테이블 초기화 -->
<delete id="initializeStructureTempExcelImportData" parameterType="map">
DELETE FROM STRUCTURE_TEMP_XLS_IMPORT_DATA WHERE TARGET_OBJID = #{targetObjId}
</delete>
<!-- //해당 part가 확정인지 확인 -->
<select id="isPartComplete" parameterType="map" resultType="map">
SELECT COUNT(*) AS CNT
FROM PART_INFO
WHERE 1=1
AND PART_NO = #{partNo}
AND UPPER(STATUS) = 'COMPLETE'
</select>
<!-- //구조등록 excel import temp data를 통해 PART_BOM_QTY 테이블 값 입력 -->
<insert id="saveStructureExcelImportData" parameterType="map">
INSERT INTO PART_BOM_QTY(
BOM_REPORT_OBJID
, PARENT_PART_NO
, PART_NO
, QTY
, REGION_OBJID
, REGDATE
, OBJID
) SELECT #{bomObjId} as BOM_REPORT_OBJID
, replace(PARENT_PART_NO, ' ', '')
, replace(PART_NO, ' ', '')
, CASE WHEN REGEXP_INSTR(QTY, '[^0-9]') = '1' THEN '1' ELSE QTY END AS QTY
, #{search_regionObjId} AS REGION_OBJID
, REGDATE
, OBJID
FROM STRUCTURE_TEMP_XLS_IMPORT_DATA
WHERE 1=1
AND TARGET_OBJID = #{targetObjId}
ORDER BY NO
</insert>
<select id="aaaaa" parameterType="map" resultType="map">
SELECT LEVEL, T.* from (SELECT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,QTY
,PROCESS_CD
,CODE_NAME(PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,REG_DATE
,REG_USER_ID
FROM PART_MGMT
WHERE 1=1
AND IS_LAST = 1
AND DEL_YN='N'
AND PROJECT_MGMT_OBJID = #{projectno}
) T WHERE 1 = 1
<if test="search_partNo != null and !''.equals(search_partNo)">
AND UPPER(PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
<if test="search_partName != null and !''.equals(search_partName)">
AND UPPER(PART_NAME) LIKE UPPER('%${search_partName}%')
</if>
START WITH T.PART_NO = T.PARENT_PART_NO
CONNECT BY NOCYCLE PRIOR T.PART_NO = T.PARENT_PART_NO
<!-- START WITH PART_MGMT_PARENT_OBJID IS NULL
CONNECT BY NOCYCLE PRIOR PART_MGMT_OBJID = PART_MGMT_PARENT_OBJID -->
</select>
<select id="bbbbb" parameterType="map" resultType="map">
SELECT LEVEL,
LEVEL+('${search_partLevel}')-1 AS LEV,
CONNECT_BY_ROOT PART_MGMT_OBJID AS SUB_ROOT_OBJID ,
LPAD(' ', 3*(LEVEL-1))||PART_NO LPAD_PART_NO ,
CONNECT_BY_ISLEAF "LEAF" ,
T.*,
CONNECT_BY_ROOT PART_MGMT_OBJID AS ROOT_OBJID
FROM
(SELECT
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,QTY
,PROCESS_CD
,CODE_NAME(PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,REG_DATE
,REG_USER_ID
FROM PART_MGMT
WHERE 1=1
AND IS_LAST = 1
AND DEL_YN='N'
AND PROJECT_MGMT_OBJID = #{projectno}
) T
WHERE 1=1
START WITH PART_MGMT_OBJID = #{objid}
CONNECT BY NOCYCLE PRIOR T.PART_NO = T.PARENT_PART_NO
<!-- START WITH T.PART_NO = T.PARENT_PART_NO -->
<!-- CONNECT BY NOCYCLE PRIOR PART_MGMT_OBJID = PART_MGMT_PARENT_OBJID -->
</select>
<!-- //정전개 조회 쿼리 -->
<select id="selectStructureAscendingList" parameterType="map" resultType="map">
SELECT * FROM
(
with recursive t1 ( part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,rev
,is_last
,rel_date
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
, lev,path,part_array,cycle) as (
SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] as part_array,
FALSE as CYCLE
from part_mgmt AS t2
where part_no = parent_part_no
union all
SELECT distinct t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) as CYCLE
from part_mgmt AS t3, t1
where t3.parent_part_no = t1.part_no
and t3.parent_part_no != t3.part_no
and NOT CYCLE
)
SELECT
t1.part_mgmt_objid
,t1.part_mgmt_parent_objid
,t1.project_mgmt_objid
,t1.part_name
,t1.part_no
,t1.parent_part_no
,t1.spec_cd
,t1.mfa_cd
,t1.qty
,t1.process_cd
,t1.sort_cd
,t1.sup_cd
,t1.rev
,t1.is_last
,to_char(t1.rel_date,'yyyy-mm-dd') as rel_date
,to_char(t1.reg_date,'yyyy-mm-dd') as reg_date
,t1.reg_user_id
,t1.change_cd
,t1.status
,t1.del_yn
,t1.rel_status
,t1.sized
,t1.material
,(select o.code_name from comm_code o where o.code_id = t1.sort_cd) AS sort_name
,t1.lev
,LPAD(' ', 3*(t1.lev-1))||t1.part_no as LPAD_PART_NO
, case
when (t1.lev - lead(t1.lev) over (order by path)) <![CDATA[ < ]]> 0
then 0
else 1
end as LEAF,
(SELECT part_mgmt_objid FROM t1 WHERE lev='1' AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer and t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1') AS ROOT_OBJID,
(SELECT part_mgmt_objid FROM t1 WHERE lev='1' AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer and t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1') AS SUB_ROOT_OBJID
from t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1'
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
<if test="search_partNo != null and !''.equals(search_partNo)">
AND UPPER(t1.PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
<if test="search_partName != null and !''.equals(search_partName)">
AND UPPER(t1.PART_NAME) LIKE UPPER('%${search_partName}%')
</if>
order by path,lev,part_no
) AS TT
<!-- SELECT LEVEL,
LEVEL AS LEV,
CONNECT_BY_ROOT PART_MGMT_OBJID AS SUB_ROOT_OBJID ,
LPAD(' ', 3*(LEVEL-1))||PART_NO LPAD_PART_NO ,
CONNECT_BY_ISLEAF "LEAF" ,
T.*,
CONNECT_BY_ROOT PART_MGMT_OBJID AS ROOT_OBJID
FROM
(SELECT
T.PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,T.PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,CODE_NAME(SPEC_CD) AS SPEC_NAME
,MFA_CD
,CODE_NAME(MFA_CD) AS MFA_NAME
,T.QTY
,T.PROCESS_CD
,CODE_NAME(T.PROCESS_CD) AS PROCESS_NAME
,SORT_CD
,CODE_NAME(SORT_CD) AS SORT_NAME
,SUP_CD
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG O WHERE O.SUPPLY_CODE = SUP_CD) AS SUP_NAME
,REV
,TO_CHAR(REL_DATE,'YYYY-MM-DD') AS REL_DATE
,T.REG_DATE
,T.REG_USER_ID
FROM PART_MGMT T
WHERE 1=1
AND IS_LAST = 1
AND DEL_YN='N'
AND PROJECT_MGMT_OBJID = #{projectno}
) T
WHERE 1=1 -->
</select>
<!-- <select id="selectStructureAscendingList" parameterType="map" resultType="map">
SELECT LEVEL
, CONNECT_BY_ROOT OBJID AS SUB_ROOT_OBJID
, LPAD(' ', 3*(LEVEL-1))||AA.PART_NO LPAD_PART_NO
, CONNECT_BY_ISLEAF "LEAF"
, AA.*
FROM (
SELECT LEVEL AS LEV
, T.*, CONNECT_BY_ROOT OBJID AS ROOT_OBJID
FROM (
SELECT A.BOM_REPORT_OBJID
, A.OBJID
, A.PARENT_PART_NO
, A.PART_NO
, B.PART_TYPE
, (SELECT OBJID FROM PART_INFO WHERE PART_NO = A.PART_NO AND IS_LAST = 1 AND UPPER(STATUS) = 'COMPLETE') AS PART_OBJID
, A.QTY
, B.PART_NAME
, B.EO_NO
, (SELECT OBJID FROM EO_INFO WHERE EO_NO = B.EO_NO) AS EO_OBJID
, B.EO_ISSUE_DATE AS EO_ISSUE_DATE_ORG
, TO_CHAR(B.EO_ISSUE_DATE, 'YYYY-MM-DD') AS EO_ISSUE_DATE
, B.OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = (SELECT OEM_OBJID FROM CAR_MNG WHERE OBJID = C.CAR_OBJID)) AS OEM_NAME
, C.CAR_OBJID
, (SELECT CAR_NAME FROM CAR_MNG WHERE OBJID = C.CAR_OBJID) AS CAR_NAME
, (SELECT CAR_CODE FROM CAR_MNG WHERE OBJID = C.CAR_OBJID) AS CAR_CODE
, (SELECT MODEL_CODE FROM CAR_MNG WHERE OBJID = C.CAR_OBJID) AS CAR_MODEL_CODE
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = (SELECT PRODUCT_GROUP_OBJID FROM PRODUCT_MNG WHERE OBJID = C.PRODUCT_OBJID)) AS PRODUCT_GROUP_NAME
, C.PRODUCT_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = C.PRODUCT_OBJID) AS PRODUCT_NAME
, A.REGION_OBJID
, (SELECT REGION_NAME FROM REGION_MNG WHERE OBJID = A.REGION_OBJID) AS REGION_NAME
, B.MATERIAL_OBJID
, (SELECT MATERIAL_NAME FROM MATERIAL_MNG WHERE OBJID = B.MATERIAL_OBJID) AS MATERIAL_NAME
, B.THICKNESS
, B.REV
, CASE WHEN B.DRAWING_TYPE = 'draw' THEN 'D'
WHEN B.DRAWING_TYPE = 'shownOn' THEN 'S'
ELSE B.DRAWING_TYPE
END AS DRAWING_TYPE
, CASE WHEN B.DRAWING_RELEASE_TYPE = 'dev' THEN '개발'
WHEN B.DRAWING_RELEASE_TYPE = 'product' THEN '양산'
ELSE B.DRAWING_RELEASE_TYPE
END AS DRAWING_RELEASE_TYPE
, B.DRAWING_TYPE AS DRAWING_TYPE_ORG
, B.DRAWING_RELEASE_TYPE AS DRAWING_RELEASE_TYPE_ORG
, A.REGDATE
FROM PART_BOM_QTY A, PART_INFO B, PART_BOM_REPORT C
WHERE 1=1
AND C.OBJID = A.BOM_REPORT_OBJID
AND A.PART_NO = B.PART_NO
AND UPPER(B.STATUS) = 'COMPLETE'
AND B.IS_LAST = 1
<if test="search_carObjId != null and !''.equals(search_carObjId)">
AND C.CAR_OBJID = #{search_carObjId}
</if>
<if test="search_productObjId != null and !''.equals(search_productObjId)">
AND C.PRODUCT_OBJID = #{search_productObjId}
</if>
) T
WHERE 1=1
START WITH PARENT_PART_NO IS NULL
CONNECT BY NOCYCLE PRIOR PART_NO = PARENT_PART_NO AND PRIOR BOM_REPORT_OBJID = BOM_REPORT_OBJID
) AA
WHERE 1=1
START WITH
<choose>
<when test="search_partNo != null and !''.equals(search_partNo) or search_partName != null and !''.equals(search_partName)">
<if test="search_partNo != null and !''.equals(search_partNo)">
UPPER(AA.PART_NO) LIKE UPPER('%${search_partNo}%')
</if>
<if test="search_partNo != null and !''.equals(search_partNo) and search_partName != null and !''.equals(search_partName)">
AND
</if>
<if test="search_partName != null and !''.equals(search_partName)">
UPPER(AA.PART_NAME) LIKE UPPER('%${search_partName}%')
</if>
</when>
<otherwise>
PARENT_PART_NO IS NULL
</otherwise>
</choose>
CONNECT BY NOCYCLE PRIOR AA.PART_NO = AA.PARENT_PART_NO
황의돈 DR 주석처리
AND PRIOR AA.BOM_REPORT_OBJID = AA.BOM_REPORT_OBJID
아래는 원래 주석처리 되어 있었음
AND PRIOR ROOT_OBJID = ROOT_OBJID
ORDER SIBLINGS BY AA.BOM_REPORT_OBJID, AA.PART_TYPE DESC
</select> -->
<!-- //역전개 조회 쿼리 -->
<select id="selectStructureDescendingList" parameterType="map" resultType="map">
SELECT *
FROM (
WITH RECURSIVE t1
(
part_mgmt_objid ,
part_mgmt_parent_objid ,
project_mgmt_objid ,
part_name ,
part_no ,
parent_part_no ,
spec_cd ,
mfa_cd ,
qty ,
process_cd ,
sort_cd ,
sup_cd ,
rev ,
is_last ,
rel_date ,
reg_date ,
reg_user_id ,
change_cd ,
status ,
del_yn ,
rel_status ,
sized ,
material ,
lev,
PATH,
part_array,
CYCLE
) AS
(SELECT t2.*,
1 AS lev,
t2.part_no::text,
ARRAY[t2.part_no] AS part_array,
FALSE AS CYCLE
FROM part_mgmt AS t2
WHERE 1=1
<if test="search_partNo != null and !''.equals(search_partNo)">
AND PART_NO = #{search_partNo}
</if>
UNION ALL
SELECT DISTINCT t3.*,
lev+1,
PATH||t3.part_no::text,
t1.part_array,
t3.part_no = ANY(part_array) AS CYCLE
FROM part_mgmt AS t3,
t1
WHERE t1.parent_part_no = t3.part_no
AND t3.parent_part_no != t3.part_no
AND NOT CYCLE
)
SELECT t1.part_mgmt_objid ,
t1.part_mgmt_parent_objid ,
t1.project_mgmt_objid ,
t1.part_name ,
t1.part_no ,
t1.parent_part_no ,
t1.spec_cd ,
t1.mfa_cd ,
t1.qty ,
t1.process_cd ,
t1.sort_cd ,
t1.sup_cd ,
t1.rev ,
t1.is_last ,
to_char(t1.rel_date,'yyyy-mm-dd') AS rel_date ,
to_char(t1.reg_date,'yyyy-mm-dd') AS reg_date ,
t1.reg_user_id ,
t1.change_cd ,
t1.status ,
t1.del_yn ,
t1.rel_status ,
t1.sized ,
t1.material ,
(SELECT o.code_name
FROM comm_code o
WHERE o.code_id = t1.sort_cd
) AS sort_name ,
t1.lev,
LPAD(' ', 3*(t1.lev-1))||t1.part_no AS LPAD_PART_NO ,
CASE
WHEN
(
t1.lev - lead(t1.lev) over (ORDER BY PATH)
)
<![CDATA[ < ]]>
0
THEN 0
ELSE 1
END AS LEAF,
(SELECT part_mgmt_objid
FROM t1
WHERE lev='1'
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
AND t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1'
) AS BASE_ROOT_OBJID,
(SELECT part_mgmt_objid
FROM t1
WHERE lev='1'
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
AND t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1'
) AS SUB_ROOT_OBJID
FROM t1
WHERE t1.DEL_YN='N'
AND t1.STATUS='complete'
AND t1.is_last='1'
AND t1.PROJECT_MGMT_OBJID = #{projectno}::integer
ORDER BY PATH,
lev,
part_no ) AS TT
</select>
<!-- //Excel을 통해 저장하기 전 PART_BOM_QTY 테이블 초기화 -->
<delete id="deleteStructureInfo" parameterType="map">
DELETE FROM PART_BOM_QTY WHERE BOM_REPORT_OBJID = #{bomObjId}
</delete>
<!-- //partNo를 통해 Part Object ID를 반환한다. -->
<select id="getPartInfoObjIdByPartNo" parameterType="string" resultType="string">
SELECT OBJID
FROM PART_INFO
WHERE 1=1
AND IS_LAST = '1'
AND UPPER(STATUS) = 'COMPLETE'
AND UPPER(PART_NO) = UPPER(#{partNo})
</select>
<!-- **************************************************************************** -->
<!-- 파트정보를 merge 한다. -->
<update id="mergepartInfo" parameterType="map">
INSERT INTO part_mng
(part_mgmt_objid
,part_mgmt_parent_objid
,project_mgmt_objid
,part_name
,part_no
,parent_part_no
,spec_cd
,mfa_cd
,qty
,process_cd
,sort_cd
,sup_cd
,is_last
,reg_date
,reg_user_id
,change_cd
,status
,del_yn
,rel_status
,sized
,material
)
VALUES (
#{PART_MGMT_OBJID}::integer
,#{PART_MGMT_PARENT_OBJID}::integer
,#{PROJECT_MGMT_OBJID}::integer
,#{PART_NAME}
,#{PART_NO}
,#{PARENT_PART_NO}
,#{SPEC_CD}
,#{MFA_CD}
,#{QTY}
,#{PROCESS_CD}
,#{SORT_CD}
,#{SUP_CD}
,'0'
,now()
,#{CONNECTUSERID}
,#{CHANGE_CD}
,'write'
,'N'
,#{REL_STATUS}
,#{SIZED}
,#{MATERIAL}
) ON
CONFLICT (part_mgmt_objid) DO
UPDATE
SET PART_NAME=#{PART_NAME}
,SPEC_CD=#{SPEC_CD}
,MFA_CD=#{MFA_CD}
,QTY=#{QTY}
,PROCESS_CD=#{PROCESS_CD}
,SORT_CD=#{SORT_CD}
,SUP_CD=#{SUP_CD}
,SIZED=#{SIZED}
,MATERIAL=#{MATERIAL}
</update>
<!-- //BOM 구조등록 -->
<!-- <insert id="insertpartInfo" parameterType="map">
INSERT INTO PART_MGMT
(
PART_MGMT_OBJID
,PART_MGMT_PARENT_OBJID
,PROJECT_MGMT_OBJID
,PART_NAME
,PART_NO
,PARENT_PART_NO
,SPEC_CD
,MFA_CD
,QTY
,PROCESS_CD
,SORT_CD
,SUP_CD
,IS_LAST
,REG_DATE
,REG_USER_ID
,CHANGE_CD
,STATUS
,DEL_YN
) VALUES (
#{PART_MGMT_OBJID}
,#{PART_MGMT_PARENT_OBJID}
,#{PROJECT_MGMT_OBJID}
,#{PART_NAME}
,#{PART_NO}
,#{PARENT_PART_NO}
,#{SPEC_CD}
,#{MFA_CD}
,#{QTY}
,#{PROCESS_CD}
,#{SORT_CD}
,#{SUPPLY_CD}
,'0'
,SYSDATE
,#{CONNECTUSERID}
,#{CHANGE_CD}
,'write'
,'N'
)
</insert> -->
<!-- //BOM 파일등록 -->
<insert id="insertpartfileInfo" parameterType="map">
INSERT INTO ATTACH_FILE_INFO
(
OBJID
,TARGET_OBJID
,SAVED_FILE_NAME
,REAL_FILE_NAME
,DOC_TYPE
,DOC_TYPE_NAME
,FILE_SIZE
,FILE_EXT
,FILE_PATH
,WRITER
,REGDATE
,STATUS
) VALUES (
#{OBJID}::integer
,#{TARGET_OBJID}::integer
,#{SAVED_FILE_NAME}
,#{REAL_FILE_NAME}
,#{DOC_TYPE}
,#{DOC_TYPE_NAME}
,#{FILE_SIZE}::integer
,#{FILE_EXT}
,#{FILE_PATH}
,#{WRITER}
,now()
,'Active'
)
</insert>
<insert id="insertpartMngInfo" parameterType="map">
INSERT INTO PART_MNG
(
OBJID
,PART_NO
,PART_NAME
,UNIT
,QTY
,SPEC
,MATERIAL
,SUB_MATERIAL
,WEIGHT
,REMARK
,STATUS
,REG_DATE
,WRITER
,IS_LAST
,PART_TYPE
,PRODUCT_MGMT_OBJID
<!-- ,UPG_NO --> -->
,REVISION
,EXCEL_UPLOAD_SEQ
,PARENT_PART_NO
) VALUES (
#{OBJID}::NUMERIC
,#{PART_NO}
,#{PART_NAME}
,#{UNIT}
,#{QTY}
,#{SPEC}
,#{MATERIAL}
,#{SUB_MATERIAL}
,#{WEIGHT}
,#{REMARK}
,'create'
,now()
,#{CONNECTUSERID}
,'0'
,#{PART_TYPE}
,#{PRODUCT_MGMT_OBJID}
<!-- ,#{UPG_NO} --> -->
,#{REVISION}
<!-- ,CASE WHEN (SELECT COUNT(1) FROM PART_MNG WHERE PART_NO = #{PART_NO}) = 0 then null -->
<!-- WHEN (SELECT COUNT(1) FROM PART_MNG WHERE PART_NO = #{PART_NO}) > 9 then 'R' || (SELECT COUNT(1) FROM PART_MNG WHERE PART_NO = #{PART_NO}) -->
<!-- ELSE 'R0' || (SELECT COUNT(1) FROM PART_MNG WHERE PART_NO = #{PART_NO}) -->
<!-- END -->
,nextval('part_excel_upload_seq')
,COALESCE((SELECT P.OBJID::varchar FROM PART_MNG P WHERE P.PART_NO = #{PARENT_PART_NO} AND P.REVISION = #{PARENT_REVISION}),'')
)
</insert>
<!-- PART 관리 목록 조회 -->
<select id="getPartDetailList" parameterType="map" resultType="map">
SELECT
T.*,
ROW_NUMBER() OVER(ORDER BY REG_DATE DESC) RNUM
FROM(
SELECT
T.*
FROM (
SELECT
P.OBJID,
P.PRODUCT_MGMT_OBJID,
P.UPG_NO,
P.PART_NO,
P.PART_NAME,
P.UNIT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.UNIT) AS UNIT_TITLE,
P.QTY,
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
P.REMARK,
P.ES_SPEC,
P.MS_SPEC,
P.CHANGE_OPTION,
P.DESIGN_APPLY_POINT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE 1=1 AND CODE_ID = P.DESIGN_APPLY_POINT) AS DESIGN_APPLY_POINT_TITLE,
P.MANAGEMENT_FLAG,
P.REVISION,
P.STATUS,
P.REG_DATE,
P.EDIT_DATE,
P.WRITER,
P.IS_LAST,
(SELECT EO_NO FROM EO_MNG AS EO WHERE EO.OBJID::varchar = P.EO) AS EO_NO,
(SELECT TO_CHAR(REG_DATE,'YYYY-MM-DD') FROM EO_MNG AS EO WHERE EO.OBJID::varchar = P.EO) AS EO_DATE,
P.EO,
AF.SAVED_FILE_NAME,
AF.REAL_FILE_NAME,
REPLACE(AF.FILE_PATH, '\', '\\') AS FILE_PATH,
AF_ECD.SAVED_FILE_NAME AS ECD_SAVED_FILE_NAME,
AF_ECD.REAL_FILE_NAME AS ECD_REAL_FILE_NAME,
REPLACE(AF_ECD.FILE_PATH, '\', '\\') AS ECD_FILE_PATH,
CASE
WHEN AF_ECD.SAVED_FILE_NAME IS NOT NULL THEN 'Y'
ELSE 'N'
END ECD_FLAG
FROM
PART_MNG P
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('PART_SHAPE_IMG')
AND UPPER(STATUS) = 'ACTIVE'
) AF
ON P.OBJID::NUMERIC = AF.TARGET_OBJID
LEFT OUTER JOIN
(
SELECT
TARGET_OBJID,
SAVED_FILE_NAME,
REAL_FILE_NAME,
FILE_PATH,
DOC_TYPE
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('ECD_DOC')
AND UPPER(STATUS) = 'ACTIVE'
) AF_ECD
ON P.OBJID::NUMERIC = AF_ECD.TARGET_OBJID
) T
WHERE 1=1
AND PART_NO = #{OBJID}
) T
</select>
</mapper>