Files
wace_plm/src/com/pms/mapper/productionplanning.xml
2025-11-27 18:39:18 +09:00

4299 lines
147 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="productionplanning">
<!-- 생산관리 -> 현황 -->
<select id="planningdashboardGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
(SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release' ) AS ISSUE_CNT
,(SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release'
AND O.DESIGN_RESULT !='' AND O.DESIGN_DATE !='') AS COMP_CNT
,(SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release' ) - (SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release'
AND O.DESIGN_RESULT !='' AND O.DESIGN_DATE !='') AS MISS_CNT
,CASE WHEN (SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release' ) = 0
THEN 0
ELSE ROUND(((SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release'
AND O.DESIGN_RESULT !='' AND O.DESIGN_DATE !='')::float / (SELECT COUNT(1) FROM PLANNING_ISSUE AS O WHERE O.PROJECT_OBJID = T.OBJID AND O.status='release' )::FLOAT * 100)::numeric, 1)
END AS issue_rate
,CASE WHEN (SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '')) = '0' then '0'
ELSE ROUND((((SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID and (O.SETUP_ACT_END !='' AND O.SETUP_ACT_END IS not null) AND (PARENT_OBJID IS NOT NULL AND PARENT_OBJID != ''))::FLOAT
/ (SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL AND PARENT_OBJID != ''))) * 100)::integer, 1)
END SETUP_RATE
,(SELECT MAX(SETUP_ACT_END) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL OR PARENT_OBJID != '')) AS SETUP_ACT_END
<!-- ,(SELECT coalesce(SUM(COALESCE(EMPLOYEES_IN,'0')::integer+COALESCE(EMPLOYEES_OUT,'0')::integer),'0') FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL OR PARENT_OBJID != '')) AS EMPLOYEES_TOTAL -->
,Q.ASSEMBLY_DATE_END
<!-- ,Q.ASSEMBLY_EMPLOYEES_TOTAL
,R.ASSEMBLY_RATE
-->
,ROUND((AS_RATE_SUM / (SELECT COUNT(1) FROM PMS_WBS_TASK W WHERE W.CONTRACT_OBJID = T.OBJID) ),1) AS ASSEMBLY_RATE
,OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
,coalesce(P.WORK_HOUR , '0') as PRODUCTION_INPUT /*조립생산*/
,coalesce(O.WORK_HOUR , '0') as OUTSOURCING /*조립외주*/
,coalesce(P.WORK_HOUR , '0')::numeric + coalesce(O.WORK_HOUR , '0')::numeric as ASSEMBLY_EMPLOYEES_TOTAL
,coalesce(SP.WORK_HOUR , '0') as S_PRODUCTION_INPUT /*셋업생산*/
,coalesce(SO.WORK_HOUR , '0') as S_OUTSOURCING /*셋업외주*/
,coalesce(SP.WORK_HOUR , '0')::numeric + coalesce(SO.WORK_HOUR , '0')::numeric as EMPLOYEES_TOTAL
FROM
PROJECT_MGMT AS T
LEFT OUTER JOIN
(SELECT
P.CONTRACT_OBJID,
MAX(ASSEMBLY_DATE) as ASSEMBLY_DATE_END
<!-- SUM(CASE WHEN INSOURCING='' AND INSOURCING IS NOT NULL THEN '0' ELSE INSOURCING END ::INTEGER)+SUM(CASE WHEN OUTSOURCING='' AND OUTSOURCING IS NOT NULL THEN '0' ELSE OUTSOURCING END ::INTEGER) as ASSEMBLY_EMPLOYEES_TOTAL -->
FROM
(SELECT
A.* ,
T.CONTRACT_OBJID
FROM
ASSEMBLY_WBS_TASK A
LEFT OUTER JOIN PART_BOM_REPORT T
ON A.PARENT_OBJID = T.OBJID) AS P
GROUP BY CONTRACT_OBJID) Q
ON Q.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID,
SUM(AS_RATE) AS_RATE_SUM
FROM
(SELECT
OBJID
,CONTRACT_OBJID
,CASE WHEN (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '') = 0 THEN 0
ELSE ROUND((((SELECT count(1) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!=''
)::numeric / (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '')) * 100), 1)
END AS AS_RATE
<!--, CASE WHEN (SELECT SUM(CASE WHEN RECEIVE_QTY='' AND RECEIVE_QTY IS NOT NULL THEN '0' ELSE RECEIVE_QTY END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) = 0
THEN 0
ELSE
ROUND(((SELECT SUM(CASE WHEN RECEIVE_QTY='' AND RECEIVE_QTY IS NOT NULL THEN '0' ELSE RECEIVE_QTY END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID
AND ASSEMBLY_USER_ID IS NOT NULL AND ASSEMBLY_USER_ID !='' AND ASSEMBLY_DATE IS NOT NULL AND ASSEMBLY_DATE!='' AND (INSOURCING IS NOT NULL OR INSOURCING!='')
AND (OUTSOURCING IS NOT NULL OR OUTSOURCING!='')
)::NUMERIC / (SELECT SUM(CASE WHEN RECEIVE_QTY='' AND RECEIVE_QTY IS NOT NULL THEN '0' ELSE RECEIVE_QTY END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) * 100),1)
END AS AS_RATE -->
FROM
PART_BOM_REPORT AS T) P
GROUP BY CONTRACT_OBJID) R
ON R.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN /*조립생산*/
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
AND PRODUCTION_TYPE = 'assemble'
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS P
ON P.CONTRACT_OBJID = T.OBJID /*조립외주*/
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND SOURCING_TYPE = 'outsourcing'
AND PRODUCTION_TYPE = 'assemble'
GROUP BY CONTRACT_OBJID ) AS O
ON O.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN /*셋업생산*/
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
AND PRODUCTION_TYPE = 'setup'
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS SP
ON SP.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN /*셋업외주*/
(SELECT
CONTRACT_OBJID
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND SOURCING_TYPE = 'outsourcing'
AND PRODUCTION_TYPE = 'setup'
GROUP BY CONTRACT_OBJID ) AS SO
ON SO.CONTRACT_OBJID = T.OBJID
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="category_cd !=null and category_cd != '' ">
AND category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND product = #{product}
</if>
<if test="status_cd !=null and status_cd !=''">
AND status_cd = #{status_cd}
</if>
<if test="result_cd !=null and result_cd !=''">
AND result_cd = #{result_cd}
</if>
<if test="contract_start_date != null and !''.equals(contract_start_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{contract_start_date}, 'YYYY-MM-DD')
</if>
<if test="contract_end_date != null and !''.equals(contract_end_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{contract_end_date}, 'YYYY-MM-DD')
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND pm_user_id = #{pm_user_id}
</if>
<if test="location != null and !''.equals(location)">
AND UPPER(LOCATION) LIKE UPPER('%${location}%')
</if>
<if test="setup != null and !''.equals(setup)">
AND UPPER(SETUP) LIKE UPPER('%${setup}%')
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<!-- 생산관리 -> 생산계획수립 -->
<select id="planningGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
,(SELECT COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (O.PRODUCE_PLAN_START !='' OR O.PRODUCE_PLAN_END !=''
OR O.PRODUCE_ACT_START!='' OR O.PRODUCE_ACT_END !='' OR O.PRODUCE_USER_ID !='' )) AS WBS_CNT
,(SELECT MIN(PRODUCE_PLAN_START) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.PRODUCE_PLAN_START !='') AS PRODUCE_PLAN_START
,(SELECT MAX(PRODUCE_PLAN_END) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.PRODUCE_PLAN_END !='') AS PRODUCE_PLAN_END
,(SELECT MIN(PRODUCE_ACT_START) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.PRODUCE_ACT_START!='') AS PRODUCE_ACT_START
,(SELECT MAX(PRODUCE_ACT_END) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.PRODUCE_ACT_END !='' ) AS PRODUCE_ACT_END
,(SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (O.SETUP_PLAN_START !='' OR O.SETUP_PLAN_END !=''
OR O.SETUP_ACT_START!='' OR O.SETUP_ACT_END !='')) AS SETUP_WBS_CNT
,(SELECT MIN(SETUP_PLAN_START) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.SETUP_PLAN_START !='') AS SETUP_PLAN_START
,(SELECT MAX(SETUP_PLAN_END) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.SETUP_PLAN_END !='') AS SETUP_PLAN_END
,(SELECT MIN(SETUP_ACT_START) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.SETUP_ACT_START!='') AS SETUP_ACT_START
,(SELECT MAX(SETUP_ACT_END) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND O.SETUP_ACT_END !='' ) AS SETUP_ACT_END
FROM PROJECT_MGMT AS T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="category_cd !=null and category_cd != '' ">
AND category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND product = #{product}
</if>
<if test="status_cd !=null and status_cd !=''">
AND status_cd = #{status_cd}
</if>
<if test="result_cd !=null and result_cd !=''">
AND result_cd = #{result_cd}
</if>
<if test="contract_start_date != null and !''.equals(contract_start_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{contract_start_date}, 'YYYY-MM-DD')
</if>
<if test="contract_end_date != null and !''.equals(contract_end_date)">
AND TO_DATE(DUE_DATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{contract_end_date}, 'YYYY-MM-DD')
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND pm_user_id = #{pm_user_id}
</if>
<if test="location != null and !''.equals(location)">
AND UPPER(LOCATION) LIKE UPPER('%${location}%')
</if>
<if test="setup != null and !''.equals(setup)">
AND UPPER(SETUP) LIKE UPPER('%${setup}%')
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<!-- 생산관리 -> 공정실적관리 -->
<select id="processperformanceGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
<!-- ROW_NUMBER() OVER(ORDER BY REGDATE DESC) AS NUM, -->
OBJID,
CUSTOMER_OBJID,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = T.CUSTOMER_OBJID) AS CUSTOMER_NAME,
T.CONTRACT_OBJID,
(SELECT CUSTOMER_PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME,
(SELECT PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NAME,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
(SELECT MECHANICAL_TYPE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS MECHANICAL_TYPE,
(SELECT DUE_DATE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS DUE_DATE,
(SELECT SETUP FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SETUP,
(SELECT USER_NAME(PM_USER_ID) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PM_USER_NAME,
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_NAME,
T.UNIT_CODE,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_NAME,
STATUS,
CASE UPPER(STATUS)
WHEN 'CREATE' THEN '등록중'
WHEN 'CHANGEDESIGN' THEN '설계변경미배포'
WHEN 'DEPLOY' THEN '배포완료'
ELSE ''
END STATUS_TITLE,
WRITER,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WRITER) AS DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = WRITER) AS USER_NAME,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WRITER) || '/' || (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = WRITER) as DEPT_USER_NAME,
REGDATE AS REGDATE,
TO_CHAR(REGDATE, 'YYYY-MM-DD') AS REG_DATE,
DEPLOY_DATE,
REVISION,
(SELECT MAX(PM.EO_NO) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_NO,
(SELECT MAX(PM.EO_DATE) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_DATE,
NOTE,
(SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON COALESCE(NULLIF(BP.LAST_PART_OBJID, ''), BP.PART_NO) = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID = T.OBJID AND PM.part_type is not null AND PM.part_type != '' AND BP.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')) AS BOM_CNT,
(SELECT count(1) FROM ASSEMBLY_WBS_TASK AS A
INNER JOIN BOM_PART_QTY AS BP
ON A.PARENT_OBJID = BP.BOM_REPORT_OBJID
AND A.PART_OBJID = COALESCE(NULLIF(BP.LAST_PART_OBJID, ''), BP.PART_NO)
AND A.BOM_QTY_CHILD_OBJID = BP.CHILD_OBJID
AND BP.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')
WHERE A.PARENT_OBJID = T.OBJID AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!='' ) as ASSING_CNT,
CASE WHEN (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON COALESCE(NULLIF(BP.LAST_PART_OBJID, ''), BP.PART_NO) = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '' AND BP.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')) = 0 THEN 0
ELSE ROUND((((SELECT count(1) FROM ASSEMBLY_WBS_TASK AS A
INNER JOIN BOM_PART_QTY AS BP
ON A.PARENT_OBJID = BP.BOM_REPORT_OBJID
AND A.PART_OBJID = COALESCE(NULLIF(BP.LAST_PART_OBJID, ''), BP.PART_NO)
AND A.BOM_QTY_CHILD_OBJID = BP.CHILD_OBJID
AND BP.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')
WHERE A.PARENT_OBJID = T.OBJID AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!=''
)::numeric / (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON COALESCE(NULLIF(BP.LAST_PART_OBJID, ''), BP.PART_NO) = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '' AND BP.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy'))) * 100), 1)
END AS AS_RATE ,
coalesce(P.WORK_HOUR , '0') as INSOURCING_SUM,
coalesce(O.WORK_HOUR , '0') as OUTSOURCING_SUM,
coalesce(P.WORK_HOUR , '0')::numeric + coalesce(O.WORK_HOUR , '0')::numeric as TOTAL_SUM
<!-- (SELECT COUNT(*) FROM BOM_PART_QTY AS A WHERE A.BOM_REPORT_OBJID = T.OBJID) AS BOM_CNT -->
<!-- ,(SELECT SUM(CASE WHEN INSOURCING='' AND INSOURCING IS NOT NULL THEN '0' ELSE INSOURCING END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) +
(SELECT SUM(CASE WHEN OUTSOURCING='' AND OUTSOURCING IS NOT NULL THEN '0' ELSE OUTSOURCING END ::integer) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) AS TOTAL_SUM
,(SELECT SUM(CASE WHEN INSOURCING='' AND INSOURCING IS NOT NULL THEN '0' ELSE INSOURCING END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) AS INSOURCING_SUM
,(SELECT SUM(CASE WHEN OUTSOURCING='' AND OUTSOURCING IS NOT NULL THEN '0' ELSE OUTSOURCING END ::integer) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) AS OUTSOURCING_SUM -->
<!-- ,(SELECT SUM(CASE WHEN receive_qty='' AND receive_qty IS NOT NULL THEN '0' ELSE receive_qty END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) AS ASS_CNT -->
<!-- ,(SELECT SUM(CASE WHEN receive_qty='' AND receive_qty IS NOT NULL THEN '0' ELSE receive_qty END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID
AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!='' AND (insourcing IS NOT NULL OR insourcing!='')
AND (outsourcing IS NOT NULL OR outsourcing!='')
) AS ASSING_CNT
,CASE WHEN (SELECT SUM(CASE WHEN receive_qty='' AND receive_qty IS NOT NULL THEN '0' ELSE receive_qty END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) = 0
THEN 0
ELSE
ROUND(((SELECT SUM(CASE WHEN receive_qty='' AND receive_qty IS NOT NULL THEN '0' ELSE receive_qty END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID
AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!='' AND (insourcing IS NOT NULL OR insourcing!='')
AND (outsourcing IS NOT NULL OR outsourcing!='')
)::numeric / (SELECT SUM(CASE WHEN receive_qty='' AND receive_qty IS NOT NULL THEN '0' ELSE receive_qty END ::INTEGER) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID) * 100),1)
END AS AS_RATE -->
FROM
PART_BOM_REPORT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
AND PRODUCTION_TYPE = 'assemble'
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS P
ON P.UNIT_CODE = T.UNIT_CODE
AND P.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID ,
UNIT_CODE ,
SUM(WORK_HOUR::numeric) as WORK_HOUR
FROM
WORK_DIARY WD
WHERE
WD.CONTRACT_OBJID != ''
AND WD.CONTRACT_OBJID IS NOT NULL
AND STATUS = 'complete'
AND PRODUCTION_TYPE = 'assemble'
AND SOURCING_TYPE = 'outsourcing'
GROUP BY CONTRACT_OBJID, UNIT_CODE ) AS O
ON O.UNIT_CODE = T.UNIT_CODE
AND O.CONTRACT_OBJID = T.CONTRACT_OBJID
WHERE 1=1
AND T.STATUS = 'deploy'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND T.CONTRACT_OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND T.CONTRACT_OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<if test="category_cd !=null and category_cd != '' ">
AND T.category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND T.CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND (SELECT PRODUCT FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) = #{product}
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND (SELECT PM_USER_ID FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) = #{pm_user_id}
</if>
ORDER BY REGDATE DESC
</select>
<!-- //이슈 목록 조회 -->
<select id="getIssueList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT *
FROM (
SELECT PMS_ISSUE_INFO.*,ROW_NUMBER() OVER (ORDER BY REGDATE DESC) AS RNUM
FROM(
SELECT PMS_ISSUE_INFO.*
FROM(
SELECT A.OBJID
, A.REGION
, A.OEM_OBJID
, (SELECT OEM_NAME FROM OEM_MNG WHERE OBJID = A.OEM_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
, A.PROD_GROUP_OBJID
, (SELECT PRODUCT_GROUP_NAME FROM PRODUCT_GROUP_MNG WHERE OBJID = A.PROD_GROUP_OBJID) AS PROD_GROUP_NAME
, A.PROD_OBJID
, (SELECT PRODUCT_NAME FROM PRODUCT_MNG WHERE OBJID = A.PROD_OBJID) AS PROD_NAME
, A.SUBJECT
, A.ISSUE_CONTENTS
, A.ISSUE_RESULT_CONTENTS
, A.PIC_DEPT
, TO_CHAR(A.COMPLETE_PLAN_DATE, 'YYYY-MM-DD') AS COMPLETE_PLAN_DATE
, TO_CHAR(A.COMPLETE_DATE, 'YYYY-MM-DD') AS COMPLETE_DATE
, 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
, DECODE(COMPLETE_DATE, NULL, '진행중', '완료') AS STATUS
, (SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = A.OBJID AND DOC_TYPE='ISSUE_ATTACH' AND UPPER(STATUS) = 'ACTIVE') AS ISSUE_FILE_CNT
FROM PMS_ISSUE_INFO A
WHERE 1=1
<if test="search_region != null and search_region !='' ">
AND A.REGION = #{search_region}
</if>
<if test="search_carType != null and search_carType != '' ">
AND A.CAR_OBJID = #{search_carType}
</if>
<if test="search_productType != null and search_productType !=''">
AND A.PROD_OBJID = #{search_productType}
</if>
) PMS_ISSUE_INFO
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_fromDate != null and search_fromDate != ''">
AND TO_DATE(REGDATE,'YYYY-MM-DD') <![CDATA[ >= ]]> TO_DATE(#{search_fromDate}, 'YYYY-MM-DD')
</if>
<if test="search_toDate != null and search_toDate != ''">
AND TO_DATE(REGDATE,'YYYY-MM-DD') <![CDATA[ <= ]]> TO_DATE(#{search_toDate}, 'YYYY-MM-DD')
</if>
<if test="search_status !=null and search_status !=''">
AND UPPER(STATUS) = UPPER(#{search_status})
</if>
<if test="search_writer != null and !''.equals(search_writer)">
AND UPPER(WRITER_USER_NAME) LIKE UPPER('%${search_writer}%')
</if>
<if test="search_dept != null and !''.equals(search_dept)">
AND UPPER(WRITER_DEPT_NAME) LIKE UPPER('%${search_dept}%')
</if>
<if test="search_pic_dept != null and !''.equals(search_pic_dept)">
AND UPPER(PIC_DEPT) LIKE UPPER('%${search_pic_dept}%')
</if>
)PMS_ISSUE_INFO
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>
<select id="selectPlanningIssueList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
ISSUE_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.PROJECT_OBJID) AS PROJECT_NO,
PROJECT_OBJID,
UNIT_CODE,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM pms_wbs_task AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_CODE_NAME,
PART_OBJID,
(SELECT PART_NO FROM PART_MNG AS O WHERE O.OBJID = T.PART_OBJID) AS PART_NO,
(SELECT PART_NAME FROM PART_MNG AS O WHERE O.OBJID = T.PART_OBJID) AS PART_NAME,
ISSUE_CATEGORY,
CODE_NAME(ISSUE_CATEGORY) AS ISSUE_CATEGORY_NAME,
ISSUE_TYPE,
CODE_NAME(ISSUE_TYPE) AS ISSUE_TYPE_NAME,
CONTENT,
DESIGN_USERID,
USER_NAME(DESIGN_USERID) AS DESIGN_USERID_NAME,
CODE_NAME(DESIGN_RESULT) AS DESIGN_RESULT_NAME,
DESIGN_RESULT,
DESIGN_DATE,
PURCHASE_USERID,
USER_NAME(PURCHASE_USERID) AS PURCHASE_USERID_NAME,
PURCHASE_RESULT,
CODE_NAME(PURCHASE_RESULT) AS PURCHASE_RESULT_NAME,
PURCHASE_DATE,
QUALITY_USERID,
USER_NAME(QUALITY_USERID) AS QUALITY_USERID_NAME,
CODE_NAME(QUALITY_RESULT) AS QUALITY_RESULT_NAME,
QUALITY_RESULT,
QUALITY_DATE,
PRODUCTION_USERID,
USER_NAME(PRODUCTION_USERID) AS PRODUCTION_USERID_NAME,
CODE_NAME(PRODUCTION_RESULT) AS PRODUCTION_RESULT_NAME,
PRODUCTION_RESULT,
PRODUCTION_DATE,
REG_DATE,
WRITER,
USER_NAME(WRITER) AS WRITER_NAME,
TO_CHAR(REG_DATE,'YYYY-MM-DD') AS REG_DATE_TEXT,
CASE WHEN STATUS ='write' THEN '등록'
WHEN STATUS = 'release' AND
(
((DESIGN_USERID IS NOT NULL AND DESIGN_USERID != '') AND DESIGN_DATE != '') OR
((DESIGN_USERID IS NULL OR DESIGN_USERID = '') AND DESIGN_DATE = '')
) AND
(
((PURCHASE_USERID IS NOT NULL AND PURCHASE_USERID != '') AND PURCHASE_DATE != '') OR
((PURCHASE_USERID IS NULL OR PURCHASE_USERID = '') AND PURCHASE_DATE = '')
) AND
(
((QUALITY_USERID IS NOT NULL AND QUALITY_USERID != '') AND QUALITY_DATE != '') OR
((QUALITY_USERID IS NULL OR QUALITY_USERID = '') AND QUALITY_DATE = '')
) AND
(
((PRODUCTION_USERID IS NOT NULL AND PRODUCTION_USERID != '') AND PRODUCTION_DATE != '') OR
((PRODUCTION_USERID IS NULL OR PRODUCTION_USERID = '') AND PRODUCTION_DATE = '')
) AND
(
(DESIGN_USERID IS NOT NULL AND DESIGN_USERID != '') OR
(PURCHASE_USERID IS NOT NULL AND PURCHASE_USERID != '') OR
(QUALITY_USERID IS NOT NULL AND QUALITY_USERID != '') OR
(PRODUCTION_USERID IS NOT NULL AND PRODUCTION_USERID != '')
)
THEN '조치완료'
WHEN STATUS = 'release' AND
(
(DESIGN_USERID IS NOT NULL AND DESIGN_USERID != '') OR
(PURCHASE_USERID IS NOT NULL AND PURCHASE_USERID != '') OR
(QUALITY_USERID IS NOT NULL AND QUALITY_USERID != '') OR
(PRODUCTION_USERID IS NOT NULL AND PRODUCTION_USERID != '') OR
DESIGN_DATE != '' OR PURCHASE_DATE != '' OR
QUALITY_DATE != '' OR PRODUCTION_DATE != ''
)
THEN '조치중'
<!-- WHEN STATUS = 'release' AND DESIGN_RESULT != '' AND DESIGN_DATE != '' AND
PURCHASE_RESULT != '' AND PURCHASE_DATE != '' AND
QUALITY_RESULT != '' AND QUALITY_DATE != '' AND
PRODUCTION_RESULT != '' AND PRODUCTION_DATE != '' AND
(DESIGN_USERID IS NOT NULL OR PURCHASE_USERID IS NOT NULL OR
QUALITY_USERID IS NOT NULL OR PRODUCTION_USERID IS NOT NULL) THEN '조치완료' -->
<!-- WHEN STATUS ='release' AND DESIGN_RESULT !='' AND DESIGN_DATE !=''
THEN '조치완료' -->
ELSE
CASE WHEN STATUS ='release' AND to_date(TO_CHAR(REG_DATE,'yyyy-mm-dd'),'yyyy-mm-dd') <![CDATA[ > ]]> to_date(TO_CHAR(REG_DATE,'yyyy-mm-dd'),'yyyy-mm-dd')+5 AND DESIGN_DATE =''
THEN '미조치'
ELSE '배포' END
END AS STATUS_NAME,
STATUS
FROM PLANNING_ISSUE AS T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REG_DATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND PROJECT_OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND PROJECT_OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND UNIT_CODE = #{unit_code}
</if>
<if test="issue_category !=null and issue_category != '' ">
AND ISSUE_CATEGORY = #{issue_category}
</if>
<if test="issue_type !=null and issue_type != '' ">
AND ISSUE_TYPE = #{issue_type}
</if>
<if test="writer !=null and writer != '' ">
AND WRITER = #{writer}
</if>
<if test="design_userid !=null and design_userid != '' ">
AND DESIGN_USERID = #{design_userid}
</if>
<if test="design_result !=null and design_result != '' ">
AND DESIGN_RESULT = #{design_result}
</if>
<if test="search_status !=null and search_status != '' ">
<if test="search_status == 'write'">
AND STATUS = 'write'
</if>
<!-- Check if search_status is 'complete' -->
<if test="search_status == 'complete'">
AND STATUS = 'release'
AND DESIGN_RESULT != ''
AND DESIGN_DATE != ''
AND DESIGN_USERID !=''
</if>
<!-- Check if search_status is 'late' -->
<if test="search_status == 'late'">
AND STATUS = 'release'
AND TO_DATE(TO_CHAR(REG_DATE, 'yyyy-mm-dd'), 'yyyy-mm-dd') <![CDATA[ > ]]>
TO_DATE(TO_CHAR(REG_DATE, 'yyyy-mm-dd'), 'yyyy-mm-dd') + 5
AND DESIGN_DATE = ''
</if>
<!-- Check if search_status is 'release' -->
<if test="search_status == 'release'">
AND STATUS = 'release'
AND (DESIGN_DATE = '' OR DESIGN_USERID = '' OR DESIGN_RESULT ='')
</if>
</if>
<if test="status !=null and status != '' ">
<if test="status == 'all'">
AND STATUS != 'write'
</if>
<if test="status == 'complete'">
AND STATUS = 'release'
AND DESIGN_RESULT != ''
AND DESIGN_DATE != ''
AND DESIGN_USERID !=''
</if>
<if test="status == 'late'">
AND STATUS = 'release'
AND (DESIGN_DATE = '' OR DESIGN_USERID = '' OR DESIGN_RESULT ='')
</if>
</if>
ORDER BY ISSUE_NO DESC
</select>
<select id="selectPlanningIssueInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
ISSUE_NO,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.PROJECT_OBJID) AS PROJECT_NO,
PROJECT_OBJID,
UNIT_CODE,
(SELECT TASK_NAME FROM pms_wbs_task_standard AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_CODE_NAME,
PART_OBJID,
(SELECT PART_NO FROM PART_MNG AS O WHERE O.OBJID = T.PART_OBJID) AS PART_NO,
(SELECT PART_NAME FROM PART_MNG AS O WHERE O.OBJID = T.PART_OBJID) AS PART_NAME,
ISSUE_CATEGORY,
CODE_NAME(ISSUE_CATEGORY) AS ISSUE_CATEGORY_NAME,
ISSUE_TYPE,
CODE_NAME(ISSUE_TYPE) AS ISSUE_TYPE_NAME,
CONTENT,
DESIGN_USERID,
USER_NAME(DESIGN_USERID) AS DESIGN_USERID_NAME,
CODE_NAME(DESIGN_RESULT) AS DESIGN_RESULT_NAME,
DESIGN_RESULT,
DESIGN_DATE,
PURCHASE_USERID,
USER_NAME(PURCHASE_USERID) AS PURCHASE_USERID_NAME,
PURCHASE_RESULT,
CODE_NAME(PURCHASE_RESULT) AS PURCHASE_RESULT_NAME,
PURCHASE_DATE,
QUALITY_USERID,
USER_NAME(QUALITY_USERID) AS QUALITY_USERID_NAME,
CODE_NAME(QUALITY_RESULT) AS QUALITY_RESULT_NAME,
QUALITY_RESULT,
QUALITY_DATE,
PRODUCTION_USERID,
USER_NAME(PRODUCTION_USERID) AS PRODUCTION_USERID_NAME,
CODE_NAME(PRODUCTION_RESULT) AS PRODUCTION_RESULT_NAME,
PRODUCTION_RESULT,
PRODUCTION_DATE,
REG_DATE,
WRITER,
USER_NAME(WRITER) AS WRITER_NAME,
TO_CHAR(REG_DATE,'YYYY-MM-DD') AS REG_DATE_TEXT,
STATUS
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = T.OBJID AND DOC_TYPE='ISSUE01' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT1
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = T.OBJID AND DOC_TYPE='ISSUE02' AND UPPER(STATUS) = 'ACTIVE') AS FILE_CNT2
,(SELECT SUM(FILE_SIZE) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = T.OBJID AND DOC_TYPE='ISSUE01' AND UPPER(STATUS) = 'ACTIVE') AS FILE_SIZE1
,(SELECT SUM(FILE_SIZE) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = T.OBJID AND DOC_TYPE='ISSUE02' AND UPPER(STATUS) = 'ACTIVE') AS FILE_SIZE2
FROM PLANNING_ISSUE AS T
WHERE T.OBJID = #{objId}
</select>
<select id="selectAssemblyDate" parameterType="map" resultType="com.pms.common.UpperKeyMap">
<!-- 2024.04.18 조립공정율 추가 -->
SELECT
OBJID,
T.CONTRACT_OBJID,
(SELECT PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NAME,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
(SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID = T.OBJID AND PM.part_type is not null AND PM.part_type != '') AS BOM_CNT,
(SELECT count(1) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!='' ) as ASSING_CNT,
CASE WHEN (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '') = 0 THEN '0'
ELSE ROUND((((SELECT count(1) FROM ASSEMBLY_WBS_TASK AS A WHERE A.PARENT_OBJID = T.OBJID AND assembly_user_id IS NOT NULL AND assembly_user_id !='' AND assembly_date IS NOT NULL AND assembly_date!=''
)::numeric / (SELECT COUNT(*) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR where BP.BOM_REPORT_OBJID = T.OBJID and PM.part_type is not null and PM.part_type != '')) * 100), 0)::varchar
END AS AS_RATE ,
AWT.PARENT_OBJID,
AWT.PRODUCE_ACT_START,
AWT.PRODUCE_ACT_END
FROM
PART_BOM_REPORT AS T
LEFT OUTER JOIN (
SELECT
PARENT_OBJID
,MIN(NVL(ASSEMBLY_DATE,'9999')) as PRODUCE_ACT_START
,MAX(ASSEMBLY_DATE) as PRODUCE_ACT_END
FROM
ASSEMBLY_WBS_TASK
GROUP BY PARENT_OBJID
) AWT on AWT.PARENT_OBJID = T.OBJID
WHERE 1=1
AND PARENT_OBJID = #{PARENT_OBJID}
ORDER BY REGDATE DESC
<!--
SELECT
PARENT_OBJID
,MIN(NVL(ASSEMBLY_DATE,'9999')) as PRODUCE_ACT_START
,MAX(ASSEMBLY_DATE) as PRODUCE_ACT_END
FROM
ASSEMBLY_WBS_TASK
WHERE PARENT_OBJID = #{PARENT_OBJID}
GROUP BY PARENT_OBJID -->
</select>
<!-- //이슈 등록 및 수정 -->
<update id="mergeissueInfo" parameterType="map">
INSERT INTO PLANNING_ISSUE
(
OBJID
,ISSUE_NO
,PROJECT_OBJID
,UNIT_CODE
,PART_OBJID
,ISSUE_CATEGORY
,ISSUE_TYPE
,CONTENT
,DESIGN_USERID
,DESIGN_RESULT
,DESIGN_DATE
,PURCHASE_USERID
,PURCHASE_RESULT
,PURCHASE_DATE
,QUALITY_USERID
,QUALITY_RESULT
,QUALITY_DATE
,PRODUCTION_USERID
,PRODUCTION_RESULT
,PRODUCTION_DATE
,REG_DATE
,WRITER
,STATUS
)
VALUES
(
#{objId}
,(SELECT 'ISSUE' || to_char(now(),'YY')||'-'||LPAD((SELECT CASE WHEN MAX(SUBSTR(ISSUE_NO,9,3)) IS NULL THEN 1 ELSE MAX(SUBSTR(ISSUE_NO,9,3))::INTEGER+1 END FROM PLANNING_ISSUE)::VARCHAR,3,'0'))
,#{project_objid}
,#{unit_code}
,#{part_objid}
,#{issue_category}
,#{issue_type}
,#{content}
,#{design_userid}
,#{design_result}
,#{design_date}
,#{purchase_userid}
,#{purchase_result}
,#{purchase_date}
,#{quality_userid}
,#{quality_result}
,#{quality_date}
,#{production_userid}
,#{production_result}
,#{production_date}
,now()
,#{writer}
,'write'
)
ON CONFLICT (OBJID) DO
UPDATE
SET
PROJECT_OBJID=#{project_objid}
,UNIT_CODE=#{unit_code}
,PART_OBJID=#{part_objid}
,ISSUE_CATEGORY=#{issue_category}
,ISSUE_TYPE=#{issue_type}
,CONTENT=#{content}
,DESIGN_USERID=#{design_userid}
,DESIGN_RESULT=#{design_result}
,DESIGN_DATE=#{design_date}
,PURCHASE_USERID=#{purchase_userid}
,PURCHASE_RESULT=#{purchase_result}
,PURCHASE_DATE=#{purchase_date}
,QUALITY_USERID=#{quality_userid}
,QUALITY_RESULT=#{quality_result}
,QUALITY_DATE=#{quality_date}
,PRODUCTION_USERID=#{production_userid}
,PRODUCTION_RESULT=#{production_result}
,PRODUCTION_DATE=#{production_date}
</update>
<!-- 이슈 삭제 -->
<delete id="planningDelete" parameterType="map">
DELETE FROM PLANNING_ISSUE WHERE OBJID = #{OBJID}
</delete>
<update id="planningrelease" parameterType="map">
UPDATE PLANNING_ISSUE SET
STATUS='release'
WHERE OBJID = #{OBJID}
</update>
<!-- 생산관리 -> 출고관리-->
<select id="releaseMgmtGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
CM.*
,RM.OBJID AS RELEASE_OBJID
,RM.PARENT_OBJID
,RM.RELEASE_CAR_NO
,RM.RELEASE_DATE
,RM.TASK_OVER_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = RM.TASK_OVER_USER_ID) AS TASK_OVER_USER_NAME
,RM.TASK_OVER_DATE
,RM.TASK_OVER_COMMENT
,RM.REGDATE AS RELEASE_REGDATE
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = RM.WRITER) AS RELEASE_WRITER
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = RM.OBJID AND DOC_TYPE='RELEASE_CHECK' AND UPPER(STATUS) = 'ACTIVE') AS RELEASE_CHECK_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = RM.OBJID AND DOC_TYPE='RELEASE_ORDER' AND UPPER(STATUS) = 'ACTIVE') AS RELEASE_ORDER_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID::VARCHAR = RM.OBJID AND DOC_TYPE='RELEASE_TAKING_OVER' AND UPPER(STATUS) = 'ACTIVE') AS RELEASE_TAKING_OVER_CNT
,CASE
WHEN (COALESCE(TRIM(RM.RELEASE_DATE),'') !='') THEN '출고완료'
WHEN TO_CHAR(NOW(),'YYYYMMDD') <![CDATA[ <= ]]> TO_CHAR(TO_DATE(CM.CONTRACT_COST_RESULT_DATE,'YYYY-MM-DD'),'YYYYMMDD') THEN '취소'
WHEN (COALESCE(TRIM(CM.CONTRACT_COST_RESULT_DATE),'') !='') THEN '수주'
WHEN TO_CHAR(NOW(),'YYYYMMDD') >= TO_CHAR(TO_DATE(CM.DUE_DATE,'YYYY-MM-DD'),'YYYYMMDD') THEN '지연'
ELSE '계약'
END RELEASE_STATUS_TITLE
,RM.INSTALL_COMPLETE_DATE
,RM.INSTALL_RESULT
,(SELECT COUNT(1) FROM INSPECTION_MGMT AS O WHERE O.PARENT_OBJID = CM.OBJID) AS INSPECTION_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = CM.OBJID AND DOC_TYPE='ADMISSION_INSPECTION_FILE' AND UPPER(STATUS) = 'ACTIVE') AS ADMISSION_INSPECTION_CNT
FROM
<include refid="fundMgmt.fundMgmtBase"/> CM
LEFT OUTER JOIN
RELEASE_MGMT RM
ON CM.OBJID::VARCHAR = RM.PARENT_OBJID
<!-- AND CM.PRODUCT_GROUP = RM.PRODUCT_GROUP -->
AND CM.PRODUCT = RM.PRODUCT
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(CM.REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND CM.OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND CM.OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="category_cd !=null and category_cd != '' ">
AND CM.category_cd = #{category_cd}
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CM.CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product != null and product !='' ">
AND CM.PRODUCT = #{product}
<!-- AND (SELECT PRODUCT FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) = #{product} -->
</if>
<if test="pm_user_id !=null and pm_user_id !=''">
AND CM.PM_USER_ID = #{pm_user_id}
<!-- AND (SELECT PM_USER_ID FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) = #{pm_user_id} -->
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<select id="selectSetupMgmtList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.*
,CASE WHEN TASK_CNT = '0' THEN '0'
ELSE ((COMPLETE_CNT::FLOAT / TASK_CNT) * 100)::integer
END SETUP_RATE
FROM
(SELECT
(SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '')) AS TASK_CNT
,(SELECT COUNT(1) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID and (O.SETUP_ACT_END !='' AND O.SETUP_ACT_END IS not null) AND (PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '')) AS COMPLETE_CNT
,(SELECT SUM(COALESCE(EMPLOYEES_IN,'0')::integer) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL OR PARENT_OBJID != '')) AS EMPLOYEES_IN
,(SELECT SUM(COALESCE(EMPLOYEES_OUT,'0')::integer) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID AND (PARENT_OBJID IS NOT NULL OR PARENT_OBJID != '')) AS EMPLOYEES_OUT
,(SELECT SUM(COALESCE(EMPLOYEES_OUT,'0')::integer+COALESCE(EMPLOYEES_IN,'0')::integer) FROM SETUP_WBS_TASK AS O WHERE O.CONTRACT_OBJID = T.OBJID) AS EMPLOYEES_TOTAL
,OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
FROM
PROJECT_MGMT AS T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product !=null and product != '' ">
AND PRODUCT = #{product}
</if>
<if test="pm_user_id !=null and pm_user_id != '' ">
AND PM_USER_ID = #{pm_user_id}
</if>
<if test="unit_code !=null and unit_code != '' ">
AND UNIT_CODE = #{unit_code}
</if>
<if test="writer !=null and writer != '' ">
AND WRITER = #{writer}
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC ) AS T
</select>
<!-- //정전개 조회 쿼리 -->
<select id="selectStructureAscendingList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
BOM_REPORT_OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
REGDATE,
QTY,
QTY_TEMP,
PART_OBJID,
<!--
DESIGN_DATE,
EO_NO,
EO_DATE,
PART_NO_TITLE,
PART_NAME,
REV,
MATERIAL,
SUB_MATERIAL,
SPEC,
WEIGHT,
PART_OBJID,
THICKNESS,
WIDTH,
HEIGHT,
OUT_DIAMETER,
IN_DIAMETER,
LENGTH,
MAKER,
POST_PROCESSING,
PART_MNG_NO,
PARENT_PART_MNG_NO,
-->
LEV,
PATH,
PATH2,
CYCLE,
SEQ,
LAST_PART_OBJID
) AS (
SELECT
A.BOM_REPORT_OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.REGDATE,
A.QTY,
A.QTY_TEMP,
NVL(A.LAST_PART_OBJID, A.PART_NO) PART_OBJID,
<!--
B.DESIGN_DATE,
B.EO_NO,
B.EO_DATE,
B.PART_NO AS PART_NO_TITLE,
B.PART_NAME,
B.REVISION AS REV,
B.MATERIAL,
B.SUB_MATERIAL,
B.SPEC,
B.WEIGHT,
B.OBJID AS PART_OBJID,
B.THICKNESS,
B.WIDTH,
B.HEIGHT,
B.OUT_DIAMETER,
B.IN_DIAMETER,
B.LENGTH,
B.MAKER,
B.POST_PROCESSING,
A.PART_MNG_NO,
A.PARENT_PART_MNG_NO,
-->
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.SEQ,
A.LAST_PART_OBJID
FROM
BOM_PART_QTY A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.BOM_REPORT_OBJID=#{OBJID}
AND A.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')
<!--
(
SELECT
BPQ.*
,(SELECT PART_NO FROM PART_MNG P WHERE 1=1 AND P.OBJID::VARCHAR = BPQ.PART_NO) AS PART_MNG_NO
,(SELECT PART_NO FROM PART_MNG P WHERE 1=1 AND P.OBJID::VARCHAR = BPQ.PARENT_PART_NO) AS PARENT_PART_MNG_NO
FROM BOM_PART_QTY BPQ
WHERE (PARENT_PART_NO IS NULL OR PARENT_PART_NO = '')
AND BPQ.BOM_REPORT_OBJID=#{OBJID}
AND STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')
<if test="customer_cd != null and !''.equals(customer_cd)">
AND EXISTS (SELECT 1 FROM PART_BOM_REPORT R
WHERE R.CUSTOMER_OBJID = #{customer_cd}
AND R.OBJID = BPQ.BOM_REPORT_OBJID)
</if>
<if test="project_name != null and !''.equals(project_name)">
AND EXISTS (SELECT 1 FROM PART_BOM_REPORT R
WHERE R.CONTRACT_OBJID = #{project_name}
AND R.OBJID = BPQ.BOM_REPORT_OBJID)
</if>
<if test="unit_code != null and !''.equals(unit_code)">
AND EXISTS (SELECT 1 FROM PART_BOM_REPORT R
WHERE R.UNIT_CODE = #{unit_code}
AND R.OBJID = BPQ.BOM_REPORT_OBJID)
</if>
) A
,PART_MNG B,
PART_BOM_REPORT C
WHERE 1=1
AND A.BOM_REPORT_OBJID=#{OBJID}
-->
<!--
AND C.OBJID = A.BOM_REPORT_OBJID
AND NVL(A.LAST_PART_OBJID, A.PART_NO) = B.OBJID
AND A.LAST_PART_OBJID = B.OBJID
AND B.IS_LAST='1'
AND C.OBJID=#{OBJID}
-->
<!-- <if test="customer_cd != null and !''.equals(customer_cd)">
AND C.CUSTOMER_OBJID = #{customer_cd}
</if>
<if test="project_name != null and !''.equals(project_name)">
AND C.CONTRACT_OBJID = #{project_name}
</if>
<if test="unit_code != null and !''.equals(unit_code)">
AND C.UNIT_CODE = #{unit_code}
</if> -->
UNION ALL
SELECT
A.BOM_REPORT_OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PARENT_PART_NO,
A.PART_NO,
A.REGDATE,
A.QTY,
A.QTY_TEMP,
NVL(A.LAST_PART_OBJID, A.PART_NO) PART_OBJID,
<!--
B.DESIGN_DATE,
B.EO_NO,
B.EO_DATE,
B.PART_NO AS PART_NO_TITLE,
B.PART_NAME,
B.REVISION AS REV,
B.MATERIAL,
B.SUB_MATERIAL,
B.SPEC,
B.WEIGHT,
B.OBJID AS PART_OBJID,
B.THICKNESS,
B.WIDTH,
B.HEIGHT,
B.OUT_DIAMETER,
B.IN_DIAMETER,
B.LENGTH,
B.MAKER,
B.POST_PROCESSING,
A.PART_MNG_NO,
A.PARENT_PART_MNG_NO,
-->
LEV + 1,
PATH||A.CHILD_OBJID::TEXT,
PATH2||A.SEQ::TEXT,
A.PARENT_OBJID = ANY(PATH),
A.SEQ,
A.LAST_PART_OBJID
FROM
BOM_PART_QTY A
<!--
(
SELECT
BPQ.*,
(SELECT PART_NO FROM PART_MNG P WHERE 1=1 AND P.OBJID::VARCHAR = BPQ.PART_NO) AS PART_MNG_NO,
(SELECT PART_NO FROM PART_MNG P WHERE 1=1 AND P.OBJID::VARCHAR = BPQ.PARENT_PART_NO) AS PARENT_PART_MNG_NO
FROM BOM_PART_QTY BPQ
WHERE 1=1
) A,
PART_MNG B,
PART_BOM_REPORT C,
-->
,VIEW_BOM V
WHERE 1=1
AND A.PARENT_OBJID = V.CHILD_OBJID
AND V.BOM_REPORT_OBJID = A.BOM_REPORT_OBJID
AND A.STATUS in ('beforeEdit', 'editing', 'deleting', 'deploy')
<!--
AND C.OBJID = A.BOM_REPORT_OBJID
AND NVL(A.LAST_PART_OBJID, A.PART_NO) = B.OBJID
AND A.PARENT_OBJID = D.CHILD_OBJID
-->
)
SELECT
V.BOM_REPORT_OBJID,
V.PARENT_PART_NO,
V.CHILD_OBJID,
V.REGDATE,
V.QTY,
V.QTY_TEMP,
V.PART_OBJID,
CASE WHEN AS_WBS.PART_OBJID IS NULL
THEN V.PART_OBJID
ELSE AS_WBS.PART_OBJID END AS PART_OBJID,
V.LEV,
V.LEV AS LEVEL,
V.SEQ,
<!--
V.PART_MNG_NO,
V.PARENT_PART_MNG_NO,
-->
B.DESIGN_DATE,
B.EO_NO,
B.EO_DATE,
(SELECT O.PART_NO FROM PART_MNG AS O WHERE O.OBJID = V.CHILD_OBJID) AS PART_NO_TITLE,
B.PART_NAME,
B.MATERIAL,
B.SUB_MATERIAL,
B.WEIGHT,
B.REVISION,
B.PART_NO,
B.THICKNESS,
B.WIDTH,
B.HEIGHT,
B.OUT_DIAMETER,
B.IN_DIAMETER,
B.LENGTH,
B.SPEC,
B.REMARK,
B.MAKER,
B.POST_PROCESSING,
B.UNIT_TITLE,
B.PART_TYPE_TITLE,
B.CU01_CNT AS FILE_3D_CNT,
B.CU02_CNT AS FILE_2D_CNT,
B.CU03_CNT AS FILE_PDF_CNT,
(
SELECT
CASE
WHEN COUNT(*) > 0 THEN 0
ELSE 1
END LEAF
FROM VIEW_BOM VT
WHERE V.BOM_REPORT_OBJID = VT.BOM_REPORT_OBJID
AND V.PART_OBJID = VT.PARENT_PART_NO
<!--
AND V.PART_MNG_NO = VT.PARENT_PART_MNG_NO
-->
) AS LEAF
,AS_WBS.OBJID AS ASS_OBJID
<!-- ,AS_WBS.RECEIVE_DATE
,AS_WBS.RECEIVE_QTY
,AS_WBS.RECEIVE_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = AS_WBS.RECEIVE_USER_ID) AS RECEIVE_USER_NAME -->
,AS_WBS.ASSEMBLY_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = AS_WBS.ASSEMBLY_USER_ID) AS ASSEMBLY_USER_NAME
<!-- ,AS_WBS.TRANSFER_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = AS_WBS.TRANSFER_USER_ID) AS TRANSFER_USER_NAME -->
,AS_WBS.ASSEMBLY_DATE
,AS_WBS.INSOURCING
,AS_WBS.OUTSOURCING
,RH.RECEIVE_QTY
<!-- ,DH.DELIVERY_QTY -->
,CASE WHEN PART_TYPE_TITLE = '구매품표준' THEN (DH.DELIVERY_QTY || ' / ' || POP.ORDER_QTY)
ELSE DH.DELIVERY_QTY::TEXT END
<!--
,(SELECT ARRAY_TO_STRING(ARRAY_AGG(ARRIVAL_PLAN_DATE),',') FROM ARRIVAL_PLAN A WHERE A.PART_OBJID = V.PART_OBJID AND ARRIVAL_PLAN_DATE > TO_CHAR((NOW() - INTERVAL '7 day'), 'YYYY-MM-DD') ) ARRIVAL_PLAN_DATES
-->
,(SELECT ARRAY_TO_STRING(ARRAY_AGG(DISTINCT RECEIPT_DATE), ',')
RECEIPT_DATE
FROM ARRIVAL_PLAN A
WHERE A.PART_OBJID = V.PART_OBJID
ORDER BY RECEIPT_DATE
LIMIT 3
) RECEIPT_DATES
,(
WITH
today_date AS (
SELECT ARRIVAL_PLAN_DATE
FROM ARRIVAL_PLAN A
WHERE A.PART_OBJID = V.PART_OBJID
AND ARRIVAL_PLAN_DATE = TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')
LIMIT 1
),
future_dates AS (
SELECT ARRIVAL_PLAN_DATE
FROM ARRIVAL_PLAN A
WHERE A.PART_OBJID = V.PART_OBJID
AND ARRIVAL_PLAN_DATE > TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')
ORDER BY ARRIVAL_PLAN_DATE
LIMIT 3
),
past_dates AS (
SELECT ARRIVAL_PLAN_DATE
FROM ARRIVAL_PLAN A
WHERE A.PART_OBJID = V.PART_OBJID
AND ARRIVAL_PLAN_DATE &lt; TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD')
ORDER BY ARRIVAL_PLAN_DATE DESC
LIMIT 3
),
combined_dates AS (
SELECT ARRIVAL_PLAN_DATE FROM today_date
UNION ALL
SELECT ARRIVAL_PLAN_DATE FROM future_dates
UNION ALL
SELECT ARRIVAL_PLAN_DATE FROM past_dates
)
SELECT (SELECT ARRAY_TO_STRING(ARRAY_AGG(ARRIVAL_PLAN_DATE), ',')
FROM (
SELECT ARRIVAL_PLAN_DATE
FROM combined_dates
ORDER BY ARRIVAL_PLAN_DATE
LIMIT 3
) T) AS ARRIVAL_PLAN_DATES
) ARRIVAL_PLAN_DATES
FROM
VIEW_BOM V
LEFT OUTER JOIN <include refid="partMng.partMngBaseSimple"/> B
ON NVL(V.LAST_PART_OBJID, V.PART_OBJID) = B.OBJID
LEFT OUTER JOIN ASSEMBLY_WBS_TASK AS AS_WBS
ON NVL(V.LAST_PART_OBJID, V.PART_OBJID) = AS_WBS.PART_OBJID
AND V.BOM_REPORT_OBJID = AS_WBS.PARENT_OBJID
AND V.CHILD_OBJID = AS_WBS.BOM_QTY_CHILD_OBJID
LEFT OUTER JOIN (
SELECT
SUM(POP.ORDER_QTY::NUMERIC) AS ORDER_QTY
,PART_OBJID
FROM
PURCHASE_ORDER_MASTER POM
,PURCHASE_ORDER_PART POP
WHERE POM.OBJID = POP.PURCHASE_ORDER_MASTER_OBJID
AND POM.CONTRACT_MGMT_OBJID = #{project_name}
GROUP BY POP.PART_OBJID
)POP
ON POP.PART_OBJID = V.PART_OBJID
LEFT OUTER JOIN (
SELECT
O.CONTRACT_MGMT_OBJID
,O.UNIT
,O.PART_OBJID
,SUM(RECEIVE_QTY) AS RECEIVE_QTY
FROM
(SELECT
IMO.*,
IM.PART_OBJID ,
IM.CONTRACT_OBJID
FROM
(
SELECT
CONTRACT_MGMT_OBJID,
UNIT,
PARENT_OBJID,
SUM(case when OUT_QTY is null or OUT_QTY = '' then 0 else OUT_QTY::integer end) as RECEIVE_QTY
FROM
INVENTORY_MGMT_OUT IMO
WHERE
CONTRACT_MGMT_OBJID = #{project_name}
AND UNIT = #{unit_code}
GROUP BY
CONTRACT_MGMT_OBJID,
UNIT,
PARENT_OBJID ) IMO
LEFT OUTER JOIN INVENTORY_MGMT IM ON
IMO.PARENT_OBJID = IM.OBJID ) O
GROUP BY CONTRACT_MGMT_OBJID, UNIT, PART_OBJID
<!-- SELECT
PARENT_OBJID,
PART_OBJID,
SUM(CASE WHEN RECEIVE_QTY IS NULL OR RECEIVE_QTY = '' THEN 0 ELSE RECEIVE_QTY::integer END) AS RECEIVE_QTY
FROM
RECEIVE_HISTORY RH
WHERE
1=1
GROUP BY PARENT_OBJID, PART_OBJID -->
) AS RH
ON V.PART_OBJID = RH.PART_OBJID
<!-- AND RH.CONTRACT_OBJID = (SELECT CONTRACT_OBJID FROM PART_BOM_REPORT PBR WHERE V.BOM_REPORT_OBJID = PBR.OBJID) -->
AND RH.CONTRACT_MGMT_OBJID = (SELECT CONTRACT_OBJID FROM PART_BOM_REPORT PBR WHERE V.BOM_REPORT_OBJID = PBR.OBJID)
AND RH.UNIT = (SELECT UNIT_CODE FROM PART_BOM_REPORT PBR WHERE V.BOM_REPORT_OBJID = PBR.OBJID)
<!-- AND V.BOM_REPORT_OBJID = RH.PARENT_OBJID -->
LEFT OUTER JOIN (
SELECT
<!-- IMI.*, -->
IM.PART_OBJID
,SUM(DELIVERY_QTY) AS DELIVERY_QTY
,IM.CONTRACT_OBJID
<!-- ,IM.UNIT -->
FROM
(
SELECT
PARENT_OBJID,
SUM(CASE WHEN RECEIPT_QTY IS NULL OR RECEIPT_QTY = '' THEN 0 ELSE RECEIPT_QTY::INTEGER - coalesce(MOVE_QTY::INTEGER, 0) END) AS DELIVERY_QTY
FROM INVENTORY_MGMT_in IMI
WHERE CONTRACT_MGMT_OBJID = #{project_name}
GROUP BY PARENT_OBJID ) IMI
LEFT OUTER JOIN INVENTORY_MGMT IM
ON IMI.PARENT_OBJID = IM.OBJID
GROUP BY IM.PART_OBJID, CONTRACT_OBJID) AS DH
ON V.PART_OBJID = DH.PART_OBJID
AND DH.CONTRACT_OBJID = (SELECT CONTRACT_OBJID FROM PART_BOM_REPORT PBR WHERE V.BOM_REPORT_OBJID = PBR.OBJID)
<!-- AND DH.UNIT = (SELECT UNIT_CODE FROM PART_BOM_REPORT PBR WHERE V.BOM_REPORT_OBJID = PBR.OBJID) -->
<!-- LEFT OUTER JOIN (
SELECT
PART_OBJID
,SUM(RECEIPT_QTY::INTEGER) as DELIVERY_QTY
,SUM(DELIVERY_QTY::INTEGER) as DELIVERY_QTY
FROM
ARRIVAL_PLAN
DELIVERY_HISTORY
GROUP BY PART_OBJID
) AS DH
ON DH.PART_OBJID = V.PART_OBJID -->
WHERE 1=1
<!--
AND IS_LAST='1'
-->
ORDER BY V.PATH2
</select>
<!-- 공정 실적 등록 -->
<update id="mergeassemblyList" parameterType="map">
INSERT INTO ASSEMBLY_WBS_TASK
(
OBJID
,BOM_QTY_CHILD_OBJID
,PART_OBJID
,PARENT_OBJID
<!-- ,RECEIVE_DATE
,RECEIVE_QTY
,RECEIVE_USER_ID -->
,ASSEMBLY_USER_ID
<!-- ,TRANSFER_USER_ID -->
,ASSEMBLY_DATE
,INSOURCING
,OUTSOURCING
,WRITER
,REGDATE
)
VALUES
(
#{OBJID}
,#{CHILD_OBJID}
,#{PART_OBJID}
,#{PARENT_OBJID}
<!-- ,#{RECEIVE_DATE}
,#{RECEIVE_QTY}
,#{RECEIVE_USER_ID} -->
,#{ASSEMBLY_USER_ID}
<!-- ,#{TRANSFER_USER_ID} -->
,#{ASSEMBLY_DATE}
,#{INSOURCING}
,#{OUTSOURCING}
,#{WRITER}
,now()
) ON CONFLICT (OBJID) DO
UPDATE
SET
<!-- RECEIVE_DATE = #{RECEIVE_DATE}
,RECEIVE_QTY = #{RECEIVE_QTY}
,RECEIVE_USER_ID = #{RECEIVE_USER_ID} -->
ASSEMBLY_USER_ID = #{ASSEMBLY_USER_ID}
<!-- ,TRANSFER_USER_ID = #{TRANSFER_USER_ID} -->
,ASSEMBLY_DATE = #{ASSEMBLY_DATE}
,INSOURCING = #{INSOURCING}
,OUTSOURCING = #{OUTSOURCING}
,WRITER = #{WRITER}
</update>
<select id="inspectionGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
(SELECT COUNT(1) FROM INSPECTION_MGMT AS O WHERE O.PARENT_OBJID = T.OBJID) AS INSPECTION_CNT
,(SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = T.OBJID AND DOC_TYPE='ADMISSION_INSPECTION_FILE' AND UPPER(STATUS) = 'ACTIVE') AS ADMISSION_INSPECTION_CNT
,OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
FROM
PROJECT_MGMT AS T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="customer_objid !=null and customer_objid != '' ">
AND CUSTOMER_OBJID = #{customer_objid}
</if>
<if test="product !=null and product != '' ">
AND PRODUCT = #{product}
</if>
<if test="pm_user_id !=null and pm_user_id != '' ">
AND PM_USER_ID = #{pm_user_id}
</if>
<if test="unit_code !=null and unit_code != '' ">
AND UNIT_CODE = #{unit_code}
</if>
<if test="writer !=null and writer != '' ">
AND WRITER = #{writer}
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<select id="workStatusByImployeeList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
,WD.WORKER_ID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_DEPT_NAME
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_USER_NAME
,WD.WORK_HOUR
,ROUND((WD.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY
,ROUND((WD.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
PROJECT_MGMT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,WORKER_ID
,SUM(work_hour::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, WORKER_ID ) AS WD
ON WD.CONTRACT_OBJID = T.OBJID
WHERE 1=1
<!-- SELECT
T.OBJID,
T.CUSTOMER_OBJID,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = T.CUSTOMER_OBJID) AS CUSTOMER_NAME,
T.CONTRACT_OBJID,
(SELECT CUSTOMER_PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME,
(SELECT PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NAME,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
(SELECT MECHANICAL_TYPE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS MECHANICAL_TYPE,
(SELECT DUE_DATE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS DUE_DATE,
(SELECT SETUP FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SETUP,
(SELECT USER_NAME(PM_USER_ID) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PM_USER_NAME,
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_NAME,
T.UNIT_CODE,
(SELECT TASK_NAME FROM PMS_WBS_TASK_STANDARD AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_NAME,
T.STATUS,
CASE UPPER(T.STATUS)
WHEN 'CREATE' THEN '등록중'
WHEN 'CHANGEDESIGN' THEN '설계변경미배포'
WHEN 'DEPLOY' THEN '배포완료'
ELSE ''
END STATUS_TITLE,
T.WRITER,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS USER_NAME,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) || '/' || (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) as DEPT_USER_NAME,
T.REGDATE AS REGDATE,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
T.DEPLOY_DATE,
T.REVISION,
(SELECT MAX(PM.EO_NO) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_NO,
(SELECT MAX(PM.EO_DATE) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_DATE,
T.NOTE,
AWT.ASSEMBLY_USER_ID,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) AS ASSEMBLY_DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) AS ASSEMBLY_USER_NAME,
AWT.WORK_HOUR,
ROUND((AWT.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY,
ROUND((AWT.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
PART_BOM_REPORT AS T
LEFT OUTER JOIN
(SELECT
PARENT_OBJID,
ASSEMBLY_USER_ID,
COUNT(*) AS WORK_HOUR
FROM
ASSEMBLY_WBS_TASK AWT
WHERE (AWT.ASSEMBLY_USER_ID != '' AND AWT.ASSEMBLY_USER_ID IS NOT NULL)
GROUP BY
PARENT_OBJID,
ASSEMBLY_USER_ID) as AWT
ON AWT.PARENT_OBJID = T.OBJID
AND AWT.ASSEMBLY_USER_ID != ''
WHERE 1=1 -->
<!-- <if test="project_no !=null and project_no != '' ">
AND T.OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND T.OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND WD.WORKER_ID = #{worker}
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
<!-- ORDER BY T.UNIT_CODE -->
</select>
<select id="workStatusByImployeeNPList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
WD.WORKER_ID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_DEPT_NAME
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_USER_NAME
,WD.WORK_HOUR
,ROUND((WD.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY
,ROUND((WD.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
(SELECT
WORKER_ID
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID = '' OR WD.CONTRACT_OBJID IS NULL
AND STATUS = 'complete'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY WORKER_ID ) AS WD
WHERE 1=1
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND WD.WORKER_ID = #{worker}
</if>
</select>
<!-- workStatusByImployeeList 쿼리의 총계만 계산하여 가져온다. -->
<select id="workStatusByImployeeList_sum" parameterType="map" resultType="map">
SELECT
COALESCE(SUM(WORK_HOUR),'0') AS SUM_WORK_HOUR,
COALESCE(SUM(MAN_DAY),'0') AS SUM_MAN_DAY,
COALESCE(SUM(MAN_MONTH),'0') AS SUM_MAN_MONTH
FROM(
SELECT
OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
,WD.WORKER_ID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_DEPT_NAME
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) AS WORKER_USER_NAME
,WD.WORK_HOUR
,ROUND((WD.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY
,ROUND((WD.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
PROJECT_MGMT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,WORKER_ID
,SUM(work_hour::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, WORKER_ID ) AS WD
ON WD.CONTRACT_OBJID = T.OBJID
WHERE 1=1
<if test="project_no !=null and project_no != '' ">
AND T.OBJID = #{project_no}
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND WD.WORKER_ID = #{worker}
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
) AS TOTAL_SUM
</select>
<select id="workStatusByProjectList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.*,
T.WORK_HOUR,
ROUND((T.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY,
ROUND((T.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
(SELECT
T.OBJID,
T.CUSTOMER_OBJID,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = T.CUSTOMER_OBJID) AS CUSTOMER_NAME,
T.CONTRACT_OBJID,
(SELECT CUSTOMER_PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME,
(SELECT PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NAME,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
(SELECT MECHANICAL_TYPE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS MECHANICAL_TYPE,
(SELECT DUE_DATE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS DUE_DATE,
(SELECT SETUP FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SETUP,
(SELECT USER_NAME(PM_USER_ID) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PM_USER_NAME,
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_NAME,
T.UNIT_CODE,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_NAME,
T.STATUS,
CASE UPPER(T.STATUS)
WHEN 'CREATE' THEN '등록중'
WHEN 'CHANGEDESIGN' THEN '설계변경미배포'
WHEN 'DEPLOY' THEN '배포완료'
ELSE ''
END STATUS_TITLE,
T.WRITER,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS USER_NAME,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) || '/' || (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) as DEPT_USER_NAME,
T.REGDATE AS REGDATE,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
T.DEPLOY_DATE,
T.REVISION,
(SELECT MAX(PM.EO_NO) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_NO,
(SELECT MAX(PM.EO_DATE) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_DATE,
T.NOTE,
coalesce(D.WORK_HOUR , '0') as DESIGN_INPUT, /*설계*/
coalesce(PC.WORK_HOUR, '0') as PURCHASE_INPUT, /*구매*/
coalesce(S.WORK_HOUR , '0') as SALES_INPUT, /*영업*/
coalesce(PM.WORK_HOUR, '0') as PRODUCTION_MGMT_INPUT, /*생산관리*/
coalesce(P.WORK_HOUR , '0') as PRODUCTION_INPUT, /*생산*/
coalesce(M.WORK_HOUR , '0') as MGMT_INPUT, /*관리*/
coalesce(O.WORK_HOUR , '0') as OUTSOURCING, /*외주*/
(coalesce(D.WORK_HOUR,'0'))::numeric + (coalesce(PC.WORK_HOUR,'0'))::numeric + (coalesce(S.WORK_HOUR,'0'))::numeric + (coalesce(PM.WORK_HOUR,'0'))::numeric + (coalesce(P.WORK_HOUR,'0'))::numeric + (coalesce(M.WORK_HOUR,'0'))::numeric + coalesce(O.WORK_HOUR , '0') as WORK_HOUR
<!-- AWT.ASSEMBLY_USER_ID,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) AS ASSEMBLY_DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) AS ASSEMBLY_USER_NAME,
AWT.WORK_HOUR,
ROUND((AWT.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY,
ROUND((AWT.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH -->
FROM
PART_BOM_REPORT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT014','DPT006')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS D
ON D.UNIT_CODE = T.UNIT_CODE
AND D.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT012','DPT004')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PC
ON PC.UNIT_CODE = T.UNIT_CODE
AND PC.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = 'DPT016'
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS S
ON S.UNIT_CODE = T.UNIT_CODE
AND S.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT003','DPT018')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PM
ON PM.UNIT_CODE = T.UNIT_CODE
AND PM.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS P
ON P.UNIT_CODE = T.UNIT_CODE
AND P.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT019','DPT001','DPT002')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS M
ON M.UNIT_CODE = T.UNIT_CODE
AND M.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID ,
UNIT_CODE ,
SUM(WORK_HOUR::numeric) as WORK_HOUR
FROM
WORK_DIARY WD
WHERE
WD.CONTRACT_OBJID != ''
AND WD.CONTRACT_OBJID IS NOT NULL
AND STATUS = 'complete'
AND SOURCING_TYPE = 'outsourcing'
GROUP BY
CONTRACT_OBJID,
UNIT_CODE
) AS O
ON O.UNIT_CODE = T.UNIT_CODE
AND O.CONTRACT_OBJID = T.CONTRACT_OBJID ) T
<!-- LEFT OUTER JOIN
(SELECT
PARENT_OBJID,
ASSEMBLY_USER_ID,
COUNT(*) AS WORK_HOUR
FROM
ASSEMBLY_WBS_TASK AWT
WHERE (AWT.ASSEMBLY_USER_ID != '' AND AWT.ASSEMBLY_USER_ID IS NOT NULL)
GROUP BY
PARENT_OBJID,
ASSEMBLY_USER_ID) as AWT
ON AWT.PARENT_OBJID = T.OBJID
AND AWT.ASSEMBLY_USER_ID != '' -->
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(T.REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND T.CONTRACT_OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND T.CONTRACT_OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<!-- <if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND AWT.ASSEMBLY_USER_ID = #{worker}
</if> -->
ORDER BY T.UNIT_CODE
</select>
<!-- workStatusByProjectList 쿼리의 총계만 계산하여 가져온다. -->
<select id="workStatusByProjectList_sum" parameterType="map" resultType="map">
SELECT
coalesce(SUM(DESIGN_INPUT), '0') as SUM_DESIGN_INPUT,
coalesce(SUM(PURCHASE_INPUT), '0') as SUM_PURCHASE_INPUT,
coalesce(SUM(SALES_INPUT), '0') as SUM_SALES_INPUT,
coalesce(SUM(PRODUCTION_MGMT_INPUT), '0') as SUM_PRODUCTION_MGMT_INPUT,
coalesce(SUM(PRODUCTION_INPUT), '0') as SUM_PRODUCTION_INPUT,
coalesce(SUM(MGMT_INPUT), '0') as SUM_MGMT_INPUT,
coalesce(SUM(OUTSOURCING), '0') as SUM_OUTSOURCING,
COALESCE(SUM(WORK_HOUR),'0') AS SUM_WORK_HOUR,
COALESCE(SUM(MAN_DAY),'0') AS SUM_MAN_DAY,
COALESCE(SUM(MAN_MONTH),'0') AS SUM_MAN_MONTH
FROM(
SELECT
T.*,
ROUND((T.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY,
ROUND((T.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
(SELECT
T.OBJID,
T.CUSTOMER_OBJID,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID::VARCHAR = T.CUSTOMER_OBJID) AS CUSTOMER_NAME,
T.CONTRACT_OBJID,
(SELECT CUSTOMER_PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME,
(SELECT PROJECT_NAME FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NAME,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
(SELECT MECHANICAL_TYPE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS MECHANICAL_TYPE,
(SELECT DUE_DATE FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS DUE_DATE,
(SELECT SETUP FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS SETUP,
(SELECT USER_NAME(PM_USER_ID) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PM_USER_NAME,
(SELECT CODE_NAME(PRODUCT) FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PRODUCT_NAME,
T.UNIT_CODE,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_NAME,
T.STATUS,
CASE UPPER(T.STATUS)
WHEN 'CREATE' THEN '등록중'
WHEN 'CHANGEDESIGN' THEN '설계변경미배포'
WHEN 'DEPLOY' THEN '배포완료'
ELSE ''
END STATUS_TITLE,
T.WRITER,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS DEPT_NAME,
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) AS USER_NAME,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) || '/' || (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = T.WRITER) as DEPT_USER_NAME,
T.REGDATE AS REGDATE,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
T.DEPLOY_DATE,
T.REVISION,
(SELECT MAX(PM.EO_NO) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_NO,
(SELECT MAX(PM.EO_DATE) FROM BOM_PART_QTY AS BP LEFT JOIN PART_MNG AS PM ON BP.PART_NO = PM.OBJID::VARCHAR WHERE BP.BOM_REPORT_OBJID =T.OBJID) AS EO_DATE,
T.NOTE,
coalesce(D.WORK_HOUR , '0') as DESIGN_INPUT, /*설계*/
coalesce(PC.WORK_HOUR, '0') as PURCHASE_INPUT, /*구매*/
coalesce(S.WORK_HOUR , '0') as SALES_INPUT, /*영업*/
coalesce(PM.WORK_HOUR, '0') as PRODUCTION_MGMT_INPUT, /*생산관리*/
coalesce(P.WORK_HOUR , '0') as PRODUCTION_INPUT, /*생산*/
coalesce(M.WORK_HOUR , '0') as MGMT_INPUT, /*관리*/
coalesce(O.WORK_HOUR , '0') as OUTSOURCING, /*외주*/
(coalesce(D.WORK_HOUR,'0'))::numeric + (coalesce(PC.WORK_HOUR,'0'))::numeric + (coalesce(S.WORK_HOUR,'0'))::numeric + (coalesce(PM.WORK_HOUR,'0'))::numeric + (coalesce(P.WORK_HOUR,'0'))::numeric + (coalesce(M.WORK_HOUR,'0'))::numeric + (coalesce(O.WORK_HOUR , '0'))::numeric as WORK_HOUR
FROM
PART_BOM_REPORT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT014','DPT006')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS D
ON D.UNIT_CODE = T.UNIT_CODE
AND D.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT012','DPT004')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PC
ON PC.UNIT_CODE = T.UNIT_CODE
AND PC.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = 'DPT016'
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS S
ON S.UNIT_CODE = T.UNIT_CODE
AND S.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT003','DPT018')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PM
ON PM.UNIT_CODE = T.UNIT_CODE
AND PM.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS P
ON P.UNIT_CODE = T.UNIT_CODE
AND P.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,UNIT_CODE
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT019','DPT001','DPT002')
GROUP BY CONTRACT_OBJID, UNIT_CODE, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS M
ON M.UNIT_CODE = T.UNIT_CODE
AND M.CONTRACT_OBJID = T.CONTRACT_OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID ,
UNIT_CODE ,
SUM(WORK_HOUR::numeric) as WORK_HOUR
FROM
WORK_DIARY WD
WHERE
WD.CONTRACT_OBJID != ''
AND WD.CONTRACT_OBJID IS NOT NULL
AND STATUS = 'complete'
AND SOURCING_TYPE = 'outsourcing'
GROUP BY
CONTRACT_OBJID,
UNIT_CODE
) AS O
ON O.UNIT_CODE = T.UNIT_CODE
AND O.CONTRACT_OBJID = T.CONTRACT_OBJID ) T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(T.REGDATE,'YYYY') = #{Year}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND T.CONTRACT_OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND T.CONTRACT_OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = AWT.ASSEMBLY_USER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND AWT.ASSEMBLY_USER_ID = #{worker}
</if>
ORDER BY T.UNIT_CODE
) AS TOTAL_SUM
</select>
<select id="getAssemblyWbsHistoryList" parameterType="map" resultType="map">
SELECT
IMO.OBJID
,IMO.PARENT_OBJID
,IMO.CONTRACT_MGMT_OBJID
,IMO.UNIT
,IMO.OUT_DATE AS RECEIVE_DATE
,IMO.OUT_QTY AS RECEIVE_QTY
,IMO.ACQ_USER AS RECEIVE_USER_ID
,USER_NAME(IMO.ACQ_USER) AS RECEIVE_USER_NAME
,IMO.WRITER AS TRANSFER_USER_ID
,USER_NAME(IMO.WRITER) AS TRANSFER_USER_NAME
,IM.PART_OBJID
FROM
INVENTORY_MGMT_OUT IMO
LEFT OUTER JOIN INVENTORY_MGMT IM
ON IMO.PARENT_OBJID = IM.OBJID
WHERE PART_OBJID = #{PART_OBJID}
AND CONTRACT_MGMT_OBJID = #{PROJECT_NAME}
AND IMO.UNIT = #{UNIT}
<!-- SELECT
RH.OBJID
,RH.PART_OBJID
,RH.PARENT_OBJID
,RH.RECEIVE_DATE
,RH.RECEIVE_QTY
,RH.RECEIVE_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RH.RECEIVE_USER_ID) AS RECEIVE_USER_NAME
,RH.TRANSFER_USER_ID
,(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = RH.TRANSFER_USER_ID) AS TRANSFER_USER_NAME
FROM
RECEIVE_HISTORY RH
WHERE PART_OBJID = #{PART_OBJID}
AND PARENT_OBJID = #{PARENT_OBJID} -->
</select>
<update id="deleteassemblyWbsHistoryList" parameterType="map">
DELETE FROM RECEIVE_HISTORY WHERE OBJID = #{OBJID}
</update>
<delete id="deleteAllAssemblyHistoryList" parameterType="map">
DELETE FROM RECEIVE_HISTORY
WHERE PARENT_OBJID = #{parentObjId}
AND PART_OBJID = #{partObjid}
</delete>
<update id="saveAssemblyWbsHistory" parameterType="map">
INSERT INTO RECEIVE_HISTORY
(
OBJID
,PART_OBJID
,PARENT_OBJID
,RECEIVE_DATE
,RECEIVE_QTY
,RECEIVE_USER_ID
,TRANSFER_USER_ID
,WRITER
,REGDATE
)
VALUES
(
#{OBJID}
,#{PART_OBJID}
,#{PARENT_OBJID}
,#{RECEIVE_DATE}
,#{RECEIVE_QTY}
,#{RECEIVE_USER_ID}
,#{TRANSFER_USER_ID}
,#{WRITER}
,now()
) ON CONFLICT (OBJID) DO
UPDATE
SET
RECEIVE_DATE = #{RECEIVE_DATE}
,RECEIVE_QTY = #{RECEIVE_QTY}
,RECEIVE_USER_ID = #{RECEIVE_USER_ID}
,TRANSFER_USER_ID = #{TRANSFER_USER_ID}
,WRITER = #{WRITER}
</update>
<select id="workDiaryGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
CONTRACT_OBJID,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
UNIT_CODE,
(SELECT O.UNIT_NO || '-' || O.TASK_NAME FROM PMS_WBS_TASK AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_CODE_NAME,
DIVISION,
TASK_NAME,
WORKER_ID,
(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = T.WORKER_ID) AS DEPT_NAME,
USER_NAME(WORKER_ID) AS WORKER_NAME,
WORK_START_DATE,
WORK_END_DATE,
WORK_HOUR,
REMARK,
REGDATE,
WRITER,
SOURCING_TYPE,
PRODUCTION_TYPE,
USER_NAME(WRITER) AS WRITER_NAME,
TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE_TEXT,
STATUS,
CASE WHEN T.STATUS = 'write' THEN '작성중'
WHEN T.STATUS = 'complete' THEN '확인완료'
ELSE ''
END STATUS_TITLE
FROM
WORK_DIARY AS T
WHERE 1=1
<if test="Year !=null and Year != '' ">
AND TO_CHAR(T.REGDATE,'YYYY') = #{Year}
</if>
<if test="search_division !=null and search_division != '' ">
AND DIVISION = #{search_division}
</if>
<!-- <if test="project_no !=null and project_no != '' ">
AND T.CONTRACT_OBJID = #{project_no}
</if> -->
<if test="project_nos != null and project_nos != ''">
AND T.CONTRACT_OBJID IN
<foreach item="state" collection="project_nos.split(',')"
open="(" separator="," close=")">
#{state}
</foreach>
</if>
<if test="unit_code !=null and unit_code != '' ">
AND T.UNIT_CODE = #{unit_code}
</if>
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = T.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="worker !=null and worker != '' ">
AND T.WORKER_ID = #{worker}
</if>
<if test="search_status !=null and search_status != '' ">
AND T.STATUS = #{search_status}
</if>
<if test="objId !=null and objId != '' ">
AND T.OBJID = #{objId}
</if>
ORDER BY REGDATE desc
</select>
<select id="selectWorkDiaryInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
CONTRACT_OBJID,
(SELECT PROJECT_NO FROM PROJECT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS PROJECT_NO,
UNIT_CODE,
(SELECT TASK_NAME FROM pms_wbs_task_standard AS O WHERE O.OBJID = T.UNIT_CODE) AS UNIT_CODE_NAME,
DIVISION,
TASK_NAME,
WORKER_ID,
USER_NAME(WORKER_ID) AS WORKER_NAME,
WORK_START_DATE,
WORK_END_DATE,
WORK_HOUR,
REMARK,
REGDATE,
WRITER,
USER_NAME(WRITER) AS WRITER_NAME,
TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE_TEXT,
STATUS,
CASE WHEN T.STATUS = 'write' THEN '작성중'
WHEN T.STATUS = 'complete' THEN '확인완료'
END STATUS_TITLE,
SOURCING_TYPE,
PRODUCTION_TYPE
FROM
WORK_DIARY AS T
WHERE T.OBJID = #{objId}
</select>
<update id="mergeWorkDiaryInfo" parameterType="map">
INSERT INTO WORK_DIARY
(
OBJID
,CONTRACT_OBJID
,UNIT_CODE
,DIVISION
,TASK_NAME
,WORKER_ID
,WORK_START_DATE
,WORK_END_DATE
,WORK_HOUR
,REMARK
,STATUS
,WRITER
,REGDATE
,SOURCING_TYPE
,PRODUCTION_TYPE
)
VALUES
(
#{objId }
,#{project_objid }
,#{unit_code }
,#{division }
,#{task_name }
,#{worker_id }
,#{work_start_date }
,#{work_end_date }
,#{work_hour }
,#{remark }
,'write'
,#{writer }
,now()
,#{sourcing_type }
,#{production_type }
) ON CONFLICT (OBJID) DO
UPDATE
SET
CONTRACT_OBJID = #{project_objid }
,UNIT_CODE = #{unit_code }
,DIVISION = #{division }
,TASK_NAME = #{task_name }
,WORKER_ID = #{worker_id }
,WORK_START_DATE = #{work_start_date }
,WORK_END_DATE = #{work_end_date }
,WORK_HOUR = #{work_hour }
,REMARK = #{remark }
<!-- ,STATUS = #{status } -->
,SOURCING_TYPE = #{sourcing_type }
,PRODUCTION_TYPE = #{production_type }
</update>
<delete id="workDiaryDelete" parameterType="map">
DELETE FROM WORK_DIARY WHERE OBJID = #{OBJID}
</delete>
<update id="workDiaryConfirm" parameterType="map">
UPDATE WORK_DIARY SET
STATUS='complete'
WHERE OBJID = #{OBJID}
</update>
<!-- 작업관리 -> 현황 -->
<select id="workMgmtdashboardGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.*,
T.WORK_HOUR,
ROUND((T.WORK_HOUR::float / 8)::numeric,1) AS MAN_DAY,
ROUND((T.WORK_HOUR::float / 8 / 22)::numeric,1) AS MAN_MONTH
FROM
(SELECT
OBJID
,CATEGORY_CD
,CODE_NAME(CATEGORY_CD) AS CATEGORY_NAME
,CUSTOMER_OBJID
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = T.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME
,PRODUCT
,CODE_NAME(PRODUCT) AS PRODUCT_NAME
,(SELECT O.CUSTOMER_PROJECT_NAME FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID) AS CUSTOMER_PROJECT_NAME
,STATUS_CD
,CODE_NAME(STATUS_CD) AS STATUS_NAME
,DUE_DATE
,LOCATION
,SETUP
,FACILITY
,CODE_NAME(FACILITY) AS FACILITY_NAME
,FACILITY_QTY
,FACILITY_TYPE
,FACILITY_DEPTH
,PRODUCTION_NO
,BUS_CAL_CD
,CODE_NAME(BUS_CAL_CD) AS BUS_CAL_NAME
,CATEGORY1_CD
,CODE_NAME(CATEGORY1_CD) AS CATEGORY1_NAME
,CHG_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.CHG_USER_ID ) AS CHG_USER_NAME
,PLAN_DATE
,COMPLETE_DATE
,RESULT_CD
,CODE_NAME(RESULT_CD) AS RESULT_NAME
,PROJECT_NO
,PM_USER_ID
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = (SELECT O.PM_USER_ID FROM CONTRACT_MGMT AS O WHERE O.OBJID = T.CONTRACT_OBJID)) AS PM_USER_NAME
,CONTRACT_PRICE
,CONTRACT_PRICE_CURRENCY
,CONTRACT_CURRENCY
,CODE_NAME(CONTRACT_CURRENCY) AS CONTRACT_CURRENCY_NAME
,REGDATE
,TO_CHAR(REGDATE,'YYYY-MM-DD') AS REG_DATE
,WRITER
,(SELECT USER_NAME FROM USER_INFO AS O WHERE O.USER_ID = T.WRITER ) AS WRITER_NAME
,CONTRACT_NO
,CUSTOMER_EQUIP_NAME
,REQ_DEL_DATE
,CONTRACT_DEL_DATE
,CONTRACT_COMPANY
,CODE_NAME(CONTRACT_COMPANY) AS CONTRACT_COMPANY_NAME
,CONTRACT_DATE
,PO_NO
,MANUFACTURE_PLANT
,CODE_NAME(MANUFACTURE_PLANT) AS MANUFACTURE_PLANT_NAME
,CONTRACT_RESULT
,CODE_NAME(CONTRACT_RESULT) AS CONTRACT_RESULT_NAME
,CODE_NAME(AREA_CD) AS AREA_NAME
,PROJECT_NAME
,MECHANICAL_TYPE
,coalesce(D.WORK_HOUR , '0') as DESIGN_INPUT /*설계*/
,coalesce(PC.WORK_HOUR, '0') as PURCHASE_INPUT /*구매*/
,coalesce(S.WORK_HOUR , '0') as SALES_INPUT /*영업*/
,coalesce(PM.WORK_HOUR, '0') as PRODUCTION_MGMT_INPUT /*생산관리*/
,coalesce(P.WORK_HOUR , '0') as PRODUCTION_INPUT /*생산*/
,coalesce(M.WORK_HOUR , '0') as MGMT_INPUT /*관리*/
,coalesce(O.WORK_HOUR , '0') as OUTSOURCING /*외주*/
,(coalesce(D.WORK_HOUR,'0'))::numeric + (coalesce(PC.WORK_HOUR,'0'))::numeric + (coalesce(S.WORK_HOUR,'0'))::numeric + (coalesce(PM.WORK_HOUR,'0'))::numeric
+ (coalesce(P.WORK_HOUR,'0'))::numeric + (coalesce(M.WORK_HOUR,'0'))::numeric + coalesce(O.WORK_HOUR , '0') as WORK_HOUR
FROM PROJECT_MGMT AS T
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT014','DPT006')
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS D
ON D.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT012','DPT004')
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PC
ON PC.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = 'DPT016'
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS S
ON S.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT003','DPT018')
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS PM
ON PM.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT005','DPT023','DPT013')
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS P
ON P.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,(SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID)
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) IN ('DPT019','DPT001','DPT002')
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND (SELECT DEPT_CODE FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID, (SELECT DEPT_NAME FROM USER_INFO WHERE USER_ID = WD.WORKER_ID) ) AS M
ON M.CONTRACT_OBJID = T.OBJID
LEFT OUTER JOIN
(SELECT
CONTRACT_OBJID
,SUM(WORK_HOUR::numeric) AS WORK_HOUR
FROM
WORK_DIARY WD
WHERE WD.CONTRACT_OBJID != '' AND WD.CONTRACT_OBJID IS NOT null
AND STATUS = 'complete'
AND SOURCING_TYPE = 'outsourcing'
<if test="busUsersDeptId !=null and busUsersDeptId != '' ">
AND SOURCING_TYPE = #{busUsersDeptId}
</if>
<if test="Year !=null and Year != '' ">
AND TO_CHAR(REGDATE,'YYYY') = #{Year}
</if>
GROUP BY CONTRACT_OBJID ) AS O
ON O.CONTRACT_OBJID = T.OBJID ) T
WHERE 1=1
<!-- <if test="Year !=null and Year != '' ">
AND TO_CHAR(T.REGDATE,'YYYY') = #{Year}
</if> -->
<if test="project_no !=null and project_no != '' ">
AND T.OBJID = #{project_no}
</if>
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<!-- M-BOM 관리 목록 조회 - 품목별로 나눠서 보이기 (판매관리와 동일) -->
<select id="mBomMgmtGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* productionplanning.mBomMgmtGridList - 품목별로 나눠서 조회 (CONTRACT_ITEM 기준) */
SELECT
PM.OBJID,
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
CM.CATEGORY_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.CATEGORY_CD LIMIT 1),
''
) AS CATEGORY_NAME,
CM.PRODUCT,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PRODUCT LIMIT 1),
''
) AS PRODUCT_NAME,
CM.AREA_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.AREA_CD LIMIT 1),
''
) AS AREA_NAME,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
CM.CUSTOMER_OBJID,
COALESCE(
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = CM.CUSTOMER_OBJID::NUMERIC LIMIT 1),
''
) AS CUSTOMER_NAME,
CM.PAID_TYPE,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PAID_TYPE LIMIT 1),
CASE
WHEN CM.PAID_TYPE = 'paid' THEN '유상'
WHEN CM.PAID_TYPE = 'free' THEN '무상'
ELSE ''
END
) AS PAID_TYPE_NAME,
-- 품목 정보: CONTRACT_ITEM에서 가져오기 (품목별로 펼쳐서 보이기)
COALESCE(CI.PART_NO, PM.PART_NO, '') AS PART_NO,
COALESCE(CI.PART_NAME, PM.PART_NAME, '') AS PART_NAME,
CI.PART_OBJID,
-- S/N: 해당 품목의 시리얼 번호만 표시
(SELECT
CASE
WHEN COUNT(*) = 0 THEN ''
WHEN COUNT(*) = 1 THEN MIN(CIS.SERIAL_NO)
ELSE MIN(CIS.SERIAL_NO) || ' 외 ' || (COUNT(*) - 1)::TEXT || '건'
END
FROM CONTRACT_ITEM_SERIAL CIS
WHERE CIS.ITEM_OBJID = CI.OBJID
AND UPPER(CIS.STATUS) = 'ACTIVE'
AND CIS.SERIAL_NO IS NOT NULL) AS SERIAL_NO,
-- 수량: CONTRACT_ITEM의 수량
COALESCE(CI.ORDER_QUANTITY::numeric, PM.QUANTITY::numeric, 0) AS QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선
COALESCE(CI.DUE_DATE, PM.DUE_DATE, CM.req_del_date) AS REQ_DEL_DATE,
-- 고객요청사항: CONTRACT_ITEM에서 가져옴
COALESCE(CI.CUSTOMER_REQUEST, '') AS CUSTOMER_REQUEST,
-- E-BOM 정보: CI.PART_OBJID가 E-BOM OBJID를 가리킴
COALESCE(CI.PART_OBJID, PM.PART_OBJID) AS BOM_REPORT_OBJID,
COALESCE(
(SELECT PBR.STATUS
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = COALESCE(CI.PART_OBJID, PM.PART_OBJID)
LIMIT 1),
''
) AS EBOM_STATUS,
COALESCE(
(SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = COALESCE(CI.PART_OBJID, PM.PART_OBJID)
LIMIT 1),
''
) AS EBOM_REGDATE,
-- M-BOM HEADER OBJID: 구매리스트 생성 시 필요
(SELECT MH.OBJID::VARCHAR
FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
AND MH.STATUS = 'Y'
ORDER BY MH.REGDATE DESC
LIMIT 1) AS MBOM_HEADER_OBJID,
-- 구매리스트 OBJID: 이미 생성된 구매리스트가 있는지 확인용
(SELECT SRM.OBJID::VARCHAR
FROM SALES_REQUEST_MASTER SRM
WHERE SRM.MBOM_HEADER_OBJID = (
SELECT MH.OBJID::VARCHAR
FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
AND MH.STATUS = 'Y'
ORDER BY MH.REGDATE DESC
LIMIT 1
)
LIMIT 1) AS PURCHASE_LIST_OBJID,
-- M-BOM 상태: 새 MBOM_HEADER 테이블에서 조회
COALESCE(
(SELECT
CASE
WHEN COUNT(*) > 0 THEN 'Y'
ELSE COALESCE(PM.MBOM_STATUS, '')
END
FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
AND MH.STATUS = 'Y'
LIMIT 1),
COALESCE(PM.MBOM_STATUS, '')
) AS MBOM_STATUS,
-- M-BOM 품번: 새 MBOM_HEADER 테이블에서 조회
COALESCE(
(SELECT MH.MBOM_NO
FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
AND MH.STATUS = 'Y'
ORDER BY MH.REGDATE DESC
LIMIT 1),
''
) AS MBOM_PART_NO,
'1.0' AS MBOM_VERSION,
-- M-BOM 저장일: 새 MBOM_HEADER 테이블에서 조회 (수정일 우선, 없으면 등록일)
(SELECT TO_CHAR(COALESCE(MH.EDIT_DATE, MH.REGDATE), 'YYYY-MM-DD')
FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = PM.OBJID::VARCHAR
AND MH.STATUS = 'Y'
ORDER BY COALESCE(MH.EDIT_DATE, MH.REGDATE) DESC
LIMIT 1) AS MBOM_REGDATE
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
LEFT OUTER JOIN CONTRACT_ITEM CI ON PM.CONTRACT_OBJID = CI.CONTRACT_OBJID
AND PM.PART_OBJID = CI.PART_OBJID
-- CONTRACT_ITEM과 LEFT JOIN하여 품목별로 펼쳐서 보이기
-- LEFT JOIN CONTRACT_ITEM CI ON CM.OBJID::VARCHAR = CI.CONTRACT_OBJID
AND CI.STATUS = 'ACTIVE'
WHERE 1=1
AND PM.PROJECT_NO IS NOT NULL
AND PM.PROJECT_NO != ''
<!-- 품번 검색 (대소문자 구분 없음) -->
<if test="search_part_no != null and search_part_no != ''">
AND (
UPPER(PM.PART_NO) LIKE '%' || UPPER(#{search_part_no}) || '%'
OR UPPER(CI.PART_NO) LIKE '%' || UPPER(#{search_part_no}) || '%'
)
</if>
<!-- 품명 검색 (대소문자 구분 없음) -->
<if test="search_part_name != null and search_part_name != ''">
AND (
UPPER(PM.PART_NAME) LIKE '%' || UPPER(#{search_part_name}) || '%'
OR UPPER(CI.PART_NAME) LIKE '%' || UPPER(#{search_part_name}) || '%'
)
</if>
ORDER BY PM.REGDATE DESC, CI.PART_NO
</select>
<!-- E-BOM을 PROJECT_MGMT에 할당 -->
<update id="assignEbomToProject" parameterType="map">
UPDATE PROJECT_MGMT
SET
PART_OBJID = #{bomReportObjid}
WHERE OBJID = #{projectMgmtObjid}
</update>
<!-- E-BOM 정보 조회 -->
<select id="getEbomInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.OBJID,
T.PRODUCT_CD,
CODE_NAME(T.PRODUCT_CD) as PRODUCT_NAME,
T.PART_NO,
T.PART_NAME,
T.STATUS,
T.REVISION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
UI.USER_NAME AS WRITER_NAME,
UI.DEPT_NAME
FROM
PART_BOM_REPORT T
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
WHERE T.OBJID::VARCHAR = #{objid}
</select>
<!-- M-BOM 상세 조회 (PROJECT_MGMT + CONTRACT_MGMT 정보) -->
<select id="getProjectMgmtDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
PM.OBJID,
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
PM.BOM_REPORT_OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SOURCE_BOM_TYPE,
PM.SOURCE_EBOM_OBJID,
PM.SOURCE_MBOM_OBJID,
PM.QUANTITY,
COALESCE(
(SELECT PBR.PART_NO
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
AND PM.MBOM_STATUS = 'Y'
LIMIT 1),
''
) AS MBOM_PART_NO,
CM.CATEGORY_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.CATEGORY_CD LIMIT 1),
''
) AS CATEGORY_NAME,
CM.PRODUCT,
CM.PRODUCT AS PRODUCT_CODE,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PRODUCT LIMIT 1),
''
) AS PRODUCT_NAME,
CM.AREA_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.AREA_CD LIMIT 1),
''
) AS AREA_NAME,
CM.CUSTOMER_OBJID,
COALESCE(
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID = CM.CUSTOMER_OBJID::NUMERIC LIMIT 1),
''
) AS CUSTOMER_NAME,
CM.PAID_TYPE,
CM.REQ_DEL_DATE,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS RECEIPT_DATE,
COALESCE(
(SELECT TO_CHAR(PBR.REGDATE, 'YYYY-MM-DD')
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
AND PM.MBOM_STATUS = 'Y'
LIMIT 1),
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD')
) AS MBOM_REGDATE
FROM
PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE
PM.OBJID::VARCHAR = #{objId}
LIMIT 1
</select>
<!-- E-BOM 목록 조회 -->
<select id="getEbomList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
T.OBJID,
T.PRODUCT_CD,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = T.PRODUCT_CD LIMIT 1),
''
) AS PRODUCT_NAME,
T.PART_NO,
T.PART_NAME,
T.STATUS,
T.REVISION,
TO_CHAR(T.REGDATE, 'YYYY-MM-DD') AS REG_DATE,
UI.USER_NAME AS WRITER_NAME,
UI.DEPT_NAME,
COALESCE(PM.MATERIAL, '') AS MATERIAL,
COALESCE(PM.MAKER, '') AS SUPPLIER
FROM
PART_BOM_REPORT T
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
LEFT JOIN PART_MNG PM ON PM.PART_NO = T.PART_NO AND PM.STATUS = 'release'
WHERE 1=1
<!-- 품번, 품명이 비어있지 않은 것만 조회 -->
AND T.PART_NO IS NOT NULL
AND TRIM(T.PART_NO) != ''
AND T.PART_NAME IS NOT NULL
AND TRIM(T.PART_NAME) != ''
<!-- 품번 검색 -->
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(T.PART_NO) LIKE '%' || UPPER(#{search_part_no}) || '%'
</if>
<!-- 품명 검색 -->
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(T.PART_NAME) LIKE '%' || UPPER(#{search_part_name}) || '%'
</if>
<!-- 재료 검색 -->
<if test="search_material != null and search_material != ''">
AND UPPER(PM.MATERIAL) LIKE '%' || UPPER(#{search_material}) || '%'
</if>
<!-- 공급업체 검색 -->
<if test="search_supplier != null and search_supplier != ''">
AND UPPER(PM.MAKER) LIKE '%' || UPPER(#{search_supplier}) || '%'
</if>
ORDER BY T.REGDATE DESC
LIMIT 100
</select>
<!-- M-BOM 목록 조회 -->
<select id="getMbomList" resultType="map" parameterType="map">
SELECT
BPQ.OBJID,
BPQ.BOM_REPORT_OBJID,
BPQ.PARENT_OBJID,
BPQ.CHILD_OBJID,
BPQ.PARENT_PART_NO,
BPQ.PART_NO,
BPQ.QTY,
BPQ.ITEM_QTY,
BPQ.QTY_TEMP,
BPQ.SEQ,
BPQ.STATUS,
BPQ.LAST_PART_OBJID,
PM.PART_NO AS PART_NAME,
PM.PART_NAME AS PART_FULL_NAME,
PM.REVISION,
PM.SPEC,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.PRODUCT_CODE LIMIT 1),
''
) AS PRODUCT_NAME,
COALESCE(
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.STATUS LIMIT 1),
''
) AS STATUS_NAME,
-- 파일 개수
COALESCE(PM.CU01_CNT, 0) AS CU01_CNT,
COALESCE(PM.CU02_CNT, 0) AS CU02_CNT,
COALESCE(PM.CU03_CNT, 0) AS CU03_CNT,
-- E-BOM 컬럼들
COALESCE(PM.MATERIAL, '') AS MATERIAL,
COALESCE(PM.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(PM.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(PM.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT,
COALESCE(PM.MAKER, '') AS SUPPLIER,
COALESCE(PM.CATEGORY, '') AS CATEGORY_NAME,
-- 생산관리 컬럼들
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
'' AS SIZE,
0 AS REQUIRED_QTY,
0 AS ORDER_QTY,
0 AS PRODUCTION_QTY,
'' AS PROCESSING_VENDOR,
'' AS PROCESSING_DEADLINE,
'' AS GRINDING_DEADLINE,
-- 구매 컬럼들
'' AS MATERIAL_PART_NO,
0 AS NET_QTY,
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS TOTAL_PRICE,
1 AS LEVEL
FROM
BOM_PART_QTY BPQ
LEFT JOIN PART_MGMT PM ON BPQ.PART_NO = PM.PART_NO
LEFT JOIN PART_BOM_REPORT PBR ON BPQ.BOM_REPORT_OBJID::VARCHAR = PBR.OBJID::VARCHAR
WHERE 1=1
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
<!-- BOM_REPORT_OBJID로 직접 조회 (우선순위 높음) -->
<if test="bomReportObjId != null and bomReportObjId != ''">
AND BPQ.BOM_REPORT_OBJID::VARCHAR = #{bomReportObjId}
</if>
<!-- 품번 검색 -->
<if test="partNo != null and partNo != ''">
AND UPPER(PBR.PART_NO) LIKE '%' || UPPER(#{partNo}) || '%'
</if>
<!-- 품명 검색 -->
<if test="partName != null and partName != ''">
AND UPPER(PBR.PART_NAME) LIKE '%' || UPPER(#{partName}) || '%'
</if>
<!-- M-BOM 품번 검색 -->
<if test="mbomPartNo != null and mbomPartNo != ''">
AND UPPER(PBR.PART_NO) LIKE '%' || UPPER(#{mbomPartNo}) || '%'
</if>
<!-- 저장일 검색 -->
<if test="saveDate != null and saveDate != ''">
AND DATE(PBR.REGDATE) = #{saveDate}
</if>
ORDER BY BPQ.SEQ
LIMIT 1000
</select>
<!-- M-BOM 상세 데이터 조회 (프로젝트별) -->
<select id="getMbomDetailByProject" resultType="map" parameterType="map">
/* productionplanning.getMbomDetailByProject - PROJECT_MGMT의 BOM_REPORT_OBJID로 M-BOM 조회 */
SELECT
BPQ.OBJID,
BPQ.BOM_REPORT_OBJID,
BPQ.PARENT_OBJID,
BPQ.CHILD_OBJID,
BPQ.PARENT_PART_NO,
COALESCE(PM.PART_NO, '') AS PART_NO,
BPQ.QTY,
BPQ.ITEM_QTY,
BPQ.QTY_TEMP,
BPQ.SEQ,
BPQ.STATUS,
BPQ.LAST_PART_OBJID,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
'' AS REVISION,
'' AS SPEC,
'' AS PRODUCT_NAME,
'' AS STATUS_NAME,
-- 파일 개수
0 AS CU01_CNT,
0 AS CU02_CNT,
0 AS CU03_CNT,
-- E-BOM 컬럼들
'' AS MATERIAL,
'' AS HEAT_TREATMENT_HARDNESS,
'' AS HEAT_TREATMENT_METHOD,
'' AS SURFACE_TREATMENT,
'' AS SUPPLIER,
'' AS CATEGORY_NAME,
-- 생산관리 컬럼들
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
'' AS SIZE,
0 AS REQUIRED_QTY,
0 AS ORDER_QTY,
0 AS PRODUCTION_QTY,
'' AS PROCESSING_VENDOR,
'' AS PROCESSING_DEADLINE,
'' AS GRINDING_DEADLINE,
-- 구매 컬럼들
'' AS MATERIAL_PART_NO,
0 AS NET_QTY,
0 AS PO_QTY,
'' AS VENDOR,
0 AS UNIT_PRICE,
0 AS TOTAL_PRICE,
1 AS LEVEL
FROM
PROJECT_MGMT PROJ
INNER JOIN BOM_PART_QTY BPQ ON PROJ.BOM_REPORT_OBJID::VARCHAR = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MGMT PM ON PM.OBJID::VARCHAR = BPQ.PART_NO::VARCHAR
WHERE
PROJ.OBJID::VARCHAR = #{objId}
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
AND PROJ.BOM_REPORT_OBJID IS NOT NULL
AND PROJ.BOM_REPORT_OBJID != ''
ORDER BY
BPQ.SEQ
</select>
<!-- 품번으로 최신 M-BOM 조회 (Machine 이외 제품용) -->
<select id="getLatestMbomByPartNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
PM.OBJID,
COALESCE(
(SELECT PBR.PART_NO
FROM PART_BOM_REPORT PBR
WHERE PBR.OBJID::VARCHAR = PM.BOM_REPORT_OBJID
LIMIT 1),
''
) AS MBOM_PART_NO,
PM.BOM_REPORT_OBJID,
PM.PART_NO,
PM.PART_NAME,
TO_CHAR(PM.REGDATE, 'YYYY-MM-DD') AS SAVE_DATE
FROM
PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE
PM.PART_NO = #{partNo}
AND PM.MBOM_STATUS = 'Y'
AND PM.BOM_REPORT_OBJID IS NOT NULL
AND CM.PRODUCT != '0001807' <!-- Machine 제외 -->
ORDER BY
PM.REGDATE DESC
LIMIT 1
</select>
<!-- M-BOM 이력 조회 -->
<select id="getMbomHistory" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID,
MH.MBOM_HEADER_OBJID,
MH.CHANGE_TYPE,
MH.CHANGE_DESCRIPTION,
MH.BEFORE_DATA,
MH.AFTER_DATA,
MH.CHANGE_USER,
TO_CHAR(MH.CHANGE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CHANGE_DATE,
-- MBOM_HEADER 정보 조인
MHD.MBOM_NO AS MBOM_PART_NO,
MHD.PROJECT_OBJID,
TO_CHAR(MHD.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE
FROM
MBOM_HISTORY MH
INNER JOIN MBOM_HEADER MHD ON MH.MBOM_HEADER_OBJID = MHD.OBJID
WHERE
MHD.PROJECT_OBJID = #{projectObjId}
ORDER BY MH.CHANGE_DATE DESC
</select>
<!-- E-BOM을 M-BOM으로 복사 -->
<insert id="saveMbomFromEbom" parameterType="map">
/* productionplanning.saveMbomFromEbom - E-BOM을 M-BOM으로 복사 */
/* 1. 새로운 PART_BOM_REPORT 생성 (M-BOM용) */
/* M-BOM 품번을 PART_NO에 저장 (규칙: M-{품번}-YYMMDD-01) */
WITH new_bom_report AS (
INSERT INTO PART_BOM_REPORT (
OBJID,
PART_NO,
PART_NAME,
WRITER,
REGDATE,
STATUS
) VALUES (
(SELECT (FLOOR(RANDOM() * 1000000000) + 1000000000)::INTEGER),
#{MBOM_PART_NO},
#{PART_NAME},
#{USER_ID},
NOW(),
'Y'
)
RETURNING OBJID
),
/* 2. E-BOM의 BOM_PART_QTY 데이터를 새 M-BOM으로 복사 */
copied_bom_data AS (
INSERT INTO BOM_PART_QTY (
BOM_REPORT_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
WRITER,
SEQ,
STATUS,
LAST_PART_OBJID
)
SELECT
(SELECT OBJID FROM new_bom_report),
(SELECT (FLOOR(RANDOM() * 1000000000) + 1000000000 + ROW_NUMBER() OVER (ORDER BY OBJID))::INTEGER),
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
ITEM_QTY,
QTY_TEMP,
NOW(),
#{USER_ID},
ROW_NUMBER() OVER (ORDER BY OBJID),
'adding',
LAST_PART_OBJID
FROM BOM_PART_QTY
WHERE BOM_REPORT_OBJID::VARCHAR = #{SOURCE_BOM_OBJID}
AND COALESCE(STATUS, '') NOT IN ('deleting', 'deleted')
RETURNING 1
)
/* 3. PROJECT_MGMT 업데이트 */
UPDATE PROJECT_MGMT
SET
BOM_REPORT_OBJID = (SELECT OBJID FROM new_bom_report),
MBOM_STATUS = 'Y',
PART_NO = #{PART_NO},
PART_NAME = #{PART_NAME}
WHERE OBJID::VARCHAR = #{PROJECT_OBJID}
</insert>
<!-- M-BOM 관련 쿼리 -->
<!-- BOM 할당 정보 저장 (M-BOM 기준 설정) -->
<update id="saveBomAssignment" parameterType="map">
UPDATE PROJECT_MGMT
SET
SOURCE_BOM_TYPE = #{sourceBomType},
SOURCE_EBOM_OBJID = CASE WHEN #{sourceBomType} = 'EBOM' THEN #{sourceBomObjId} ELSE NULL END,
SOURCE_MBOM_OBJID = CASE WHEN #{sourceBomType} = 'MBOM' THEN #{sourceBomObjId} ELSE NULL END
WHERE OBJID::VARCHAR = #{projectObjId}
</update>
<!-- 프로젝트의 최신 저장된 M-BOM 조회 -->
<select id="getLatestMbomByProjectId" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
MBOM_NO,
SOURCE_BOM_TYPE,
SOURCE_EBOM_OBJID,
SOURCE_MBOM_OBJID,
PROJECT_OBJID,
STATUS,
REGDATE
FROM MBOM_HEADER
WHERE PROJECT_OBJID = #{projectObjId}
AND STATUS = 'Y'
ORDER BY REGDATE DESC
LIMIT 1
</select>
<!-- 품번 기준 최신 M-BOM 템플릿 조회 (Machine 이외 제품용) -->
<select id="getLatestMbomTemplateByPartNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
MH.OBJID AS TEMPLATE_HEADER_OBJID,
MH.MBOM_NO AS TEMPLATE_MBOM_NO,
MH.PART_NO,
MH.PART_NAME,
MH.SOURCE_BOM_TYPE,
MH.SOURCE_EBOM_OBJID,
MH.SOURCE_MBOM_OBJID,
TO_CHAR(MH.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE
FROM MBOM_HEADER MH
INNER JOIN PROJECT_MGMT PM ON MH.PROJECT_OBJID = PM.OBJID
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE MH.PART_NO = #{partNo}
AND MH.STATUS = 'Y'
AND CM.PRODUCT != '0000928' <!-- Machine 제외 -->
ORDER BY MH.REGDATE DESC
LIMIT 1
</select>
<!-- 템플릿 M-BOM의 상세 항목 조회 -->
<select id="getMbomTemplateDetails" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
SUPPLY_TYPE,
MAKE_OR_BUY,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_SPEC,
RAW_MATERIAL,
RAW_MATERIAL_SIZE,
PROCESSING_VENDOR,
PROCESSING_DEADLINE,
GRINDING_DEADLINE,
REQUIRED_QTY,
WRITER,
EDITER,
EDIT_DATE,
REMARK
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.SUPPLY_TYPE,
A.MAKE_OR_BUY,
A.RAW_MATERIAL_PART_NO,
A.RAW_MATERIAL_SPEC,
A.RAW_MATERIAL,
A.RAW_MATERIAL_SIZE,
A.PROCESSING_VENDOR,
A.PROCESSING_DEADLINE,
A.GRINDING_DEADLINE,
A.REQUIRED_QTY,
A.WRITER,
A.EDITER,
A.EDIT_DATE,
A.REMARK
FROM
MBOM_DETAIL A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.MBOM_HEADER_OBJID = #{mbomHeaderObjid}
AND A.STATUS = 'ACTIVE'
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.SUPPLY_TYPE,
B.MAKE_OR_BUY,
B.RAW_MATERIAL_PART_NO,
B.RAW_MATERIAL_SPEC,
B.RAW_MATERIAL,
B.RAW_MATERIAL_SIZE,
B.PROCESSING_VENDOR,
B.PROCESSING_DEADLINE,
B.GRINDING_DEADLINE,
B.REQUIRED_QTY,
B.WRITER,
B.EDITER,
B.EDIT_DATE,
B.REMARK
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
AND B.STATUS = 'ACTIVE'
)
SELECT
V.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
V.OBJID,
V.PARENT_OBJID,
V.CHILD_OBJID,
V.PART_OBJID,
V.PART_OBJID AS LAST_PART_OBJID,
V.PART_OBJID AS BOM_LAST_PART_OBJID,
V.PART_NO,
V.PART_NAME,
V.QTY,
V.ITEM_QTY,
V.QTY_TEMP,
V.LEV AS LEVEL,
(SELECT COUNT(*) FROM MBOM_DETAIL WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT,
V.SEQ,
V.STATUS,
-- M-BOM 전용 필드
V.UNIT,
V.SUPPLY_TYPE,
V.MAKE_OR_BUY,
V.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
V.RAW_MATERIAL_SPEC,
V.RAW_MATERIAL,
V.RAW_MATERIAL_SIZE AS SIZE,
V.PROCESSING_VENDOR,
V.PROCESSING_DEADLINE,
V.GRINDING_DEADLINE,
V.REQUIRED_QTY,
-- ORDER_QTY, PRODUCTION_QTY는 새 프로젝트에서 재계산되므로 제외
V.WRITER,
TO_CHAR(V.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
V.EDITER,
CASE WHEN V.EDIT_DATE IS NOT NULL THEN TO_CHAR(V.EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END AS EDIT_DATE,
V.REMARK,
-- E-BOM 호환 필드
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS ROOT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS SUB_ROOT_OBJID,
1 AS LEAF,
-- PART_MNG 테이블에서 추가 정보 (3D/2D/PDF, 재료, 열처리 등)
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
P.MAKER,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
P.HEAT_TREATMENT_HARDNESS,
P.HEAT_TREATMENT_METHOD,
P.SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
V.LEV
FROM VIEW_BOM V
LEFT JOIN PART_MNG P ON V.PART_OBJID = P.OBJID
ORDER BY V.PATH2
</select>
<!-- M-BOM 할당 정보 조회 -->
<select id="getMbomAssignment" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
PM.OBJID,
PM.SOURCE_BOM_TYPE,
PM.SOURCE_EBOM_OBJID,
PM.SOURCE_MBOM_OBJID,
PM.PART_NO,
PM.PART_NAME,
CM.PRODUCT AS PRODUCT_CODE,
CODE_NAME(CM.PRODUCT) AS PRODUCT_NAME,
-- E-BOM 정보
CASE WHEN PM.SOURCE_BOM_TYPE = 'EBOM' THEN
(SELECT PART_NO FROM PART_BOM_REPORT WHERE OBJID = PM.SOURCE_EBOM_OBJID)
END AS EBOM_PART_NO,
CASE WHEN PM.SOURCE_BOM_TYPE = 'EBOM' THEN
(SELECT PART_NAME FROM PART_BOM_REPORT WHERE OBJID = PM.SOURCE_EBOM_OBJID)
END AS EBOM_PART_NAME,
-- M-BOM 정보
CASE WHEN PM.SOURCE_BOM_TYPE = 'MBOM' THEN
(SELECT MBOM_NO FROM MBOM_HEADER WHERE OBJID = PM.SOURCE_MBOM_OBJID)
END AS MBOM_NO,
CASE WHEN PM.SOURCE_BOM_TYPE = 'MBOM' THEN
(SELECT PART_NAME FROM MBOM_HEADER WHERE OBJID = PM.SOURCE_MBOM_OBJID)
END AS MBOM_PART_NAME
FROM PROJECT_MGMT PM
INNER JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID
WHERE PM.OBJID::VARCHAR = #{projectObjId}
</select>
<!-- M-BOM 품번 생성 - 같은 날짜의 최대 순번 조회 -->
<select id="getMaxMbomSeqByDate" parameterType="map" resultType="int">
SELECT COALESCE(MAX(
CAST(
SUBSTRING(
MBOM_NO FROM LENGTH(MBOM_NO) - 1 FOR 2
) AS INTEGER
)
), 0) AS MAX_SEQ
FROM MBOM_HEADER
WHERE MBOM_NO LIKE #{mbomPrefix} || '%'
AND REGDATE::DATE = CURRENT_DATE
</select>
<!-- M-BOM 품번으로 조회 -->
<select id="getMbomByNo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT * FROM MBOM_HEADER
WHERE PROJECT_OBJID = #{projectObjId}
ORDER BY REGDATE DESC
LIMIT 1
</select>
<!-- 프로젝트의 활성 M-BOM 목록 조회 -->
<select id="getActiveMbomsByProjectId" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT * FROM MBOM_HEADER
WHERE PROJECT_OBJID = #{projectObjId}
AND (STATUS = 'Y' OR STATUS = 'ACTIVE')
ORDER BY REGDATE DESC
</select>
<!-- M-BOM HEADER 비활성화 -->
<update id="inactivateMbomHeader" parameterType="map">
UPDATE MBOM_HEADER
SET STATUS = 'INACTIVE',
EDIT_DATE = NOW()
WHERE OBJID = #{mbomHeaderObjid}
</update>
<!-- M-BOM DETAIL 비활성화 -->
<update id="inactivateMbomDetail" parameterType="map">
UPDATE MBOM_DETAIL
SET STATUS = 'INACTIVE',
EDIT_DATE = NOW()
WHERE MBOM_HEADER_OBJID = #{mbomHeaderObjid}
</update>
<!-- MBOM_HEADER 삽입 -->
<insert id="insertMbomHeader" parameterType="map">
INSERT INTO MBOM_HEADER (
OBJID, MBOM_NO, SOURCE_BOM_TYPE, SOURCE_EBOM_OBJID, SOURCE_MBOM_OBJID,
PROJECT_OBJID, PART_NO, PART_NAME, STATUS, MBOM_STATUS,
WRITER, REGDATE
) VALUES (
#{objid}, #{mbomNo}, #{sourceBomType}, #{sourceEbomObjid}, #{sourceMbomObjid},
#{projectObjId}, #{partNo}, #{partName}, 'Y', 'DRAFT',
#{sessionUserId}, NOW()
)
</insert>
<!-- MBOM_DETAIL 삽입 -->
<insert id="insertMbomDetail" parameterType="map">
INSERT INTO MBOM_DETAIL (
OBJID, MBOM_HEADER_OBJID, PARENT_OBJID, CHILD_OBJID, SEQ, LEVEL,
PART_OBJID, PART_NO, PART_NAME, QTY, UNIT,
SUPPLY_TYPE, MAKE_OR_BUY,
RAW_MATERIAL_PART_NO, RAW_MATERIAL_SPEC, RAW_MATERIAL, RAW_MATERIAL_SIZE,
PROCESSING_VENDOR, PROCESSING_DEADLINE, GRINDING_DEADLINE,
REQUIRED_QTY, ORDER_QTY, PRODUCTION_QTY, STOCK_QTY, SHORTAGE_QTY,
NET_QTY, PO_QTY,
VENDOR, UNIT_PRICE, TOTAL_PRICE, CURRENCY, LEAD_TIME, MIN_ORDER_QTY,
<if test="proposalDate != null">
PROPOSAL_DATE,
</if>
STATUS, WRITER, REGDATE, REMARK
) VALUES (
#{objid}, #{mbomHeaderObjid}, #{parentObjid}, #{childObjid}, #{seq}, #{level},
#{partObjid}, #{partNo}, #{partName}, #{qty}, #{unit},
#{supplyType}, #{makeOrBuy},
#{rawMaterialPartNo}, #{rawMaterialSpec}, #{rawMaterial}, #{rawMaterialSize},
#{processingVendor}, #{processingDeadline}, #{grindingDeadline},
#{requiredQty}, #{orderQty}, #{productionQty}, #{stockQty}, #{shortageQty},
#{netQty}, #{poQty},
#{vendor}, #{unitPrice}, #{totalPrice}, #{currency}, #{leadTime}, #{minOrderQty},
<if test="proposalDate != null">
#{proposalDate},
</if>
'ACTIVE', #{sessionUserId}, NOW(), #{remark}
)
</insert>
<!-- MBOM_HEADER 업데이트 -->
<update id="updateMbomHeader" parameterType="map">
UPDATE MBOM_HEADER
SET
PART_NO = #{partNo},
PART_NAME = #{partName},
EDITER = #{sessionUserId},
EDIT_DATE = NOW()
WHERE OBJID = #{mbomHeaderObjid}
</update>
<!-- MBOM_DETAIL 삭제 (수정 시 기존 데이터 삭제 후 재삽입) -->
<delete id="deleteMbomDetail" parameterType="map">
DELETE FROM MBOM_DETAIL
WHERE MBOM_HEADER_OBJID = #{mbomHeaderObjid}
</delete>
<!-- MBOM_HISTORY 삽입 -->
<insert id="insertMbomHistory" parameterType="map">
INSERT INTO MBOM_HISTORY (
OBJID, MBOM_HEADER_OBJID, CHANGE_TYPE, CHANGE_DESCRIPTION,
BEFORE_DATA, AFTER_DATA, CHANGE_USER, CHANGE_DATE
) VALUES (
#{objid}, #{mbomHeaderObjid}, #{changeType}, #{changeDescription},
#{beforeData}::JSONB, #{afterData}::JSONB, #{sessionUserId}, NOW()
)
</insert>
<!-- PROJECT_MGMT MBOM_STATUS 업데이트 -->
<update id="updateProjectMbomStatus" parameterType="map">
UPDATE PROJECT_MGMT
SET
MBOM_STATUS = 'Y',
MBOM_WRITER = #{sessionUserId},
MBOM_REGDATE = NOW()
WHERE OBJID::VARCHAR = #{projectObjId}
</update>
<!-- M-BOM 목록 조회 (셀렉트박스용) -->
<select id="getMbomListForSelect" parameterType="map" resultType="map">
SELECT
OBJID,
MBOM_NO,
SOURCE_BOM_TYPE,
REGDATE,
STATUS
FROM MBOM_HEADER
WHERE STATUS = 'Y'
ORDER BY REGDATE DESC, MBOM_NO
</select>
<!-- M-BOM 목록 (bizMakeOptionList용) -->
<select id="getMbomListForSelect2" parameterType="map" resultType="map">
SELECT
OBJID AS CODE,
COALESCE(MBOM_NO, '') ||
CASE WHEN SOURCE_BOM_TYPE IS NOT NULL AND SOURCE_BOM_TYPE != '' THEN ' (' || SOURCE_BOM_TYPE || ')' ELSE '' END AS NAME
FROM MBOM_HEADER
WHERE STATUS = 'Y'
ORDER BY REGDATE DESC, MBOM_NO
</select>
<!-- M-BOM 상세 리스트 조회 (이력용) -->
<select id="getMbomDetailList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
MBOM_HEADER_OBJID,
PARENT_OBJID,
CHILD_OBJID,
SEQ,
LEVEL,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
UNIT,
SUPPLY_TYPE,
MAKE_OR_BUY,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_SPEC,
RAW_MATERIAL,
RAW_MATERIAL_SIZE,
PROCESSING_VENDOR,
PROCESSING_DEADLINE,
GRINDING_DEADLINE,
REQUIRED_QTY,
ORDER_QTY,
PRODUCTION_QTY,
STOCK_QTY,
SHORTAGE_QTY,
NET_QTY,
PO_QTY,
VENDOR,
UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
MIN_ORDER_QTY,
PROPOSAL_DATE,
STATUS,
REMARK
FROM
MBOM_DETAIL
WHERE
MBOM_HEADER_OBJID = #{mbomHeaderObjid}
AND STATUS = 'ACTIVE'
ORDER BY SEQ
</select>
<!-- 저장된 M-BOM 트리 조회 (MBOM_DETAIL 테이블) -->
<select id="getSavedMbomTreeList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
SUPPLY_TYPE,
MAKE_OR_BUY,
RAW_MATERIAL_PART_NO,
RAW_MATERIAL_SPEC,
RAW_MATERIAL,
RAW_MATERIAL_SIZE,
PROCESSING_VENDOR,
PROCESSING_DEADLINE,
GRINDING_DEADLINE,
REQUIRED_QTY,
ORDER_QTY,
PRODUCTION_QTY,
STOCK_QTY,
SHORTAGE_QTY,
VENDOR,
UNIT_PRICE,
TOTAL_PRICE,
CURRENCY,
LEAD_TIME,
MIN_ORDER_QTY,
WRITER,
EDITER,
EDIT_DATE,
REMARK
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.SUPPLY_TYPE,
A.MAKE_OR_BUY,
A.RAW_MATERIAL_PART_NO,
A.RAW_MATERIAL_SPEC,
A.RAW_MATERIAL,
A.RAW_MATERIAL_SIZE,
A.PROCESSING_VENDOR,
A.PROCESSING_DEADLINE,
A.GRINDING_DEADLINE,
A.REQUIRED_QTY,
A.ORDER_QTY,
A.PRODUCTION_QTY,
A.STOCK_QTY,
A.SHORTAGE_QTY,
A.VENDOR,
A.UNIT_PRICE,
A.TOTAL_PRICE,
A.CURRENCY,
A.LEAD_TIME,
A.MIN_ORDER_QTY,
A.WRITER,
A.EDITER,
A.EDIT_DATE,
A.REMARK
FROM
MBOM_DETAIL A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.MBOM_HEADER_OBJID = #{mbomHeaderObjid}
AND A.STATUS = 'ACTIVE'
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.SUPPLY_TYPE,
B.MAKE_OR_BUY,
B.RAW_MATERIAL_PART_NO,
B.RAW_MATERIAL_SPEC,
B.RAW_MATERIAL,
B.RAW_MATERIAL_SIZE,
B.PROCESSING_VENDOR,
B.PROCESSING_DEADLINE,
B.GRINDING_DEADLINE,
B.REQUIRED_QTY,
B.ORDER_QTY,
B.PRODUCTION_QTY,
B.STOCK_QTY,
B.SHORTAGE_QTY,
B.VENDOR,
B.UNIT_PRICE,
B.TOTAL_PRICE,
B.CURRENCY,
B.LEAD_TIME,
B.MIN_ORDER_QTY,
B.WRITER,
B.EDITER,
B.EDIT_DATE,
B.REMARK
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
AND B.STATUS = 'ACTIVE'
)
SELECT
V.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
V.OBJID,
V.PARENT_OBJID,
V.CHILD_OBJID,
V.PART_OBJID,
V.PART_OBJID AS LAST_PART_OBJID,
V.PART_OBJID AS BOM_LAST_PART_OBJID,
V.PART_NO,
V.PART_NAME,
V.QTY,
V.ITEM_QTY,
V.QTY_TEMP,
V.LEV AS LEVEL,
(SELECT COUNT(*) FROM MBOM_DETAIL WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT,
V.SEQ,
V.STATUS,
-- M-BOM 전용 필드
V.UNIT,
V.SUPPLY_TYPE,
V.MAKE_OR_BUY,
V.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
V.RAW_MATERIAL_SPEC,
V.RAW_MATERIAL,
V.RAW_MATERIAL_SIZE AS SIZE,
V.PROCESSING_VENDOR,
V.PROCESSING_DEADLINE,
V.GRINDING_DEADLINE,
V.REQUIRED_QTY,
V.ORDER_QTY,
V.PRODUCTION_QTY,
V.STOCK_QTY,
V.SHORTAGE_QTY,
V.VENDOR,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = V.VENDOR) AS VENDOR_NAME,
V.UNIT_PRICE,
V.TOTAL_PRICE,
V.CURRENCY,
V.LEAD_TIME,
V.MIN_ORDER_QTY,
V.WRITER,
TO_CHAR(V.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
V.EDITER,
CASE WHEN V.EDIT_DATE IS NOT NULL THEN TO_CHAR(V.EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END AS EDIT_DATE,
V.REMARK,
-- E-BOM 호환 필드
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS ROOT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS SUB_ROOT_OBJID,
1 AS LEAF,
-- PART_MNG 테이블에서 추가 정보
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
P.MAKER,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
P.HEAT_TREATMENT_HARDNESS,
P.HEAT_TREATMENT_METHOD,
P.SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
V.LEV
FROM VIEW_BOM V
INNER JOIN PART_MNG P ON P.OBJID = V.PART_OBJID
WHERE 1=1
ORDER BY V.PATH2
</select>
<!-- M-BOM 구조만 조회 (할당용 - 생산 정보 제외) -->
<select id="getMbomStructureOnly" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* productionplanning.getMbomStructureOnly - M-BOM 구조만 조회 (생산 정보 제외) */
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
OBJID,
PARENT_OBJID,
CHILD_OBJID,
PART_OBJID,
PART_NO,
PART_NAME,
QTY,
ITEM_QTY,
QTY_TEMP,
REGDATE,
SEQ,
STATUS,
LEV,
PATH,
PATH2,
CYCLE,
UNIT,
WRITER
) AS (
SELECT
A.MBOM_HEADER_OBJID,
A.OBJID,
A.PARENT_OBJID,
A.CHILD_OBJID,
A.PART_OBJID,
A.PART_NO,
A.PART_NAME,
A.QTY,
A.QTY,
A.QTY,
A.REGDATE,
A.SEQ,
A.STATUS,
1,
ARRAY [A.CHILD_OBJID::TEXT],
ARRAY [A.SEQ::TEXT],
FALSE,
A.UNIT,
A.WRITER
FROM
MBOM_DETAIL A
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND A.MBOM_HEADER_OBJID = #{mbomHeaderObjid}
AND A.STATUS = 'ACTIVE'
UNION ALL
SELECT
B.MBOM_HEADER_OBJID,
B.OBJID,
B.PARENT_OBJID,
B.CHILD_OBJID,
B.PART_OBJID,
B.PART_NO,
B.PART_NAME,
B.QTY,
B.QTY,
B.QTY,
B.REGDATE,
B.SEQ,
B.STATUS,
LEV + 1,
PATH||B.CHILD_OBJID::TEXT,
PATH2||B.SEQ::TEXT,
B.PARENT_OBJID = ANY(PATH),
B.UNIT,
B.WRITER
FROM
MBOM_DETAIL B
JOIN
VIEW_BOM
ON B.PARENT_OBJID = VIEW_BOM.CHILD_OBJID
AND VIEW_BOM.MBOM_HEADER_OBJID = B.MBOM_HEADER_OBJID
AND B.STATUS = 'ACTIVE'
)
SELECT
V.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
V.OBJID,
V.PARENT_OBJID,
V.CHILD_OBJID,
V.PART_OBJID,
V.PART_OBJID AS LAST_PART_OBJID,
V.PART_OBJID AS BOM_LAST_PART_OBJID,
V.PART_NO,
V.PART_NAME,
V.QTY,
V.ITEM_QTY,
V.QTY_TEMP,
V.LEV AS LEVEL,
(SELECT COUNT(*) FROM MBOM_DETAIL WHERE PARENT_OBJID = V.CHILD_OBJID) AS SUB_PART_CNT,
V.SEQ,
V.STATUS,
V.UNIT,
V.WRITER,
TO_CHAR(V.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
-- 생산 정보는 모두 NULL
NULL AS SUPPLY_TYPE,
NULL AS MAKE_OR_BUY,
NULL AS RAW_MATERIAL_NO,
NULL AS RAW_MATERIAL_SPEC,
NULL AS RAW_MATERIAL,
NULL AS SIZE,
NULL AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
NULL AS REQUIRED_QTY,
NULL AS ORDER_QTY,
NULL AS PRODUCTION_QTY,
NULL AS STOCK_QTY,
NULL AS SHORTAGE_QTY,
NULL AS VENDOR,
NULL AS UNIT_PRICE,
NULL AS TOTAL_PRICE,
NULL AS CURRENCY,
NULL AS LEAD_TIME,
NULL AS MIN_ORDER_QTY,
NULL AS EDITER,
NULL AS EDIT_DATE,
NULL AS REMARK,
-- E-BOM 호환 필드
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS ROOT_OBJID,
CASE WHEN V.LEV = 1 THEN V.OBJID ELSE NULL END AS SUB_ROOT_OBJID,
1 AS LEAF,
-- PART_MNG 테이블에서 파트 속성 정보
P.SPEC,
P.MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
P.MAKER,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
P.HEAT_TREATMENT_HARDNESS,
P.HEAT_TREATMENT_METHOD,
P.SURFACE_TREATMENT,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.UNIT) AS UNIT_TITLE,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = P.PART_TYPE) AS PART_TYPE_TITLE,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('3D_CAD')) AS CU01_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_DRAWING_CAD')) AS CU02_CNT,
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE P.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
V.LEV
FROM VIEW_BOM V
INNER JOIN PART_MNG P ON P.OBJID = V.PART_OBJID
WHERE 1=1
ORDER BY V.PATH2
</select>
<!-- MBOM_HEADER 테이블에 OBJID 존재 여부 확인 -->
<select id="checkMbomHeaderExists" parameterType="map" resultType="int">
/* productionplanning.checkMbomHeaderExists - M-BOM 존재 확인 */
SELECT COUNT(*)
FROM MBOM_HEADER
WHERE OBJID = #{objid}
AND STATUS = 'Y'
</select>
</mapper>