auto commit

This commit is contained in:
leeheejin
2025-11-17 17:29:04 +09:00
parent c1921855e6
commit fd4283f3cf
21 changed files with 2987 additions and 99 deletions

View File

@@ -2530,18 +2530,18 @@ SELECT option_objid::VARCHAR AS CODE
AND PRODUCT_MGMT_OBJID::VARCHAR = #{codeId}::VARCHAR
</select>
<select id="getRevNoselect" parameterType="map" resultType="map">
SELECT
T.OBJID::varchar AS CODE
,T.REV AS NAME
,T1.PRODUCT_CODE AS CODE_CD
,'' AS STATUS
,T.spec_name AS ID
,'' AS EXT_VAL
FROM PART_BOM_REPORT T,PRODUCT_MGMT T1
WHERE T.PRODUCT_MGMT_OBJID = T1.OBJID
AND T1.OBJID = #{code}::numeric
ORDER BY T.REV
<select id="getRevNoselect" parameterType="map" resultType="map">
SELECT
T.OBJID::varchar AS CODE
,COALESCE(T.REVISION, T.REV, '1.0') AS NAME
,T1.PRODUCT_CODE AS CODE_CD
,'' AS STATUS
,T.spec_name AS ID
,'' AS EXT_VAL
FROM PART_BOM_REPORT T,PRODUCT_MGMT T1
WHERE T.PRODUCT_MGMT_OBJID = T1.OBJID
AND T1.OBJID = #{code}::numeric
ORDER BY COALESCE(T.REVISION, T.REV, '1.0')
</select>

View File

