V2025112501 #78

Merged
leeheejin merged 2 commits from V2025112501 into main 2025-11-26 06:36:11 +00:00
12 changed files with 1881 additions and 478 deletions

View File

@@ -663,6 +663,20 @@ VALUES
SRM.PROJECT_NO,
PM.PROJECT_NO AS PROJECT_NUMBER,
PM.PROJECT_NAME,
COALESCE(
PM.OBJID,
(SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS PROJECT_MGMT_OBJID,
-- M-BOM 조회용: MBOM_HEADER에서 직접 OBJID 가져오기
(SELECT MH.OBJID FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = COALESCE(PM.OBJID, (SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1))
AND MH.STATUS = 'Y'
ORDER BY MH.REGDATE DESC LIMIT 1
) AS MBOM_HEADER_OBJID,
COALESCE(
PM.BOM_REPORT_OBJID,
(SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS BOM_REPORT_OBJID,
PM.SETUP,
SM.SUPPLY_NAME AS CUSTOMER_NAME,
SM.OBJID::VARCHAR AS CUSTOMER_OBJID, -- 고객사 OBJID (드롭다운 선택용)
@@ -705,7 +719,7 @@ VALUES
FROM
SALES_REQUEST_MASTER SRM
LEFT JOIN PROJECT_MGMT PM ON SRM.PROJECT_NO = PM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON (SRM.PROJECT_NO = PM.OBJID::VARCHAR OR SRM.PROJECT_NO = PM.PROJECT_NO)
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID::VARCHAR
LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID::VARCHAR = SM.OBJID::VARCHAR
LEFT JOIN PURCHASE_ORDER_MASTER POM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
@@ -1242,31 +1256,51 @@ VALUES
AND PM.OBJID = #{PROJECT_NO}
</select>
<!-- 전체 품목 조회 (M-BOM이 없을 때 사용) -->
<select id="getAllPartMngList" parameterType="map" resultType="map">
SELECT
PM.OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
PM.MAKER,
PM.MATERIAL,
PM.UNIT,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.UNIT) AS UNIT_TITLE
FROM PART_MNG PM
WHERE 1=1
AND PM.IS_LAST = '1'
ORDER BY PM.PART_NO
LIMIT 500
</select>
<select id="SalesBomPartListByProjectUnit" parameterType="map" resultType="map">
<!-- M-BOM 데이터 조회: PROJECT_MGMT.BOM_REPORT_OBJID -> BOM_PART_QTY -> PART_MNG -->
<!-- M-BOM 데이터 조회: getMbomList와 동일한 조인 방식 사용 (BPQ.PART_NO = PM.PART_NO) -->
SELECT
BPQ.BOM_REPORT_OBJID
,BPQ.PART_NO AS PART_OBJID
,PM.PART_NAME
,PM.PART_NO
,PM.SPEC
,PM.MAKER
,PM.REMARK
,PM.UNIT
,COALESCE(PM.PART_NO, BPQ.PART_NO, '') AS PART_NO
,COALESCE(PM.PART_NAME, '') AS PART_NAME
,COALESCE(PM.PART_NAME, '') AS PART_FULL_NAME
,COALESCE(PM.SPEC, '') AS SPEC
,BPQ.QTY AS ORDER_QTY
,COALESCE(PM.MAKER, '') AS MAKER
,'' AS REMARK
,'' AS UNIT
,NULL AS SUPPLY_OBJID
,NULL AS WRITER
FROM
PROJECT_MGMT AS PJT
INNER JOIN BOM_PART_QTY AS BPQ
ON PJT.BOM_REPORT_OBJID = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MNG AS PM
ON COALESCE(NULLIF(BPQ.LAST_PART_OBJID, ''), BPQ.PART_NO) = PM.OBJID::VARCHAR
INNER JOIN BOM_PART_QTY AS BPQ
ON PJT.BOM_REPORT_OBJID::VARCHAR = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MGMT AS PM
ON BPQ.PART_NO = PM.PART_NO
WHERE 1=1
AND PJT.OBJID = #{PROJECT_OBJID}
AND PJT.OBJID::VARCHAR = #{PROJECT_OBJID}
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
AND PJT.BOM_REPORT_OBJID IS NOT NULL
AND PJT.BOM_REPORT_OBJID != ''
ORDER BY BPQ.SEQ, PM.PART_NO
ORDER BY BPQ.SEQ
</select>
<update id="mergeReceiptSalesRequestInfo" parameterType="map">
@@ -2775,18 +2809,19 @@ UPDATE SET
</update>
<!-- 구매리스트 관련 쿼리 -->
<!-- M-BOM에서 가져온 PART_OBJID는 BPQ.PART_NO 값이므로 PART_MGMT.PART_NO와 조인 -->
<select id="getSalesRequestPartList" parameterType="string" resultType="map">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID = PM.OBJID::VARCHAR
LEFT JOIN PART_MGMT PM ON SRP.PART_OBJID = PM.PART_NO
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY SRP.REGDATE
@@ -2895,5 +2930,347 @@ UPDATE SET
UNIT_PRICE = #{UNIT_PRICE},
TOTAL_PRICE = #{TOTAL_PRICE}
</update>
<!-- 구매리스트 상세 조회 (기존 저장된 데이터) -->
<select id="getPurchaseListDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
<!-- SALES_REQUEST_PART에서 저장된 데이터 조회, PART_MNG에서 품목정보 가져옴 -->
SELECT
SRP.OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.PART_OBJID,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
0 AS ITEM_QTY,
-- 파일 개수
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE PM.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 PM.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 PM.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
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 VENDOR,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
'' AS SIZE,
'' AS RAW_MATERIAL_NO,
0 AS REQUIRED_QTY,
0 AS ORDER_QTY,
0 AS ITEM_QTY2,
0 AS PRODUCTION_QTY,
'' AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
-- 구매 관련 컬럼 (SALES_REQUEST_PART에서 조회)
COALESCE(SRP.USE_YN, 'Y') AS USE_YN,
COALESCE(SRP.NET_QTY, 0) AS NET_QTY,
COALESCE(SRP.PO_QTY, 0) AS PO_QTY,
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE,
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
SRP.PROPOSAL_DATE,
'SRP' AS DATA_SOURCE -- 데이터 소스 구분용
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY
SRP.REGDATE
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (STATUS 조건 없음, LEFT JOIN으로 모든 데이터 조회) -->
<select id="getMBomForPurchaseList" 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
) 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
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
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
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
<!-- STATUS 조건 제거하여 모든 데이터 조회 -->
)
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 AS VENDOR_PM,
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 테이블에서 추가 정보 (LEFT JOIN으로 PART_MNG에 없는 품번도 표시)
P.SPEC,
COALESCE(P.MATERIAL, V.RAW_MATERIAL) AS MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, V.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,
V.LEV,
-- 구매 컬럼들 (VIEW_BOM에서 가져온 MBOM_DETAIL 값)
V.USE_YN,
V.NET_QTY,
V.PO_QTY,
V.PROPOSAL_DATE,
'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용
FROM VIEW_BOM V
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR
WHERE 1=1
ORDER BY V.PATH2
</select>
<!-- PROJECT_OBJID로 MBOM_HEADER 조회 (PROJECT_MGMT.SOURCE_MBOM_OBJID 우선 사용) -->
<select id="getMbomHeaderByProjectId" parameterType="map" resultType="map">
SELECT
COALESCE(PM.SOURCE_MBOM_OBJID::VARCHAR, MH.OBJID::VARCHAR) AS OBJID,
PM.OBJID AS PROJECT_OBJID,
PM.PROJECT_NO
FROM PROJECT_MGMT PM
LEFT JOIN MBOM_HEADER MH ON MH.PROJECT_OBJID = PM.OBJID
WHERE PM.OBJID::VARCHAR = #{projectObjId}
ORDER BY MH.REGDATE DESC
LIMIT 1
</select>
<!-- 구매리스트 저장 - MBOM_DETAIL 업데이트 -->
<update id="updateMbomDetailForPurchase" parameterType="map">
UPDATE MBOM_DETAIL SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR = #{VENDOR_PM},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROPOSAL_DATE = CASE WHEN NULLIF(TRIM(#{PROPOSAL_DATE}::TEXT), '') IS NOT NULL THEN #{PROPOSAL_DATE}::DATE ELSE NULL END,
EDITER = #{EDITER},
EDIT_DATE = NOW()
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!-- 구매리스트 저장 - SALES_REQUEST_PART 업데이트 -->
<update id="updateSalesRequestPartForPurchase" parameterType="map">
UPDATE SALES_REQUEST_PART SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR_PM = #{VENDOR_PM},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROPOSAL_DATE = CASE WHEN NULLIF(TRIM(#{PROPOSAL_DATE}::TEXT), '') IS NOT NULL THEN #{PROPOSAL_DATE}::DATE ELSE NULL END,
WRITER = #{EDITER}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
</mapper>

View File

@@ -152,14 +152,14 @@ $(document).ready(function(){
,{name:"CLIENT_TYPE",index:"CLIENT_TYPE", width: 100, align:"center", hidden: false, sortable:false, editable:true
,edittype:"select"
,formatter:"select"
,editoptions:{
,editoptions:{
value: client_type
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
}
,dataInit : function(e){
e.style.width = "92%";
e.style.fontSize = 13;
}
}
}
,{name:"BUS_REG_NO",index:"BUS_REG_NO", width: 150, align:"center", hidden: false, sortable:false, editable:true
,editoptions:{dataInit : function(e){e.style.fontSize = 13;}}
}
@@ -513,23 +513,23 @@ function fn_count(){
var clientCd = gridData[i].CLIENT_CD;
if(clientCd && clientCd.trim() !== ""){
// AJAX로 중복 체크
$.ajax({
$.ajax({
url:"/admin/checkDuplicateClientMngList.do",
type:"POST",
type:"POST",
data:{"CLIENT_CD": clientCd},
dataType:"json",
async: false,
success:function(data){
dataType:"json",
async: false,
success:function(data){
if(data.result == "true"){
dupCnt++; // 중복
} else {
nowCnt++; // 신규
}
},
error: function(jqxhr, status, error){
},
error: function(jqxhr, status, error){
nowCnt++; // 에러 시 신규로 간주
}
});
}
});
}
}

View File

@@ -20,7 +20,7 @@ function saveClient(){
alert(result.MESSAGE || result.message);
if(result.RESULTFLAG == "true" || result.resultFlag == "true"){
if(opener && opener.fn_search){
opener.fn_search();
opener.fn_search();
}
self.close();
}

View File

@@ -21,20 +21,20 @@ function saveWarehouse(){
form.modify_dt.value = convertToDBFormat(modifyDt);
}
$.ajax({
$.ajax({
type: "POST",
url: "/admin/saveWarehouseListInfo.do",
data: $(form).serialize(),
dataType: "json",
success: function(result){
success: function(result){
alert(result.message);
if(result.resultFlag == "true"){
opener.fn_search();
self.close();
}
}
});
}
}
}
});
}
}
function convertToDBFormat(dateStr) {
@@ -70,10 +70,10 @@ function convertToDBFormat(dateStr) {
</script>
</head>
<body>
<section id="commonSection" class="admin_option_min">
<div class="admin_title">
<section id="commonSection" class="admin_option_min">
<div class="admin_title">
<h2>창고 등록/수정</h2>
</div>
</div>
<div id="businessPopupFormWrap">
<form name="warehouseForm" id="warehouseForm">
<input type="hidden" name="objid" value="${info.OBJID}">
@@ -87,94 +87,94 @@ function convertToDBFormat(dateStr) {
<tr>
<td class="input_title"><label for=""></label>위치명<label></td>
<td><input type="text" name="location_name" value="${info.LOCATION_NAME}" required></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>위치설명<label></td>
<td><input type="text" name="location_description" value="${info.LOCATION_DESCRIPTION}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>가출고코드<label></td>
<td><input type="text" name="out_code" value="${info.OUT_CODE}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>가출고거래처명<label></td>
<td><input type="text" name="out_co_name" value="${info.OUT_CO_NAME}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>적합여부<label></td>
<td>
<td>
<select name="fit_status">
<option value="">선택</option>
<option value="">선택</option>
<option value="Y" ${info.FIT_STATUS eq 'Y' ? 'selected' : ''}>적합</option>
<option value="N" ${info.FIT_STATUS eq 'N' ? 'selected' : ''}>부적합</option>
</select>
</td>
</tr>
</select>
</td>
</tr>
<tr>
<td class="input_title"><label for=""></label>가용재고여부<label></td>
<td>
<td>
<select name="available_status">
<option value="">선택</option>
<option value="">선택</option>
<option value="Y" ${info.AVAILABLE_STATUS eq 'Y' ? 'selected' : ''}>여</option>
<option value="N" ${info.AVAILABLE_STATUS eq 'N' ? 'selected' : ''}>부</option>
</select>
</td>
</tr>
</select>
</td>
</tr>
<tr>
<td class="input_title"><label for=""></label>사용여부<label></td>
<td>
<select name="use_status">
<option value="Y" ${empty info.USE_STATUS or info.USE_STATUS eq 'Y' ? 'selected' : ''}>사용</option>
<option value="N" ${info.USE_STATUS eq 'N' ? 'selected' : ''}>미사용</option>
</select>
</td>
</tr>
</select>
</td>
</tr>
<tr>
<td class="input_title"><label for=""></label>BASELOC_CD<label></td>
<td><input type="text" name="base_loc_cd" value="${info.BASE_LOC_CD}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>CO_CD<label></td>
<td><input type="text" name="co_cd" value="${info.CO_CD}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>LOC_NMK<label></td>
<td><input type="text" name="loc_nmk" value="${info.LOC_NMK}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>INSERT_ID<label></td>
<td><input type="text" name="insert_id" value="${info.INSERT_ID}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>INSERT_IP<label></td>
<td><input type="text" name="insert_ip" value="${info.INSERT_IP}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>INSERT_DT<label></td>
<td><input type="text" name="insert_dt" value="${info.INSERT_DT}" placeholder="YYYY-MM-DD HH:MM:SS"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>MODIFY_ID<label></td>
<td><input type="text" name="modify_id" value="${info.MODIFY_ID}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>MODIFY_IP<label></td>
<td><input type="text" name="modify_ip" value="${info.MODIFY_IP}"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>MODIFY_DT<label></td>
<td><input type="text" name="modify_dt" value="${info.MODIFY_DT}" placeholder="YYYY-MM-DD HH:MM:SS"></td>
</tr>
</tr>
<tr>
<td class="input_title"><label for=""></label>ATTR_NMK<label></td>
<td><input type="text" name="attr_nmk" value="${info.ATTR_NMK}"></td>
</tr>
</table>
</tr>
</table>
</form>
</div>
<div id="adminPopupBtnWrap">
</div>
<div id="adminPopupBtnWrap">
<button type="button" class="btns" onclick="saveWarehouse()">저장</button>
</div>
</section>
</div>
</section>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -178,6 +178,8 @@ $("#REQUEST_CD,#PROJECT_NO,#CUSTOMER_NAME,#PRODUCT_NAME,#MECHANICAL_TYPE,#PROJEC
}
}
// ★★★ M-BOM 품목 자동 로드 ★★★
fn_loadMbomParts($(this).val());
}
});
@@ -296,14 +298,35 @@ function fn_getSalesRequestTargetPartList(masterObjId,bomObjId){
});
$("#partListArea").append(appendText);
// 프로젝트번호가 설정되어 있는지 확인하고, 없으면 품번 드롭다운을 채울 수 없음
var projectNo = $("#PROJECT_NO").val();
if(!projectNo || projectNo == "") {
console.warn("프로젝트번호가 선택되지 않아 품번 목록을 불러올 수 없습니다.");
}
$.each(resultData, function(i){
var rowObjId = fnc_checkNull(resultData[i].OBJID);
var PART_OBJID = fnc_checkNull(resultData[i].PART_OBJID);
var PART_NO = fnc_checkNull(resultData[i].PART_NO);
var PART_NAME = fnc_checkNull(resultData[i].PART_NAME);
// 공급업체 제거로 주석처리
// var PARTNER_OBJID = fnc_checkNull(resultData[i].PARTNER_OBJID);
// fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, PARTNER_OBJID);
// $("#PARTNER_OBJID_"+rowObjId).val(PARTNER_OBJID);
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId,"");
// M-BOM에 없는 품번이면 수동으로 추가
if(PART_OBJID != "" && PART_NO != "") {
var selectBox = $("#PART_OBJID_"+rowObjId);
// 이미 옵션이 있는지 확인
if(selectBox.find("option[value='"+PART_OBJID+"']").length == 0) {
selectBox.append("<option value='"+PART_OBJID+"'>"+PART_NO+"</option>");
}
selectBox.val(PART_OBJID);
$("#PART_NAME_"+rowObjId).val(PART_NAME);
}
});
$(".select2").select2();
},
@@ -469,44 +492,122 @@ function fn_Supply_save(){
}
}
// ★★★ 프로젝트 선택 시 M-BOM 품목 자동 로드 ★★★
function fn_loadMbomParts(projectObjId){
if(fnc_checkNull(projectObjId) == "") return;
console.log("M-BOM 품목 로드 시작, PROJECT_OBJID:", projectObjId);
// M-BOM 품목 조회
var paramData = {"sqlId":"salesMng.SalesBomPartListByProjectUnit", "PROJECT_OBJID":projectObjId};
var resultList = fnc_getJsonAllDataListBySqlId(paramData);
console.log("M-BOM 품목 조회 결과:", resultList);
if(resultList && resultList.length > 0){
// 기존 품목 초기화
$("#partListArea").empty();
// M-BOM 품목을 행으로 추가
$.each(resultList, function(i, item){
var rowObjId = fnc_createObjId();
var PART_OBJID = fnc_checkNull(item.PART_OBJID);
var PART_NO = fnc_checkNull(item.PART_NO);
var PART_NAME = fnc_checkNull(item.PART_FULL_NAME) || fnc_checkNull(item.PART_NAME);
var QTY = fnc_checkNull(item.ORDER_QTY) || 1;
var appendText = "";
appendText += "<tr class='dataTr' id='"+rowObjId+"'>";
appendText += " <input type='hidden' name='OBJID' value='"+rowObjId+"' class='TARGET_OBJID'>";
appendText += " <td class='align_c'>";
appendText += " <input type='checkbox' name='chkOBJID"+rowObjId+"' value='"+rowObjId+"' class='chkBox'>";
appendText += " </td>";
appendText += " <td class='align_l'>";
appendText += " <select name='PART_OBJID_"+rowObjId+"' id='PART_OBJID_"+rowObjId+"' reqTitle='품번' type='select' class='select2' style='width: 100%;'>";
appendText += " <option value='"+PART_OBJID+"'>"+PART_NO+"</option>";
appendText += " </select>";
appendText += " </td>";
appendText += " <td class='align_l'>";
appendText += " <input type='text' name='PART_NAME_"+rowObjId+"' id='PART_NAME_"+rowObjId+"' value='"+PART_NAME+"' readonly style='width: 100%;'>";
appendText += " </td>";
appendText += " <td class='align_c'>";
appendText += " <input type='number' name='QTY_"+rowObjId+"' value='"+QTY+"' reqTitle='수량' required style='text-align: center;'>";
appendText += " </td>";
appendText += "</tr>";
$("#partListArea").append(appendText);
// 품번 드롭다운에 M-BOM 전체 품목 옵션 추가
fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId, "");
});
$(".select2").select2();
console.log("M-BOM 품목 " + resultList.length + "건 로드 완료");
} else {
console.log("M-BOM 품목이 없습니다.");
}
}
//계약제품, 업체명으로 BOM에 등록된 부품정보를 자동 추가
function fn_addBomPart(selectboxId,selectedVal,sql_id,sql_supply){
$("#BOM_REPORT_OBJID").val("");
//var type = $("#TYPE").val(); //발주부품
var project_objid = $("#PROJECT_NO").val(); //프로젝트명
var unit_code = $("#UNIT_NAME").val(); //유닛명
//var partner_objid = $("#PARTNER_OBJID").val(); //공급업체
//console.log('type:'+type + ' contract_mgmt_objid:'+contract_mgmt_objid + ' unit_code:'+unit_code + ' partner_objid:'+partner_objid);
$("#"+selectboxId).empty();
$("#"+selectboxId).append("<option value=''>선택</option>");
//프로젝트번호만 있으면 품번 조회 가능 (유닛명은 선택사항)
var resultList = [];
// 1. 프로젝트가 선택되어 있으면 M-BOM 품목 먼저 조회
if(fnc_checkNull(project_objid)!=""){
$("#"+selectboxId).empty();
$("#"+selectboxId).append("<option value=''>선택</option>");
//구매BOM 조회해서 부품정보를 가져온다
var paramData = {"sqlId":"salesMng.SalesBomPartListByProjectUnit", "PROJECT_OBJID":project_objid};
// 유닛명이 있으면 추가
if(fnc_checkNull(unit_code)!=""){
paramData.UNIT_CODE = unit_code;
}
var resultList = fnc_getJsonAllDataListBySqlId(paramData);
resultList = fnc_getJsonAllDataListBySqlId(paramData);
console.log("M-BOM 품목 조회 결과:", resultList.length, "건");
}
// 2. M-BOM 품목이 없으면 전체 PART_MNG에서 조회
if(resultList.length == 0){
console.log("M-BOM 품목이 없어 전체 품목에서 조회합니다.");
var allPartData = {"sqlId":"salesMng.getAllPartMngList"};
resultList = fnc_getJsonAllDataListBySqlId(allPartData);
console.log("전체 품목 조회 결과:", resultList.length, "건");
// 전체 품목 조회 결과 처리
if(0 < resultList.length){
for (var i = 0; i < resultList.length; i++) {
var commonCodeId = resultList[i].PART_OBJID;
var commonCodeId = resultList[i].OBJID;
var commonCodeName = resultList[i].PART_NO;
var partName = resultList[i].PART_NAME;
var supplyObjid = resultList[i].SUPPLY_OBJID;
$("#"+selectboxId).append("<option value='"+commonCodeId+"' data-part_name='"+partName+"' data-supplyObjid='"+supplyObjid+"'>"+commonCodeName+"</option>");
$("#"+selectboxId).append("<option value='"+commonCodeId+"' data-part_name='"+partName+"'>"+commonCodeName+"</option>");
}
$("#"+selectboxId).val(selectedVal);
$("#"+selectboxId).change(function(){
$("#"+sql_id).val($(this).find("option:selected").attr("data-part_name"));
$("#"+sql_supply).val($(this).find("option:selected").attr("data-supplyObjid"));
});
}
} else {
// M-BOM 품목 처리
for (var i = 0; i < resultList.length; i++) {
var commonCodeId = resultList[i].PART_OBJID;
var commonCodeName = resultList[i].PART_NO;
var partName = resultList[i].PART_NAME || resultList[i].PART_FULL_NAME;
var supplyObjid = resultList[i].SUPPLY_OBJID;
$("#"+selectboxId).append("<option value='"+commonCodeId+"' data-part_name='"+partName+"' data-supplyObjid='"+supplyObjid+"'>"+commonCodeName+"</option>");
}
}
// 선택값 설정 및 change 이벤트 바인딩
if(fnc_checkNull(selectedVal) != ""){
$("#"+selectboxId).val(selectedVal);
}
$("#"+selectboxId).off("change").on("change", function(){
$("#"+sql_id).val($(this).find("option:selected").attr("data-part_name"));
if(sql_supply){
$("#"+sql_supply).val($(this).find("option:selected").attr("data-supplyObjid"));
}
});
$("#"+selectboxId).trigger("change");
}

