V2026012702 #133

Merged
hjjeong merged 6 commits from V2026012702 into main 2026-02-06 07:17:44 +00:00
8 changed files with 462 additions and 26 deletions

View File

@@ -228,9 +228,14 @@ var columns = [
{
headerHozAlign: 'center',
hozAlign: 'left',
// width: 150,
width: 220,
title: '고객사요청사항',
field: 'CUSTOMER_REQUEST'
field: 'CUSTOMER_REQUEST',
formatter: function(cell) {
cell.getElement().style.fontWeight = 'bold';
cell.getElement().style.backgroundColor = '#E8F5E9';
return cell.getValue() || '';
}
},
// 15. M-BOM

View File

@@ -297,7 +297,7 @@ var columns = [
formatter:fnc_subInfoValueFormatter,
cellClick:function(e, cell){
var objid = fnc_checkNull(cell.getData().OBJID);
fn_WBSRegist(objid);
wbs_popup(objid);
}
},
@@ -441,6 +441,17 @@ function getCheckedRows() {
}
return [];
}
function wbs_popup(objId,categoryCd){
var popup_width = 1700;
var popup_height = 800;
var objId = objId;
var params = "?OBJID="+objId+"&CATEGORY_CD="+categoryCd;
//var url = "/project/wbsTaskProductGanttFormPopUp.do"+params;
var url = "/project/wbsTaskProductFormPopUp.do"+params;
fn_centerPopup(popup_width, popup_height, url);
}
</script>
<!-- hiddenForm: POST 방식 팝업 전송용 -->

View File

