V2026012702 #133
@@ -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
|
||||
|
||||
@@ -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 방식 팝업 전송용 -->
|
||||
|
||||
@@ -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. 품명
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 단가 초기화 (재수주 시 기존 단가 삭제) -->
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 업데이트
|
||||
|
||||
Reference in New Issue
Block a user