View File

@@ -100,7 +100,7 @@ $(document).ready(function(){
//구매요청서 작성
$("#btnOrderReg").click(function(){
fn_openSalesRequestPopUp("");
fn_openSalesRequestFormPopUp("");
});
//품의서 생성 (TODO: 품의서 생성 기능 구현 필요 - 기존 발주서 작성 기능과 다름)
@@ -221,16 +221,16 @@ var columns = [
,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 }
,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4}
,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 }
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1,
formatter: function(cell, formatterParams, onRendered){
var objid = fnc_checkNull(cell.getData().OBJID);
var iconClass = (objid != '' && objid != null) ? 'file_icon' : 'file_empty_icon';
return '<a href="#" class="File ' + iconClass + '" style="width:20px; height:20px; display:inline-block;"></a>';
},
cellClick : function(e, cell) {
fn_openSalesRequestPopUp(cell.getData().OBJID);
,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1,
formatter: function(cell, formatterParams, onRendered){
var objid = fnc_checkNull(cell.getData().OBJID);
var iconClass = (objid != '' && objid != null) ? 'file_icon' : 'file_empty_icon';
return '<a href="#" class="File ' + iconClass + '" style="width:20px; height:20px; display:inline-block;"></a>';
},
cellClick : function(e, cell) {
fn_openSalesRequestFormPopUp(cell.getData().OBJID);
}
}
}
,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1 }
,{headerHozAlign : 'center', hozAlign : 'center', title : "입고요청일", field :"DELIVERY_REQUEST_DATE" , widthGrow:1.1 }
,{headerHozAlign : 'center', hozAlign : 'center', title : "작성일", field :"REGDATE_TITLE" , widthGrow:1.1 }
@@ -281,17 +281,16 @@ function fn_salesRequestTargetBOMListPopUp(){
window.open(url,"salesRequestTargetBOMListPopUp","width=1300,height=550");
}
//구매의뢰 요청 팝업
//구매의뢰 요청 팝업 (요청번호 클릭 시 - 구매리스트 화면)
function fn_openSalesRequestPopUp(objId){
var url = "";
if("" == objId){
url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
}else{
//url = "/salesMng/salesRequestDetailPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
}
window.open(url,"salesRequestPopUp","width=1100,height=630");
var url = "/salesMng/purchaseListFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes");
}
//구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시)
function fn_openSalesRequestFormPopUp(objId){
var url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId;
window.open(url,"salesRequestFormPopUp","width=1100,height=630");
}
function fn_releaseSalesRequest(){

View File

@@ -0,0 +1,17 @@
-- SALES_REQUEST_PART 테이블에 구매리스트 필수 컬럼만 추가
-- 기존: OBJID, PART_OBJID, SALES_REQUEST_MASTER_OBJID, QTY, PARTNER_OBJID, PARTNER_PRICE, WRITER, REGDATE 등
ALTER TABLE SALES_REQUEST_PART
ADD COLUMN IF NOT EXISTS PART_NO VARCHAR(100), -- 품번 (직접 입력용)
ADD COLUMN IF NOT EXISTS PART_NAME VARCHAR(200), -- 품명 (직접 입력용)
ADD COLUMN IF NOT EXISTS UNIT_PRICE VARCHAR(50), -- 단가
ADD COLUMN IF NOT EXISTS TOTAL_PRICE VARCHAR(50), -- 총단가
ADD COLUMN IF NOT EXISTS PROPOSAL_DATE DATE; -- 품의서작성일
-- 컬럼 설명
COMMENT ON COLUMN SALES_REQUEST_PART.PART_NO IS '품번';
COMMENT ON COLUMN SALES_REQUEST_PART.PART_NAME IS '품명';
COMMENT ON COLUMN SALES_REQUEST_PART.UNIT_PRICE IS '단가';
COMMENT ON COLUMN SALES_REQUEST_PART.TOTAL_PRICE IS '총단가';
COMMENT ON COLUMN SALES_REQUEST_PART.PROPOSAL_DATE IS '품의서작성일';

View File

@@ -0,0 +1,39 @@
-- SALES_REQUEST_PART 테이블에 구매관리 관련 컬럼 추가
-- 실행 전 백업 권장
-- 사용여부
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS USE_YN VARCHAR(1) DEFAULT 'Y';
COMMENT ON COLUMN SALES_REQUEST_PART.USE_YN IS '사용여부 (Y/N)';
-- 정미수량
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS NET_QTY NUMERIC DEFAULT 0;
COMMENT ON COLUMN SALES_REQUEST_PART.NET_QTY IS '정미수량';
-- 발주수량
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS PO_QTY NUMERIC DEFAULT 0;
COMMENT ON COLUMN SALES_REQUEST_PART.PO_QTY IS '발주수량';
-- 공급업체2 (기준정보에서 선택)
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS VENDOR_PM VARCHAR(255);
COMMENT ON COLUMN SALES_REQUEST_PART.VENDOR_PM IS '공급업체2 (기준정보_협력업체관리)';
-- 단가
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS UNIT_PRICE NUMERIC DEFAULT 0;
COMMENT ON COLUMN SALES_REQUEST_PART.UNIT_PRICE IS '단가';
-- 총단가
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS TOTAL_PRICE NUMERIC DEFAULT 0;
COMMENT ON COLUMN SALES_REQUEST_PART.TOTAL_PRICE IS '총단가 (발주수량 * 단가)';
-- 품의서작성일
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS PROPOSAL_DATE DATE;
COMMENT ON COLUMN SALES_REQUEST_PART.PROPOSAL_DATE IS '품의서작성일';
-- 수정자
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS EDITER VARCHAR(50);
COMMENT ON COLUMN SALES_REQUEST_PART.EDITER IS '수정자';
-- 수정일
ALTER TABLE SALES_REQUEST_PART ADD COLUMN IF NOT EXISTS EDIT_DATE TIMESTAMP;
COMMENT ON COLUMN SALES_REQUEST_PART.EDIT_DATE IS '수정일';

View File

@@ -663,6 +663,20 @@ VALUES
SRM.PROJECT_NO,
PM.PROJECT_NO AS PROJECT_NUMBER,
PM.PROJECT_NAME,
COALESCE(
PM.OBJID,
(SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS PROJECT_MGMT_OBJID,
-- M-BOM 조회용: MBOM_HEADER에서 직접 OBJID 가져오기
(SELECT MH.OBJID FROM MBOM_HEADER MH
WHERE MH.PROJECT_OBJID = COALESCE(PM.OBJID, (SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1))
AND MH.STATUS = 'Y'
ORDER BY MH.REGDATE DESC LIMIT 1
) AS MBOM_HEADER_OBJID,
COALESCE(
PM.BOM_REPORT_OBJID,
(SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1)
) AS BOM_REPORT_OBJID,
PM.SETUP,
SM.SUPPLY_NAME AS CUSTOMER_NAME,
SM.OBJID::VARCHAR AS CUSTOMER_OBJID, -- 고객사 OBJID (드롭다운 선택용)
@@ -705,7 +719,7 @@ VALUES
FROM
SALES_REQUEST_MASTER SRM
LEFT JOIN PROJECT_MGMT PM ON SRM.PROJECT_NO = PM.OBJID::VARCHAR
LEFT JOIN PROJECT_MGMT PM ON (SRM.PROJECT_NO = PM.OBJID::VARCHAR OR SRM.PROJECT_NO = PM.PROJECT_NO)
LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID::VARCHAR
LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID::VARCHAR = SM.OBJID::VARCHAR
LEFT JOIN PURCHASE_ORDER_MASTER POM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
@@ -1242,31 +1256,51 @@ VALUES
AND PM.OBJID = #{PROJECT_NO}
</select>
<!-- 전체 품목 조회 (M-BOM이 없을 때 사용) -->
<select id="getAllPartMngList" parameterType="map" resultType="map">
SELECT
PM.OBJID,
PM.PART_NO,
PM.PART_NAME,
PM.SPEC,
PM.MAKER,
PM.MATERIAL,
PM.UNIT,
(SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PM.UNIT) AS UNIT_TITLE
FROM PART_MNG PM
WHERE 1=1
AND PM.IS_LAST = '1'
ORDER BY PM.PART_NO
LIMIT 500
</select>
<select id="SalesBomPartListByProjectUnit" parameterType="map" resultType="map">
<!-- M-BOM 데이터 조회: PROJECT_MGMT.BOM_REPORT_OBJID -> BOM_PART_QTY -> PART_MNG -->
<!-- M-BOM 데이터 조회: getMbomList와 동일한 조인 방식 사용 (BPQ.PART_NO = PM.PART_NO) -->
SELECT
BPQ.BOM_REPORT_OBJID
,BPQ.PART_NO AS PART_OBJID
,PM.PART_NAME
,PM.PART_NO
,PM.SPEC
,PM.MAKER
,PM.REMARK
,PM.UNIT
,COALESCE(PM.PART_NO, BPQ.PART_NO, '') AS PART_NO
,COALESCE(PM.PART_NAME, '') AS PART_NAME
,COALESCE(PM.PART_NAME, '') AS PART_FULL_NAME
,COALESCE(PM.SPEC, '') AS SPEC
,BPQ.QTY AS ORDER_QTY
,COALESCE(PM.MAKER, '') AS MAKER
,'' AS REMARK
,'' AS UNIT
,NULL AS SUPPLY_OBJID
,NULL AS WRITER
FROM
PROJECT_MGMT AS PJT
INNER JOIN BOM_PART_QTY AS BPQ
ON PJT.BOM_REPORT_OBJID = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MNG AS PM
ON COALESCE(NULLIF(BPQ.LAST_PART_OBJID, ''), BPQ.PART_NO) = PM.OBJID::VARCHAR
INNER JOIN BOM_PART_QTY AS BPQ
ON PJT.BOM_REPORT_OBJID::VARCHAR = BPQ.BOM_REPORT_OBJID::VARCHAR
LEFT JOIN PART_MGMT AS PM
ON BPQ.PART_NO = PM.PART_NO
WHERE 1=1
AND PJT.OBJID = #{PROJECT_OBJID}
AND PJT.OBJID::VARCHAR = #{PROJECT_OBJID}
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
AND PJT.BOM_REPORT_OBJID IS NOT NULL
AND PJT.BOM_REPORT_OBJID != ''
ORDER BY BPQ.SEQ, PM.PART_NO
ORDER BY BPQ.SEQ
</select>
<update id="mergeReceiptSalesRequestInfo" parameterType="map">
@@ -2775,18 +2809,19 @@ UPDATE SET
</update>
<!-- 구매리스트 관련 쿼리 -->
<!-- M-BOM에서 가져온 PART_OBJID는 BPQ.PART_NO 값이므로 PART_MGMT.PART_NO와 조인 -->
<select id="getSalesRequestPartList" parameterType="string" resultType="map">
SELECT
SRP.OBJID,
SRP.PART_OBJID,
PM.PART_NO,
PM.PART_NAME,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
SRP.PARTNER_OBJID,
SRP.PARTNER_PRICE
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID = PM.OBJID::VARCHAR
LEFT JOIN PART_MGMT PM ON SRP.PART_OBJID = PM.PART_NO
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY SRP.REGDATE
@@ -2895,5 +2930,347 @@ UPDATE SET
UNIT_PRICE = #{UNIT_PRICE},
TOTAL_PRICE = #{TOTAL_PRICE}
</update>
<!-- 구매리스트 상세 조회 (기존 저장된 데이터) -->
<select id="getPurchaseListDetail" parameterType="map" resultType="com.pms.common.UpperKeyMap">
<!-- SALES_REQUEST_PART에서 저장된 데이터 조회, PART_MNG에서 품목정보 가져옴 -->
SELECT
SRP.OBJID,
SRP.SALES_REQUEST_MASTER_OBJID,
SRP.PART_OBJID,
COALESCE(PM.PART_NO, '') AS PART_NO,
COALESCE(PM.PART_NAME, '') AS PART_NAME,
SRP.QTY,
0 AS ITEM_QTY,
-- 파일 개수
(SELECT COUNT(1) FROM ATTACH_FILE_INFO F WHERE PM.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 PM.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 PM.OBJID = F.TARGET_OBJID AND F.STATUS = 'Active' AND F.DOC_TYPE IN ('2D_PDF_CAD')) AS CU03_CNT,
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 VENDOR,
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
'' AS SUPPLY_TYPE,
'' AS RAW_MATERIAL,
'' AS SIZE,
'' AS RAW_MATERIAL_NO,
0 AS REQUIRED_QTY,
0 AS ORDER_QTY,
0 AS ITEM_QTY2,
0 AS PRODUCTION_QTY,
'' AS PROCESSING_VENDOR,
NULL AS PROCESSING_DEADLINE,
NULL AS GRINDING_DEADLINE,
-- 구매 관련 컬럼 (SALES_REQUEST_PART에서 조회)
COALESCE(SRP.USE_YN, 'Y') AS USE_YN,
COALESCE(SRP.NET_QTY, 0) AS NET_QTY,
COALESCE(SRP.PO_QTY, 0) AS PO_QTY,
COALESCE(SRP.VENDOR_PM, SRP.PARTNER_OBJID) AS VENDOR_PM,
COALESCE(SRP.UNIT_PRICE, NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE,
COALESCE(SRP.TOTAL_PRICE, 0) AS TOTAL_PRICE,
SRP.PROPOSAL_DATE,
'SRP' AS DATA_SOURCE -- 데이터 소스 구분용
FROM
SALES_REQUEST_PART SRP
LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR
WHERE
SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID}
ORDER BY
SRP.REGDATE
</select>
<!-- M-BOM에서 구매리스트 데이터 가져오기 (STATUS 조건 없음, LEFT JOIN으로 모든 데이터 조회) -->
<select id="getMBomForPurchaseList" 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
) 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
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
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
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
<!-- STATUS 조건 제거하여 모든 데이터 조회 -->
)
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 AS VENDOR_PM,
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 테이블에서 추가 정보 (LEFT JOIN으로 PART_MNG에 없는 품번도 표시)
P.SPEC,
COALESCE(P.MATERIAL, V.RAW_MATERIAL) AS MATERIAL,
P.WEIGHT,
P.PART_TYPE,
P.REVISION,
COALESCE(P.MAKER, V.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,
V.LEV,
-- 구매 컬럼들 (VIEW_BOM에서 가져온 MBOM_DETAIL 값)
V.USE_YN,
V.NET_QTY,
V.PO_QTY,
V.PROPOSAL_DATE,
'MBOM' AS DATA_SOURCE -- 데이터 소스 구분용
FROM VIEW_BOM V
LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = V.PART_OBJID::VARCHAR
WHERE 1=1
ORDER BY V.PATH2
</select>
<!-- PROJECT_OBJID로 MBOM_HEADER 조회 (PROJECT_MGMT.SOURCE_MBOM_OBJID 우선 사용) -->
<select id="getMbomHeaderByProjectId" parameterType="map" resultType="map">
SELECT
COALESCE(PM.SOURCE_MBOM_OBJID::VARCHAR, MH.OBJID::VARCHAR) AS OBJID,
PM.OBJID AS PROJECT_OBJID,
PM.PROJECT_NO
FROM PROJECT_MGMT PM
LEFT JOIN MBOM_HEADER MH ON MH.PROJECT_OBJID = PM.OBJID
WHERE PM.OBJID::VARCHAR = #{projectObjId}
ORDER BY MH.REGDATE DESC
LIMIT 1
</select>
<!-- 구매리스트 저장 - MBOM_DETAIL 업데이트 -->
<update id="updateMbomDetailForPurchase" parameterType="map">
UPDATE MBOM_DETAIL SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR = #{VENDOR_PM},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROPOSAL_DATE = CASE WHEN NULLIF(TRIM(#{PROPOSAL_DATE}::TEXT), '') IS NOT NULL THEN #{PROPOSAL_DATE}::DATE ELSE NULL END,
EDITER = #{EDITER},
EDIT_DATE = NOW()
WHERE OBJID::VARCHAR = #{OBJID}
</update>
<!-- 구매리스트 저장 - SALES_REQUEST_PART 업데이트 -->
<update id="updateSalesRequestPartForPurchase" parameterType="map">
UPDATE SALES_REQUEST_PART SET
USE_YN = #{USE_YN},
NET_QTY = COALESCE(NULLIF(TRIM(#{NET_QTY}::TEXT), '')::NUMERIC, 0),
PO_QTY = COALESCE(NULLIF(TRIM(#{PO_QTY}::TEXT), '')::NUMERIC, 0),
VENDOR_PM = #{VENDOR_PM},
UNIT_PRICE = COALESCE(NULLIF(TRIM(#{UNIT_PRICE}::TEXT), '')::NUMERIC, 0),
TOTAL_PRICE = COALESCE(NULLIF(TRIM(#{TOTAL_PRICE}::TEXT), '')::NUMERIC, 0),
PROPOSAL_DATE = CASE WHEN NULLIF(TRIM(#{PROPOSAL_DATE}::TEXT), '') IS NOT NULL THEN #{PROPOSAL_DATE}::DATE ELSE NULL END,
WRITER = #{EDITER}
WHERE OBJID::VARCHAR = #{OBJID}
</update>
</mapper>

View File

@@ -1095,23 +1095,90 @@ public class SalesMngController {
*/
@RequestMapping("/salesMng/purchaseListFormPopUp.do")
public String purchaseListFormPopUp(HttpServletRequest request, @RequestParam Map paramMap){
Map resultMap = new HashMap();
try{
String salesRequestMasterObjId = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID"));
String projectMgmtObjId = CommonUtils.checkNull(paramMap.get("PROJECT_MGMT_OBJID"));
if(!"".equals(salesRequestMasterObjId)){
// 기존 구매리스트 조회
resultMap = salesMngService.getSalesRequestMasterInfo(request, paramMap);
}else if(!"".equals(projectMgmtObjId)){
// M-BOM에서 새로 생성
resultMap.put("OBJID", CommonUtils.createObjId());
resultMap.put("STATUS", "create");
}else{
resultMap.put("OBJID", CommonUtils.createObjId());
resultMap.put("STATUS", "create");
}
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("resultMap", resultMap);
return "/salesMng/purchaseListFormPopUp";
}
/**
* 구매리스트 데이터 조회
* 구매리스트 상세 조회 (기존 구매리스트)
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/salesMng/getPurchaseListData.do")
public Map getPurchaseListData(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
@RequestMapping("/salesMng/getPurchaseListDetail.do")
public Map getPurchaseListDetail(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map resultMap = new HashMap();
try{
resultMap = salesMngService.getPurchaseListData(request, paramMap);
List<Map> list = salesMngService.getPurchaseListDetail(request, paramMap);
resultMap.put("list", list);
}catch(Exception e){
e.printStackTrace();
resultMap.put("list", new ArrayList());
}
return resultMap;
}
/**
* M-BOM에서 구매리스트 생성
* @param request
* @param paramMap
* @return
*/
@ResponseBody
@RequestMapping("/salesMng/getMBomForPurchaseList.do")
public Map getMBomForPurchaseList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
Map resultMap = new HashMap();
try{
System.out.println("========== getMBomForPurchaseList 호출 ==========");
System.out.println("paramMap: " + paramMap);
System.out.println("PROJECT_MGMT_OBJID: " + paramMap.get("PROJECT_MGMT_OBJID"));
System.out.println("bomReportObjId: " + paramMap.get("bomReportObjId"));
List<Map> list = salesMngService.getMBomForPurchaseList(request, paramMap);
// 키를 대문자로 변환
List<Map<String, Object>> upperList = new ArrayList<Map<String, Object>>();
if(list != null) {
for(Map item : list) {
Map<String, Object> upperItem = new HashMap<String, Object>();
for(Object key : item.keySet()) {
upperItem.put(key.toString().toUpperCase(), item.get(key));
}
upperList.add(upperItem);
}
}
System.out.println("결과 리스트 크기: " + upperList.size());
if(!upperList.isEmpty()) {
System.out.println("첫번째 항목: " + upperList.get(0));
}
resultMap.put("list", upperList);
}catch(Exception e){
System.out.println("getMBomForPurchaseList 오류 발생!");
e.printStackTrace();
resultMap.put("list", new ArrayList());
}
return resultMap;
}

View File

@@ -1736,15 +1736,23 @@ public class SalesMngService {
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
String salesRequestMasterObjid = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID"));
String partListJson = CommonUtils.checkNull(paramMap.get("partList"));
String purchaseListJson = CommonUtils.checkNull(paramMap.get("purchaseListData"));
// JSON 파싱 - 기존 코드 참고하여 간단하게 처리
// partListJson이 이미 파싱된 상태일 수 있으므로 직접 처리
List<Map> partList = new ArrayList<Map>();
// TODO: JSON 파싱 로직 추가 필요
System.out.println("========== savePurchaseList ==========");
System.out.println("salesRequestMasterObjid: " + salesRequestMasterObjid);
System.out.println("purchaseListJson length: " + purchaseListJson.length());
if(partList == null || partList.isEmpty()) {
resultMap.put("result", "error");
// JSON 파싱
List<Map> purchaseList = new ArrayList<Map>();
if(purchaseListJson != null && !purchaseListJson.isEmpty()) {
org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
purchaseList = mapper.readValue(purchaseListJson, List.class);
}
System.out.println("purchaseList size: " + purchaseList.size());
if(purchaseList == null || purchaseList.isEmpty()) {
resultMap.put("resultFlag", "F");
resultMap.put("message", "저장할 데이터가 없습니다.");
return resultMap;
}
@@ -1754,29 +1762,36 @@ public class SalesMngService {
PersonBean personBean = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
String userId = personBean.getUserId();
// 각 품목별로 구매리스트 정보 저장
for(Map partData : partList) {
String objid = CommonUtils.checkNull(partData.get("OBJID"));
// 각 품목별로 데이터 소스에 따라 다른 테이블 업데이트
for(Map itemData : purchaseList) {
String objid = CommonUtils.checkNull(itemData.get("OBJID"));
String dataSource = CommonUtils.checkNull(itemData.get("DATA_SOURCE"));
if(objid.isEmpty()) {
objid = CommonUtils.createObjId();
System.out.println("OBJID가 없는 항목 스킵");
continue;
}
partData.put("OBJID", objid);
partData.put("SALES_REQUEST_MASTER_OBJID", salesRequestMasterObjid);
partData.put("WRITER", userId);
itemData.put("EDITER", userId);
// SALES_REQUEST_PART 테이블에 저장
sqlSession.insert("salesMng.mergePurchaseListInfo", partData);
if("SRP".equals(dataSource)) {
// SALES_REQUEST_PART 테이블 업데이트 (구매요청서에서 수동 추가한 품목)
System.out.println("SALES_REQUEST_PART 업데이트: " + objid);
sqlSession.update("salesMng.updateSalesRequestPartForPurchase", itemData);
} else {
// MBOM_DETAIL 테이블 업데이트 (M-BOM에서 가져온 품목)
System.out.println("MBOM_DETAIL 업데이트: " + objid);
sqlSession.update("salesMng.updateMbomDetailForPurchase", itemData);
}
}
resultMap.put("result", "success");
resultMap.put("resultFlag", "S");
resultMap.put("message", "저장되었습니다.");
sqlSession.commit();
} catch(Exception e) {
if(sqlSession != null) sqlSession.rollback();
resultMap.put("result", "error");
resultMap.put("resultFlag", "F");
resultMap.put("message", "저장 중 오류가 발생했습니다: " + e.getMessage());
e.printStackTrace();
} finally {
@@ -1785,4 +1800,53 @@ public class SalesMngService {
return resultMap;
}
/**
* 구매리스트 상세 조회 (기존 저장된 데이터)
* @param request
* @param paramMap
* @return
* @throws Exception
*/
public List<Map> getPurchaseListDetail(HttpServletRequest request, Map<String, Object> paramMap) throws Exception {
SqlSession sqlSession = null;
List<Map> resultList = new ArrayList<Map>();
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
resultList = sqlSession.selectList("salesMng.getPurchaseListDetail", paramMap);
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
if(sqlSession != null) sqlSession.close();
}
return resultList;
}
/**
* M-BOM에서 구매리스트 데이터 가져오기
* @param request
* @param paramMap
* @return
* @throws Exception
*/
public List<Map> getMBomForPurchaseList(HttpServletRequest request, Map<String, Object> paramMap) throws Exception {
SqlSession sqlSession = null;
List<Map> resultList = new ArrayList<Map>();
try {
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
// M-BOM 데이터 조회 (레벨 구조 없이 평평하게)
resultList = sqlSession.selectList("salesMng.getMBomForPurchaseList", paramMap);
} catch(Exception e) {
e.printStackTrace();
throw e;
} finally {
if(sqlSession != null) sqlSession.close();
}
return resultList;
}
}