M-BOM관리페이지 업데이트

This commit is contained in:
Johngreen
2025-10-30 12:27:47 +09:00
parent 56ee15565f
commit cfa031b20b
10 changed files with 1709 additions and 382 deletions

View File

@@ -3011,4 +3011,326 @@
LEFT JOIN USER_INFO UI ON UI.USER_ID = T.WRITER
WHERE T.OBJID::VARCHAR = #{objid}
</select>
<!-- PROJECT_MGMT 정보 조회 -->
<select id="getProjectMgmtInfo" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
PM.OBJID,
PM.CONTRACT_OBJID,
PM.PROJECT_NO,
PM.PART_NO,
PM.PART_NAME,
PM.PART_OBJID,
PM.QUANTITY,
PM.REQ_DEL_DATE,
PM.BOM_REPORT_OBJID,
CM.CUSTOMER_OBJID,
(SELECT SUPPLY_NAME FROM SUPPLY_MNG WHERE OBJID::VARCHAR = CM.CUSTOMER_OBJID LIMIT 1) AS CUSTOMER_NAME,
CM.PRODUCT,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = CM.PRODUCT LIMIT 1) AS PRODUCT_NAME
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON CM.OBJID = PM.CONTRACT_OBJID
WHERE PM.OBJID = #{objid}
</select>
<!-- E-BOM 데이터를 기반으로 M-BOM 데이터 조회 -->
<select id="getMBomDataFromEbom" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE BOM_TREE AS (
-- 최상위 레벨 (LEVEL = 0)
SELECT
BPQ.OBJID,
BPQ.BOM_REPORT_OBJID,
BPQ.PARENT_OBJID,
BPQ.CHILD_OBJID,
BPQ.PARENT_PART_NO,
BPQ.PART_NO,
BPQ.QTY,
0 AS LEVEL,
CAST(BPQ.SEQ AS VARCHAR) AS SORT_PATH,
PM.PART_NO AS PART_NO_TITLE,
PM.PART_NAME,
PM.MATERIAL,
PM.SPEC,
PM.UNIT,
PM.WEIGHT,
PM.REVISION,
'' AS HEAT_TREAT_HARDNESS,
'' AS HEAT_TREAT_METHOD,
'' AS SURFACE_TREATMENT,
'' AS SUPPLIER_NAME,
'' AS CATEGORY_NAME,
'' AS RAW_MATERIAL,
'' AS SIZE,
0 AS ORDER_QTY,
BPQ.QTY AS QUANTITY,
0 AS PRODUCTION_QTY,
'' AS PROCESSOR_NAME,
'' AS PROCESS_DUE_DATE,
'' AS GRINDING_DUE_DATE,
-- 파일 첨부 여부 (3D, 2D, PDF)
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_3D'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_3D,
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_2D'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_2D,
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_PDF'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_PDF
FROM
BOM_PART_QTY BPQ
LEFT JOIN PART_MNG PM ON PM.OBJID::VARCHAR = BPQ.PART_NO
WHERE
BPQ.BOM_REPORT_OBJID::VARCHAR = #{bomReportObjid}
AND (BPQ.PARENT_OBJID IS NULL OR BPQ.PARENT_OBJID = '')
UNION ALL
-- 하위 레벨 (재귀)
SELECT
BPQ.OBJID,
BPQ.BOM_REPORT_OBJID,
BPQ.PARENT_OBJID,
BPQ.CHILD_OBJID,
BPQ.PARENT_PART_NO,
BPQ.PART_NO,
BPQ.QTY,
BT.LEVEL + 1,
BT.SORT_PATH || '-' || CAST(BPQ.SEQ AS VARCHAR),
PM.PART_NO AS PART_NO_TITLE,
PM.PART_NAME,
PM.MATERIAL,
PM.SPEC,
PM.UNIT,
PM.WEIGHT,
PM.REVISION,
'' AS HEAT_TREAT_HARDNESS,
'' AS HEAT_TREAT_METHOD,
'' AS SURFACE_TREATMENT,
'' AS SUPPLIER_NAME,
'' AS CATEGORY_NAME,
'' AS RAW_MATERIAL,
'' AS SIZE,
0 AS ORDER_QTY,
BPQ.QTY AS QUANTITY,
0 AS PRODUCTION_QTY,
'' AS PROCESSOR_NAME,
'' AS PROCESS_DUE_DATE,
'' AS GRINDING_DUE_DATE,
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_3D'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_3D,
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_2D'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_2D,
CASE WHEN EXISTS(
SELECT 1 FROM attach_file_info AF
WHERE AF.DOC_TYPE = 'PART_PDF'
AND AF.OBJID = PM.OBJID::NUMERIC
AND AF.STATUS = 'ACTIVE'
) THEN 'Y' ELSE 'N' END AS HAS_PDF
FROM
BOM_PART_QTY BPQ
INNER JOIN BOM_TREE BT ON BT.CHILD_OBJID = BPQ.PARENT_OBJID
LEFT JOIN PART_MNG PM ON PM.OBJID::VARCHAR = BPQ.PART_NO
)
SELECT
OBJID,
BOM_REPORT_OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
QTY,
LEVEL,
PART_NO_TITLE,
PART_NAME,
QTY AS AGGREGATE_QTY,
HAS_3D,
HAS_2D,
HAS_PDF,
MATERIAL,
HEAT_TREAT_HARDNESS,
HEAT_TREAT_METHOD,
SURFACE_TREATMENT,
SUPPLIER_NAME,
CATEGORY_NAME,
RAW_MATERIAL,
SIZE,
ORDER_QTY,
QUANTITY,
PRODUCTION_QTY,
PROCESSOR_NAME,
PROCESS_DUE_DATE,
GRINDING_DUE_DATE
FROM
BOM_TREE
ORDER BY
SORT_PATH
</select>
<!-- M-BOM 데이터 저장 -->
<insert id="insertMBomData" parameterType="map">
INSERT INTO m_bom_data (
objid,
project_mgmt_objid,
bom_report_objid,
parent_objid,
child_objid,
parent_part_no,
part_no,
part_name,
qty,
aggregate_qty,
level,
material,
heat_treat_hardness,
heat_treat_method,
surface_treatment,
supplier_name,
category_name,
raw_material,
size,
order_qty,
quantity,
production_qty,
processor_name,
process_due_date,
grinding_due_date,
writer,
regdate
) VALUES (
#{OBJID}::NUMERIC,
#{projectMgmtObjid}::NUMERIC,
#{BOM_REPORT_OBJID}::NUMERIC,
<choose>
<when test="PARENT_OBJID != null and PARENT_OBJID != ''">
#{PARENT_OBJID}::NUMERIC,
</when>
<otherwise>
NULL,
</otherwise>
</choose>
<choose>
<when test="CHILD_OBJID != null and CHILD_OBJID != ''">
#{CHILD_OBJID}::NUMERIC,
</when>
<otherwise>
NULL,
</otherwise>
</choose>
#{PARENT_PART_NO},
#{PART_NO},
#{PART_NAME},
#{QTY}::NUMERIC,
#{AGGREGATE_QTY}::NUMERIC,
#{LEVEL}::INTEGER,
#{MATERIAL},
#{HEAT_TREAT_HARDNESS},
#{HEAT_TREAT_METHOD},
#{SURFACE_TREATMENT},
#{SUPPLIER_NAME},
#{CATEGORY_NAME},
#{RAW_MATERIAL},
#{SIZE},
#{ORDER_QTY}::NUMERIC,
#{QUANTITY}::NUMERIC,
#{PRODUCTION_QTY}::NUMERIC,
#{PROCESSOR_NAME},
#{PROCESS_DUE_DATE},
#{GRINDING_DUE_DATE},
#{writer},
NOW()
)
</insert>
<!-- M-BOM 버전 업데이트 -->
<update id="updateMBomVersion" parameterType="map">
UPDATE project_mgmt
SET
mbom_version = COALESCE(mbom_version, 0) + 1,
mbom_regdate = NOW(),
mbom_writer = #{writer},
mbom_status = 'Y'
WHERE objid = #{projectMgmtObjid}
</update>
<!-- M-BOM 데이터 삭제 (STATUS를 'DELETED'로 업데이트) -->
<delete id="deleteMBomData" parameterType="map">
UPDATE m_bom_data
SET
STATUS = 'DELETED',
EDIT_DATE = NOW()
WHERE PROJECT_MGMT_OBJID = #{projectMgmtObjid}::NUMERIC
AND STATUS = 'ACTIVE'
</delete>
<!-- M-BOM 상태 초기화 -->
<update id="resetMBomStatus" parameterType="map">
UPDATE project_mgmt
SET
mbom_status = NULL,
mbom_version = NULL,
mbom_regdate = NULL,
mbom_writer = NULL
WHERE objid = #{projectMgmtObjid}
</update>
<!-- 저장된 M-BOM 데이터 조회 -->
<select id="getSavedMBomData" parameterType="map" resultType="com.pms.common.UpperKeyMap">
SELECT
OBJID,
PROJECT_MGMT_OBJID,
BOM_REPORT_OBJID,
PARENT_OBJID,
CHILD_OBJID,
PARENT_PART_NO,
PART_NO,
PART_NAME AS PART_NO_TITLE,
PART_NAME,
QTY,
AGGREGATE_QTY,
LEVEL,
MATERIAL,
HEAT_TREAT_HARDNESS,
HEAT_TREAT_METHOD,
SURFACE_TREATMENT,
SUPPLIER_NAME,
CATEGORY_NAME,
RAW_MATERIAL,
SIZE,
ORDER_QTY,
QUANTITY,
PRODUCTION_QTY,
PROCESSOR_NAME,
PROCESS_DUE_DATE,
GRINDING_DUE_DATE,
-- 파일 첨부 여부 확인 (저장된 경우)
'N' AS HAS_3D,
'N' AS HAS_2D,
'N' AS HAS_PDF
FROM
m_bom_data
WHERE
PROJECT_MGMT_OBJID = #{projectMgmtObjid}::NUMERIC
AND STATUS = 'ACTIVE'
ORDER BY
LEVEL, OBJID
</select>
</mapper>