@@ -329,14 +329,36 @@ function fn_initGrid() {
// return value || '';
// }
// },
// 3. 품번
// 원본 OBJID들 (숨김 - 저장 시 사용)
{
title: 'ORIGINAL_OBJIDS',
field: 'ORIGINAL_OBJIDS',
frozen: true,
visible: false
},
// 그룹화된 행 수 (숨김)
{
title: 'GROUPED_COUNT',
field: 'GROUPED_COUNT',
frozen: true,
visible: false
},
// 3. 품번 (합쳐진 경우 표시)
{
headerHozAlign: 'center',
hozAlign: 'left',
widthGrow: 2,
title: '품번',
field: 'PART_NO',
frozen: true
frozen: true,
formatter: function(cell) {
var value = cell.getValue() || '';
var groupedCount = cell.getRow().getData().GROUPED_COUNT || 1;
if(groupedCount > 1) {
return value + ' <span style="color: #ff9800; font-size: 11px;">(합계 ' + groupedCount + '건)</span>';
}
return value;
}
},
// 4. 품명
{

View File

@@ -476,20 +476,20 @@ public class Constants {
/* SMTP 메일정보 - ERP (일반/기본) */
public static final String SMTP_USER = "erp@rps-korea.com";
public static final String SMTP_USER_PW = "Plmrps123!!";
public static final String SMTP_HOST = "gwa.rps-korea.com";
public static final String SMTP_USER_PW = "wace";
public static final String SMTP_HOST = "erp.rps-korea.com";
public static final int SMTP_PORT = 25;
/* SMTP 메일정보 - 영업팀 (견적서 등) */
public static final String SMTP_USER_SALES = "sales@rps-korea.com";
public static final String SMTP_USER_PW_SALES = "rpstech6125!!";
public static final String SMTP_HOST_SALES = "wblock.rps-korea.com";
public static final String SMTP_HOST_SALES = "erp.rps-korea.com";
public static final int SMTP_PORT_SALES = 25;
/* SMTP 메일정보 - 구매팀 (발주서 등) */
public static final String SMTP_USER_PURCHASE = "erp@rps-korea.com";
public static final String SMTP_USER_PW_PURCHASE = "Plmrps123!!";
public static final String SMTP_HOST_PURCHASE = "gwa.rps-korea.com";
public static final String SMTP_USER_PURCHASE = "purchase@rps-korea.com";
public static final String SMTP_USER_PW_PURCHASE = "purchase";
public static final String SMTP_HOST_PURCHASE = "erp.rps-korea.com";
public static final int SMTP_PORT_PURCHASE = 25;
/**

View File

@@ -4523,7 +4523,12 @@
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'ASSEMBLY' AND PR.STATUS = 'active'), 0) AS ASSEMBLY_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'INSPECTION' AND PR.STATUS = 'active'), 0) AS INSPECTION_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PM.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS SHIP_WAIT_QTY,
'' AS EQUIPMENT_WBS,
-- '' AS EQUIPMENT_WBS,
(SELECT COUNT(1) FROM PMS_WBS_TASK AS O WHERE O.CONTRACT_OBJID = PM.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 !=''
OR O.DESIGN_USER_ID !='' OR O.DESIGN_PLAN_START !='' OR O.DESIGN_PLAN_END !='' OR O.DESIGN_ACT_START !='' OR O.DESIGN_ACT_END !=''
OR O.PURCHASE_USER_ID !='' OR O.PURCHASE_PLAN_START !='' OR O.PURCHASE_PLAN_END !='' OR O.PURCHASE_ACT_START !='' OR O.PURCHASE_ACT_END !=''
)) AS EQUIPMENT_WBS,
PP.OBJID AS PROD_PLAN_OBJID,
PM.REGDATE AS SORT_DATE,
PP.WRITER,
@@ -4577,7 +4582,7 @@
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'ASSEMBLY' AND PR.STATUS = 'active'), 0) AS ASSEMBLY_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'INSPECTION' AND PR.STATUS = 'active'), 0) AS INSPECTION_QTY,
COALESCE((SELECT SUM(RESULT_QTY) FROM PRODUCTION_RESULT PR WHERE PR.PROJECT_OBJID = PP.OBJID::VARCHAR AND PR.RESULT_TYPE = 'SHIP_WAIT' AND PR.STATUS = 'active'), 0) AS SHIP_WAIT_QTY,
'' AS EQUIPMENT_WBS,
0 AS EQUIPMENT_WBS,
PP.OBJID AS PROD_PLAN_OBJID,
PP.REGDATE AS SORT_DATE,
PP.WRITER,

View File

@@ -3196,7 +3196,8 @@ UPDATE SET
SRP.REGDATE
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (STATUS 조건 없음, LEFT JOIN으로 모든 데이터 조회) -->
<!-- M-BOM에서 구매리스트 데이터 가져오기 (품번별 그룹핑 버전) -->
<!-- 동일 품번은 수량 합산, 단가/업체는 대표값 사용 -->
<select id="getMBomForPurchaseList" parameterType="map" resultType="com.pms.common.UpperKeyMap">
WITH RECURSIVE VIEW_BOM(
MBOM_HEADER_OBJID,
@@ -3310,6 +3311,332 @@ WITH RECURSIVE VIEW_BOM(
MH.PROJECT_OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
OR MH.OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
)
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,
COALESCE(B.USE_YN, 'Y'),
COALESCE(B.NET_QTY, 0),
COALESCE(B.PO_QTY, 0),
B.PROPOSAL_DATE,
B.PROCESSING_PROPOSAL_DATE,
COALESCE(B.PROCESSING_UNIT_PRICE, 0),
COALESCE(B.PROCESSING_TOTAL_PRICE, 0),
COALESCE(B.GRAND_TOTAL_PRICE, 0)
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
),
/* 품번 + 자급/사급 + 소재재질 + 규격이 같은 경우만 그룹핑 */
/* MBOM_DETAIL 테이블의 RAW_MATERIAL, RAW_MATERIAL_SIZE 값만 사용 */
GROUPED_BOM AS (
SELECT
V.PART_NO,
V.PART_OBJID,
/* 그룹핑 조건 컬럼들 (MBOM_DETAIL 값만 사용) */
COALESCE(V.SUPPLY_TYPE, '') AS SUPPLY_TYPE,
COALESCE(V.RAW_MATERIAL, '') AS RAW_MATERIAL,
COALESCE(V.RAW_MATERIAL_SIZE, '') AS RAW_MATERIAL_SIZE,
/* 원본 OBJID들 (콤마로 연결) */
STRING_AGG(V.OBJID::VARCHAR, ',' ORDER BY V.OBJID) AS ORIGINAL_OBJIDS,
/* 대표 OBJID (가장 작은 값) */
MIN(V.OBJID) AS OBJID,
/* 수량 합산 (문자열을 NUMERIC으로 캐스팅) */
SUM(COALESCE(NULLIF(V.REQUIRED_QTY::TEXT, '')::NUMERIC, 0)) AS REQUIRED_QTY,
SUM(COALESCE(NULLIF(V.PRODUCTION_QTY::TEXT, '')::NUMERIC, 0)) AS PRODUCTION_QTY,
SUM(COALESCE(V.NET_QTY, 0)) AS NET_QTY,
SUM(COALESCE(V.PO_QTY, 0)) AS PO_QTY,
SUM(COALESCE(NULLIF(V.ORDER_QTY::TEXT, '')::NUMERIC, 0)) AS ORDER_QTY,
SUM(COALESCE(NULLIF(V.STOCK_QTY::TEXT, '')::NUMERIC, 0)) AS STOCK_QTY,
SUM(COALESCE(NULLIF(V.SHORTAGE_QTY::TEXT, '')::NUMERIC, 0)) AS SHORTAGE_QTY,
/* 첫번째 값 사용 (대표값) */
MIN(V.MBOM_HEADER_OBJID) AS MBOM_HEADER_OBJID,
MIN(V.PARENT_OBJID) AS PARENT_OBJID,
MIN(V.CHILD_OBJID) AS CHILD_OBJID,
MIN(V.PART_NAME) AS PART_NAME,
SUM(COALESCE(NULLIF(V.QTY::TEXT, '')::NUMERIC, 0)) AS QTY,
MIN(V.SEQ) AS SEQ,
MIN(V.STATUS) AS STATUS,
MIN(V.LEV) AS LEV,
MIN(V.UNIT) AS UNIT,
MIN(V.MAKE_OR_BUY) AS MAKE_OR_BUY,
MIN(V.RAW_MATERIAL_PART_NO) AS RAW_MATERIAL_PART_NO,
MIN(V.RAW_MATERIAL_SPEC) AS RAW_MATERIAL_SPEC,
MIN(V.PROCESSING_VENDOR) AS PROCESSING_VENDOR,
MIN(V.PROCESSING_DEADLINE) AS PROCESSING_DEADLINE,
MIN(V.GRINDING_DEADLINE) AS GRINDING_DEADLINE,
MIN(V.VENDOR) AS VENDOR,
MIN(V.UNIT_PRICE) AS UNIT_PRICE,
MIN(V.TOTAL_PRICE) AS TOTAL_PRICE,
MIN(V.CURRENCY) AS CURRENCY,
MIN(V.LEAD_TIME) AS LEAD_TIME,
MIN(V.MIN_ORDER_QTY) AS MIN_ORDER_QTY,
MIN(V.WRITER) AS WRITER,
MIN(V.REGDATE) AS REGDATE,
MIN(V.EDITER) AS EDITER,
MIN(V.EDIT_DATE) AS EDIT_DATE,
MIN(V.REMARK) AS REMARK,
MIN(V.USE_YN) AS USE_YN,
MIN(V.PROPOSAL_DATE) AS PROPOSAL_DATE,
MIN(V.PROCESSING_PROPOSAL_DATE) AS PROCESSING_PROPOSAL_DATE,
MIN(V.PROCESSING_UNIT_PRICE) AS PROCESSING_UNIT_PRICE,
MIN(V.PROCESSING_TOTAL_PRICE) AS PROCESSING_TOTAL_PRICE,
MIN(V.GRAND_TOTAL_PRICE) AS GRAND_TOTAL_PRICE,
/* 그룹에 포함된 행 수 */
COUNT(*) AS GROUPED_COUNT
FROM VIEW_BOM V
WHERE COALESCE(V.PRODUCTION_QTY, 0) > 0
GROUP BY V.PART_NO, V.PART_OBJID,
COALESCE(V.SUPPLY_TYPE, ''),
COALESCE(V.RAW_MATERIAL, ''),
COALESCE(V.RAW_MATERIAL_SIZE, '')
)
SELECT
G.MBOM_HEADER_OBJID AS BOM_REPORT_OBJID,
G.OBJID,
G.ORIGINAL_OBJIDS,
G.GROUPED_COUNT,
G.PARENT_OBJID,
G.CHILD_OBJID,
G.PART_OBJID,
G.PART_OBJID AS LAST_PART_OBJID,
G.PART_OBJID AS BOM_LAST_PART_OBJID,
G.PART_NO,
G.PART_NAME,
G.QTY,
G.QTY AS ITEM_QTY,
G.QTY AS QTY_TEMP,
G.LEV AS LEVEL,
0 AS SUB_PART_CNT,
G.SEQ,
G.STATUS,
G.UNIT,
G.SUPPLY_TYPE,
G.MAKE_OR_BUY,
G.RAW_MATERIAL_PART_NO AS RAW_MATERIAL_NO,
G.RAW_MATERIAL_SPEC,
G.RAW_MATERIAL,
G.RAW_MATERIAL_SIZE AS SIZE,
G.PROCESSING_VENDOR,
G.PROCESSING_DEADLINE,
G.GRINDING_DEADLINE,
G.REQUIRED_QTY,
G.ORDER_QTY,
G.PRODUCTION_QTY,
G.STOCK_QTY,
G.SHORTAGE_QTY,
G.VENDOR AS VENDOR_PM,
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG WHERE OBJID::VARCHAR = G.VENDOR) AS VENDOR_NAME,
G.UNIT_PRICE,
G.TOTAL_PRICE,
G.CURRENCY,
G.LEAD_TIME,
G.MIN_ORDER_QTY,
G.WRITER,
TO_CHAR(G.REGDATE, 'YYYY-MM-DD HH24:MI:SS') AS REGDATE,
G.EDITER,
CASE WHEN G.EDIT_DATE IS NOT NULL THEN TO_CHAR(G.EDIT_DATE, 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END AS EDIT_DATE,
G.REMARK,
NULL AS PARENT_PART_NO,
NULL AS CONTRACT_OBJID,
G.OBJID AS ROOT_OBJID,
G.OBJID AS SUB_ROOT_OBJID,
1 AS LEAF,
P.SPEC,
COALESCE(P.MATERIAL, G.RAW_MATERIAL) AS MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, G.VENDOR) AS VENDOR,
P.THICKNESS,
P.WIDTH,
P.HEIGHT,
P.OUT_DIAMETER,
P.IN_DIAMETER,
P.LENGTH,
P.SOURCING_CODE,
COALESCE(P.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS,
COALESCE(P.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD,
COALESCE(P.SURFACE_TREATMENT, '') AS 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,
G.LEV,
G.USE_YN,
G.NET_QTY,
G.PO_QTY,
G.PROPOSAL_DATE,
G.PROCESSING_PROPOSAL_DATE,
G.PROCESSING_UNIT_PRICE,
G.PROCESSING_TOTAL_PRICE,
G.GRAND_TOTAL_PRICE,
'MBOM' AS DATA_SOURCE
FROM GROUPED_BOM G
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = G.PART_OBJID::VARCHAR
ORDER BY G.PART_NO
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (백업용 - 개별 행 버전) -->
<select id="getMBomForPurchaseList_old" 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,
USE_YN,
NET_QTY,
PO_QTY,
PROPOSAL_DATE,
PROCESSING_PROPOSAL_DATE,
PROCESSING_UNIT_PRICE,
PROCESSING_TOTAL_PRICE,
GRAND_TOTAL_PRICE
) 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,
COALESCE(A.USE_YN, 'Y'),
COALESCE(A.NET_QTY, 0),
COALESCE(A.PO_QTY, 0),
A.PROPOSAL_DATE,
A.PROCESSING_PROPOSAL_DATE,
COALESCE(A.PROCESSING_UNIT_PRICE, 0),
COALESCE(A.PROCESSING_TOTAL_PRICE, 0),
COALESCE(A.GRAND_TOTAL_PRICE, 0)
FROM
MBOM_DETAIL A
INNER JOIN MBOM_HEADER MH ON MH.OBJID = A.MBOM_HEADER_OBJID
WHERE 1=1
AND (A.PARENT_OBJID IS NULL OR A.PARENT_OBJID = '')
AND (
MH.PROJECT_OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
OR MH.OBJID::VARCHAR = #{PROJECT_MGMT_OBJID}
)
<!-- STATUS 조건 제거하여 모든 데이터 조회 -->
UNION ALL
@@ -4008,23 +4335,49 @@ ORDER BY V.PATH2
</update>
<!-- 품의서 생성 후 PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 소재 -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updateProposalDateForMBomParts" parameterType="map">
UPDATE MBOM_DETAIL
SET PROPOSAL_DATE = NOW()
WHERE OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID IN (
SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
AND MD2.MBOM_HEADER_OBJID IN (
SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
)
</update>
<!-- 품의서 생성 후 PROCESSING_PROPOSAL_DATE 업데이트 (M-BOM - MBOM_DETAIL) - 가공 -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updateProcessingProposalDateForMBomParts" parameterType="map">
UPDATE MBOM_DETAIL
SET PROCESSING_PROPOSAL_DATE = NOW()
WHERE OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID IN (
SELECT MD3.PART_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
AND MD2.MBOM_HEADER_OBJID IN (
SELECT MD3.MBOM_HEADER_OBJID FROM MBOM_DETAIL MD3 WHERE MD3.OBJID IN
<foreach collection="PART_OBJIDS" item="objid" open="(" separator="," close=")">
#{objid}
</foreach>
)
)
</update>
<!-- 품의서 목록 조회 -->
@@ -4813,6 +5166,7 @@ ORDER BY V.PATH2
</update>
<!-- MBOM_DETAIL 단가 업데이트 (견적 수신 후) -->
<!-- 동일 품번(PART_OBJID)의 모든 MBOM_DETAIL 행 업데이트 (품번 합쳐진 경우 대응) -->
<update id="updatePurchaseListPriceFromQuotation" parameterType="map">
UPDATE MBOM_DETAIL SET
<if test="VENDOR_TYPE == 'SUPPLY'">
@@ -4822,7 +5176,12 @@ ORDER BY V.PATH2
PROCESSING_UNIT_PRICE = #{UNIT_PRICE}::NUMERIC
</if>
, EDIT_DATE = NOW()
WHERE OBJID = #{SALES_REQUEST_PART_OBJID}
WHERE OBJID IN (
SELECT MD2.OBJID
FROM MBOM_DETAIL MD2
WHERE MD2.PART_OBJID = (SELECT PART_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID})
AND MD2.MBOM_HEADER_OBJID = (SELECT MBOM_HEADER_OBJID FROM MBOM_DETAIL WHERE OBJID = #{SALES_REQUEST_PART_OBJID})
)
</update>
<!-- MBOM_DETAIL 단가 초기화 (재수주 시 기존 단가 삭제) -->

View File

@@ -1810,6 +1810,7 @@ public class SalesMngService {
for(Map itemData : purchaseList) {
String objid = CommonUtils.checkNull(itemData.get("OBJID"));
String dataSource = CommonUtils.checkNull(itemData.get("DATA_SOURCE"));
String originalObjids = CommonUtils.checkNull(itemData.get("ORIGINAL_OBJIDS"));
if(objid.isEmpty()) {
System.out.println("OBJID가 없는 항목 스킵");
@@ -1824,8 +1825,40 @@ public class SalesMngService {
sqlSession.update("salesMng.updateSalesRequestPartForPurchase", itemData);
} else {
// MBOM_DETAIL 테이블 업데이트 (M-BOM에서 가져온 품목)
System.out.println("MBOM_DETAIL 업데이트: " + objid);
sqlSession.update("salesMng.updateMbomDetailForPurchase", itemData);
// ORIGINAL_OBJIDS가 있으면 다중 OBJID 처리 (품번 합쳐진 경우)
if(!originalObjids.isEmpty() && originalObjids.contains(",")) {
// 콤마로 분리된 OBJID 목록
String[] objidArray = originalObjids.split(",");
System.out.println("품번 합쳐진 경우 - 원본 OBJID " + objidArray.length + "개 업데이트");
// 원본 정미수량/발주수량 저장
String originalNetQty = CommonUtils.checkNull(itemData.get("NET_QTY"));
String originalPoQty = CommonUtils.checkNull(itemData.get("PO_QTY"));
for(int i = 0; i < objidArray.length; i++) {
String targetObjid = objidArray[i].trim();
Map updateParam = new HashMap(itemData);
updateParam.put("OBJID", targetObjid);
if(i == 0) {
// 첫번째(대표) OBJID: 합계값 저장
updateParam.put("NET_QTY", originalNetQty);
updateParam.put("PO_QTY", originalPoQty);
} else {
// 나머지 OBJID: 정미수량/발주수량 0으로 저장
updateParam.put("NET_QTY", "0");
updateParam.put("PO_QTY", "0");
}
System.out.println("MBOM_DETAIL 업데이트: " + targetObjid +
" (NET_QTY=" + updateParam.get("NET_QTY") + ", PO_QTY=" + updateParam.get("PO_QTY") + ")");
sqlSession.update("salesMng.updateMbomDetailForPurchase", updateParam);
}
} else {
// 단일 OBJID (합쳐지지 않은 경우)
System.out.println("MBOM_DETAIL 업데이트: " + objid);
sqlSession.update("salesMng.updateMbomDetailForPurchase", itemData);
}
}
}

View File

@@ -3108,7 +3108,8 @@ public class PurchaseOrderService {
fromUser = CommonUtils.checkNull((String)masterInfo.get("WRITER"));
}
boolean sendResult = MailUtil.sendMailWithAttachFile(fromUser, fromEmail, toUserIdList, toEmailList, ccEmailList, null, null, subject, mailContents, attachFileList, "PURCHASE_ORDER");
// 발주서 메일은 PURCHASE 계정 사용
boolean sendResult = MailUtil.sendMailWithAttachFile(fromUser, fromEmail, toUserIdList, toEmailList, ccEmailList, null, null, subject, mailContents, attachFileList, "PURCHASE_ORDER", Constants.Mail.ACCOUNT_TYPE_PURCHASE);
if(sendResult) {
// 메일 발송 성공 시 DB 업데이트