@@ -2870,8 +2870,9 @@
ORDER BY SUBSTRING(PROJECT_NO,POSITION('-' IN PROJECT_NO)+1) DESC
</select>
<!-- M-BOM 관리 목록 조회 -->
<!-- M-BOM 관리 목록 조회 - 품목별로 나눠서 보이기 (판매관리와 동일) -->
<select id="mBomMgmtGridList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
/* productionplanning.mBomMgmtGridList - 품목별로 나눠서 조회 (CONTRACT_ITEM 기준) */
SELECT
PM.OBJID,
PM.CONTRACT_OBJID,
@@ -2906,54 +2907,40 @@
ELSE ''
END
) AS PAID_TYPE_NAME,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
-- S/N: CONTRACT_ITEM_SERIAL에서 조회
-- 품목 정보: 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 CI
LEFT JOIN CONTRACT_ITEM_SERIAL CIS ON CI.OBJID = CIS.ITEM_OBJID AND UPPER(CIS.STATUS) = 'ACTIVE'
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE'
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,
COALESCE(PM.QUANTITY::numeric, 0) AS QUANTITY,
-- 요청납기: CONTRACT_ITEM 우선, 없으면 PROJECT_MGMT, 없으면 CONTRACT_MGMT
COALESCE(
(SELECT CI.DUE_DATE
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE' LIMIT 1),
PM.DUE_DATE,
CM.req_del_date
) AS REQ_DEL_DATE,
-- 수량: 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(
(SELECT CI.CUSTOMER_REQUEST
FROM CONTRACT_ITEM CI
WHERE CI.CONTRACT_OBJID = PM.CONTRACT_OBJID
AND CI.PART_OBJID = PM.PART_OBJID
AND CI.STATUS = 'ACTIVE' LIMIT 1),
''
) AS CUSTOMER_REQUEST,
-- E-BOM 정보: PM.PART_OBJID가 E-BOM OBJID를 직접 가리킴
PM.PART_OBJID AS BOM_REPORT_OBJID,
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 = PM.PART_OBJID
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 = PM.PART_OBJID
WHERE PBR.OBJID::VARCHAR = COALESCE(CI.PART_OBJID, PM.PART_OBJID)
LIMIT 1),
''
) AS EBOM_REGDATE,
@@ -2963,18 +2950,27 @@
FROM
PROJECT_MGMT PM
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.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}) || '%'
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}) || '%'
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
ORDER BY PM.REGDATE DESC, CI.PART_NO
</select>
<!-- E-BOM을 PROJECT_MGMT에 할당 -->
@@ -3003,4 +2999,299 @@
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,
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,
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,
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
MH.OBJID,
MH.MBOM_NO,
MH.PART_NO,
MH.PART_NAME,
MH.SAVE_DATE,
MH.CREATE_USER,
MH.CREATE_DATE,
MH.UPDATE_USER,
MH.UPDATE_DATE
FROM
MBOM_HEADER MH
WHERE 1=1
<!-- 품번 검색 -->
<if test="partNo != null and partNo != ''">
AND UPPER(MH.PART_NO) LIKE '%' || UPPER(#{partNo}) || '%'
</if>
<!-- 품명 검색 -->
<if test="partName != null and partName != ''">
AND UPPER(MH.PART_NAME) LIKE '%' || UPPER(#{partName}) || '%'
</if>
<!-- M-BOM 품번 검색 -->
<if test="mbomPartNo != null and mbomPartNo != ''">
AND UPPER(MH.MBOM_NO) LIKE '%' || UPPER(#{mbomPartNo}) || '%'
</if>
<!-- 저장일 검색 -->
<if test="saveDate != null and saveDate != ''">
AND DATE(MH.SAVE_DATE) = #{saveDate}
</if>
ORDER BY MH.SAVE_DATE DESC
LIMIT 100
</select>
<!-- M-BOM 상세 데이터 조회 (프로젝트별) -->
<select id="getMbomDetailByProject" resultType="map" parameterType="map">
SELECT
MD.OBJID,
MD.MBOM_HEADER_OBJID,
MD.PART_NO,
MD.PART_NAME,
MD.QTY,
MD.QTY_TEMP,
MD.ITEM_QTY,
MD.LEVEL,
MD.REVISION,
MD.SPEC,
MD.PRODUCT_NAME,
MD.STATUS_NAME,
MD.LEVEL_1,
MD.LEVEL_2,
MD.LEVEL_3,
MD.LEVEL_4,
MD.LEVEL_5,
MD.LEVEL_6,
MD.LEVEL_7,
MD.LEVEL_8,
MD.LEVEL_9,
MD.LEVEL_10
FROM
MBOM_DETAIL MD
INNER JOIN
MBOM_HEADER MH ON MD.MBOM_HEADER_OBJID = MH.OBJID
WHERE
MH.PROJECT_MGMT_OBJID = #{objId}
ORDER BY
MD.LEVEL, MD.PART_NO
</select>
<!-- M-BOM 헤더 저장 -->
<insert id="insertMbomHeader" parameterType="map">
<selectKey keyProperty="OBJID" resultType="string" order="BEFORE">
SELECT REPLACE(UUID(),'-','') FROM DUAL
</selectKey>
INSERT INTO MBOM_HEADER (
OBJID,
MBOM_NO,
PART_NO,
PART_NAME,
SAVE_DATE,
CREATE_USER,
CREATE_DATE,
UPDATE_USER,
UPDATE_DATE
) VALUES (
#{OBJID},
CONCAT('MBOM-', DATE_FORMAT(NOW(), '%Y%m%d%H%i%s')),
#{PART_NO},
#{PART_NAME},
NOW(),
#{CREATE_USER},
NOW(),
#{UPDATE_USER},
NOW()
)
</insert>
<!-- M-BOM 상세 저장 -->
<insert id="insertMbomDetail" parameterType="map">
<selectKey keyProperty="OBJID" resultType="string" order="BEFORE">
SELECT REPLACE(UUID(),'-','') FROM DUAL
</selectKey>
INSERT INTO MBOM_DETAIL (
OBJID,
MBOM_HEADER_OBJID,
PART_NO,
PART_NAME,
QTY,
LEVEL,
REVISION,
SPEC,
PRODUCT_NAME,
STATUS_NAME,
CREATE_USER,
CREATE_DATE,
UPDATE_USER,
UPDATE_DATE
) VALUES (
#{OBJID},
#{MBOM_HEADER_OBJID},
#{PART_NO},
#{PART_NAME},
#{QTY},
#{LEVEL},
#{REVISION},
#{SPEC},
#{PRODUCT_NAME},
#{STATUS_NAME},
#{CREATE_USER},
NOW(),
#{UPDATE_USER},
NOW()
)
</insert>
<!-- E-BOM을 M-BOM으로 복사 -->
<insert id="saveMbomFromEbom" parameterType="map">
/* productionplanning.saveMbomFromEbom - E-BOM을 M-BOM으로 복사 */
/* 1. 새로운 PART_BOM_REPORT 생성 (M-BOM용) */
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),
#{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>
</mapper>