Merge branch 'main' into V20251023001
This commit is contained in:
@@ -76,6 +76,19 @@ $(document).ready(function(){
|
||||
|
||||
fn_search();
|
||||
});
|
||||
|
||||
//정전개 조회
|
||||
$("#btnSearchAscending").click(function(){
|
||||
$("#searchType").val("ascending");
|
||||
fn_search();
|
||||
});
|
||||
|
||||
//역전개 조회
|
||||
$("#btnSearchDescending").click(function(){
|
||||
$("#searchType").val("descending");
|
||||
fn_search();
|
||||
});
|
||||
|
||||
$("#btnExcel").click(function(){
|
||||
|
||||
$("#search_partNo").val($.trim($("#search_partNo").val()));
|
||||
@@ -690,18 +703,25 @@ function fn_excelExport(pGridObj,pFileName){
|
||||
<form name="form1" id="form1" action="" method="post">
|
||||
<input type="hidden" name="search" id="search" value="Y">
|
||||
<input type="hidden" name="actionType" id="actionType" value="" />
|
||||
<input type="hidden" name="searchType" id="searchType" value="ascending" />
|
||||
<div class="min_part_enroll">
|
||||
<div class="content-box">
|
||||
<div class=""> <!-- content-box-s -->
|
||||
<div class=plm_menu_name_gdnsi>
|
||||
<h2>
|
||||
<span>제품관리_BOM 조회</span>
|
||||
<c:if test="${!empty param.searchType}">
|
||||
<span style="font-size: 14px; color: #666; margin-left: 10px;">
|
||||
(${param.searchType eq 'descending' ? '역전개' : '정전개'})
|
||||
</span>
|
||||
</c:if>
|
||||
</h2>
|
||||
<div class="btnArea">
|
||||
<!--
|
||||
<input type="button" value="Excel Download" class="plm_btns" id="btnExcel">
|
||||
-->
|
||||
<input type="button" value="조회" class="plm_btns" id="btnSearch">
|
||||
<input type="button" value="정전개 조회" class="plm_btns" id="btnSearchAscending">
|
||||
<input type="button" value="역전개 조회" class="plm_btns" id="btnSearchDescending">
|
||||
</div>
|
||||
</div>
|
||||
<div id="plmSearchZon">
|
||||
@@ -771,6 +791,11 @@ function fn_excelExport(pGridObj,pFileName){
|
||||
|
||||
<div class="ascendig_text">
|
||||
<font size="2px">총 ${fn:length(List)}건</font>
|
||||
<c:if test="${!empty param.searchType && param.searchType eq 'descending'}">
|
||||
<font size="2px" style="color: #ff6600; margin-left: 10px;">
|
||||
※ 역전개: 선택한 부품을 사용하는 상위 BOM을 표시합니다
|
||||
</font>
|
||||
</c:if>
|
||||
</div>
|
||||
|
||||
<div class="in_table_scroll_wrap _table1" style="height:26px;width:99.4%;">
|
||||
@@ -920,10 +945,10 @@ function fn_excelExport(pGridObj,pFileName){
|
||||
<td><a href="#" class="File file_${item.FILE_2D_CNT eq 0?'empty_':''}icon" data-OBJID="${item.PART_OBJID}" data-docType="2D_DRAWING_CAD" data-docTypeName="2D(Drawing) CAD 첨부파일"></a></td>
|
||||
<td><a href="#" class="File file_${item.FILE_PDF_CNT eq 0?'empty_':''}icon" data-OBJID="${item.PART_OBJID}" data-docType="2D_PDF_CAD" data-docTypeName="2D(PDF) CAD 첨부파일"></a></td>
|
||||
<td title="${item.MATERIAL}" class="align_c">${item.MATERIAL}</td><!-- 재료 -->
|
||||
<td title="${item.SPEC}" class="align_l" style="text-align: left; padding-left: 5px;">${item.SPEC}</td><!-- 열처리경도 -->
|
||||
<td title="${item.POST_PROCESSING}" class="align_l" style="text-align: left; padding-left: 5px;">${item.POST_PROCESSING}</td><!-- 열처리방법 -->
|
||||
<td title="${item.POST_PROCESSING}" class="align_l" style="text-align: left; padding-left: 5px;">${item.POST_PROCESSING}</td><!-- 표면처리 -->
|
||||
<td title="${item.MAKER}" class="align_l" style="text-align: left; padding-left: 5px;">${item.MAKER}</td><!-- 공급업체 -->
|
||||
<td title="${item.HEAT_TREATMENT_HARDNESS}" class="align_l" style="text-align: left; padding-left: 5px;">${item.HEAT_TREATMENT_HARDNESS}</td><!-- 열처리경도 -->
|
||||
<td title="${item.HEAT_TREATMENT_METHOD}" class="align_l" style="text-align: left; padding-left: 5px;">${item.HEAT_TREATMENT_METHOD}</td><!-- 열처리방법 -->
|
||||
<td title="${item.SURFACE_TREATMENT}" class="align_l" style="text-align: left; padding-left: 5px;">${item.SURFACE_TREATMENT}</td><!-- 표면처리 -->
|
||||
<td title="${item.SUPPLY_NAME}" class="align_l" style="text-align: left; padding-left: 5px;">${item.SUPPLY_NAME}</td><!-- 공급업체 -->
|
||||
<td title="${item.PART_TYPE_TITLE}" class="align_c">${item.PART_TYPE_TITLE}</td><!-- PART_TYPE -->
|
||||
<td title="${item.REVISION}" class="align_c" style="text-align: left; padding-left: 5px;">${item.REVISION}</td><!-- REVISION -->
|
||||
<td title="${item.EO_NO}" class="align_c" style="text-align: left; padding-left: 5px;">${item.EO_NO}</td><!-- EO_NO -->
|
||||
|
||||
@@ -1146,9 +1146,17 @@ public class PartMngController {
|
||||
//유닛명
|
||||
code_map.put("unit_code",commonService.bizMakeOptionList("", CommonUtils.nullToEmpty((String)paramMap.get("unit_code")),"common.getUnitCodeList"));
|
||||
|
||||
if("Y".equals(search)){
|
||||
if("Y".equals(search)){
|
||||
String searchType = CommonUtils.checkNull(paramMap.get("searchType"), "ascending");
|
||||
|
||||
if("descending".equals(searchType)){
|
||||
// 역전개 조회
|
||||
resultList = partMngService.getStructureDescendingList(request,paramMap);
|
||||
}else{
|
||||
// 정전개 조회 (기본값)
|
||||
resultList = partMngService.getStructureAscendingList(request,paramMap);
|
||||
}
|
||||
}
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -5532,8 +5532,8 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
<!-- BOM_REPORT_OBJID,REGDATE,PATH -->
|
||||
</select>
|
||||
|
||||
<!-- //정전개 조회 쿼리 -->
|
||||
<select id="selectStructureAscendingList" parameterType="map" resultType="map">
|
||||
<!-- //정전개 조회 쿼리 (백업) -->
|
||||
<select id="selectStructureAscendingList_backup" parameterType="map" resultType="map">
|
||||
|
||||
<!--
|
||||
SELECT * FROM (
|
||||
@@ -5664,16 +5664,10 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
|
||||
<choose>
|
||||
<when test="search_type != null and !''.equals(search_type) and 'working'.equals(search_type)">
|
||||
AND STATUS NOT IN ('deleting', 'deleted')
|
||||
<!--
|
||||
AND (BQP.STATUS IS NULL OR BQP.STATUS = '')
|
||||
-->
|
||||
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND STATUS IN ('beforeEdit', 'editing','deleting', 'deploy')
|
||||
<!--
|
||||
AND COALESCE(STATUS,'') IN ('beforeEdit', 'editing','deleting', 'deploy', '')
|
||||
-->
|
||||
AND COALESCE(BPQ.STATUS,'') IN ('beforeEdit', 'editing','deleting', 'deploy', '')
|
||||
</otherwise>
|
||||
</choose>
|
||||
) A,
|
||||
@@ -5689,7 +5683,7 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
-->
|
||||
AND NVL(A.LAST_PART_OBJID, A.PART_NO) = B.OBJID
|
||||
AND NVL(A.PARENT_OBJID, '') = ''
|
||||
AND B.STATUS = 'release'
|
||||
AND B.STATUS IN ('create', 'release')
|
||||
<!--
|
||||
AND B.IS_LAST='1'
|
||||
AND (C.STATUS = 'create' OR C.STATUS = 'deploy' AND B.IS_LAST='1')
|
||||
@@ -5796,13 +5790,10 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
|
||||
<choose>
|
||||
<when test="search_type != null and !''.equals(search_type) and 'working'.equals(search_type)">
|
||||
AND A.STATUS NOT IN ('deleting', 'deleted')
|
||||
<!--
|
||||
AND (BQP.STATUS IS NULL OR BQP.STATUS = '')
|
||||
-->
|
||||
AND COALESCE(A.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
</when>
|
||||
<otherwise>
|
||||
AND A.STATUS IN ('beforeEdit', 'editing','deleting', 'deploy')
|
||||
AND COALESCE(A.STATUS,'') IN ('beforeEdit', 'editing','deleting', 'deploy', '')
|
||||
</otherwise>
|
||||
</choose>
|
||||
<!--
|
||||
@@ -5894,11 +5885,183 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
|
||||
</select>
|
||||
|
||||
<!-- //정전개 조회 쿼리 (신규 - 간소화) -->
|
||||
<select id="selectStructureAscendingList" parameterType="map" resultType="map">
|
||||
WITH RECURSIVE BOM_TREE AS (
|
||||
-- 최상위 레벨 (PARENT가 없는 항목)
|
||||
SELECT
|
||||
BPQ.BOM_REPORT_OBJID,
|
||||
BPQ.OBJID AS BPQ_OBJID,
|
||||
BPQ.PARENT_OBJID,
|
||||
BPQ.CHILD_OBJID,
|
||||
BPQ.PART_NO,
|
||||
BPQ.PARENT_PART_NO,
|
||||
BPQ.QTY,
|
||||
BPQ.SEQ,
|
||||
COALESCE(BPQ.LAST_PART_OBJID, BPQ.PART_NO) AS LAST_PART_OBJID,
|
||||
1 AS LEV,
|
||||
ARRAY[BPQ.CHILD_OBJID::TEXT] AS PATH,
|
||||
ARRAY[BPQ.SEQ::TEXT] AS PATH2,
|
||||
0 AS LEAF
|
||||
FROM BOM_PART_QTY BPQ
|
||||
LEFT JOIN PART_BOM_REPORT PBR ON BPQ.BOM_REPORT_OBJID = PBR.OBJID
|
||||
WHERE COALESCE(BPQ.PARENT_OBJID, '') = ''
|
||||
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
<!-- BOM REPORT 검색 조건 -->
|
||||
<if test="customer_cd != null and !''.equals(customer_cd)">
|
||||
AND PBR.CUSTOMER_OBJID = #{customer_cd}
|
||||
</if>
|
||||
<if test="project_name != null and !''.equals(project_name)">
|
||||
AND PBR.CONTRACT_OBJID = #{project_name}
|
||||
</if>
|
||||
<if test="unit_code != null and !''.equals(unit_code)">
|
||||
AND PBR.UNIT_CODE = #{unit_code}
|
||||
</if>
|
||||
<!-- 품번/품명 검색 조건 - 해당 품번이 포함된 BOM만 필터링 -->
|
||||
<if test="search_partNo != null and !''.equals(search_partNo)">
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM BOM_PART_QTY BPQ_SUB
|
||||
LEFT JOIN PART_MNG PM_SUB ON COALESCE(BPQ_SUB.LAST_PART_OBJID, BPQ_SUB.PART_NO) = PM_SUB.OBJID
|
||||
WHERE BPQ_SUB.BOM_REPORT_OBJID = BPQ.BOM_REPORT_OBJID
|
||||
AND UPPER(PM_SUB.PART_NO) LIKE UPPER('%${search_partNo}%')
|
||||
)
|
||||
</if>
|
||||
<if test="search_partName != null and !''.equals(search_partName)">
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM BOM_PART_QTY BPQ_SUB
|
||||
LEFT JOIN PART_MNG PM_SUB ON COALESCE(BPQ_SUB.LAST_PART_OBJID, BPQ_SUB.PART_NO) = PM_SUB.OBJID
|
||||
WHERE BPQ_SUB.BOM_REPORT_OBJID = BPQ.BOM_REPORT_OBJID
|
||||
AND UPPER(PM_SUB.PART_NAME) LIKE UPPER('%${search_partName}%')
|
||||
)
|
||||
</if>
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- 하위 레벨 (재귀)
|
||||
SELECT
|
||||
BPQ.BOM_REPORT_OBJID,
|
||||
BPQ.OBJID AS BPQ_OBJID,
|
||||
BPQ.PARENT_OBJID,
|
||||
BPQ.CHILD_OBJID,
|
||||
BPQ.PART_NO,
|
||||
BPQ.PARENT_PART_NO,
|
||||
BPQ.QTY,
|
||||
BPQ.SEQ,
|
||||
COALESCE(BPQ.LAST_PART_OBJID, BPQ.PART_NO) AS LAST_PART_OBJID,
|
||||
BT.LEV + 1,
|
||||
BT.PATH || BPQ.CHILD_OBJID::TEXT,
|
||||
BT.PATH2 || BPQ.SEQ::TEXT,
|
||||
0 AS LEAF
|
||||
FROM BOM_PART_QTY BPQ
|
||||
INNER JOIN BOM_TREE BT ON BPQ.PARENT_OBJID = BT.CHILD_OBJID
|
||||
AND BPQ.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID
|
||||
WHERE COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
),
|
||||
MAX_LEVEL_CTE AS (
|
||||
-- 최대 레벨 계산
|
||||
SELECT MAX(LEV) AS MAX_LEVEL
|
||||
FROM BOM_TREE
|
||||
)
|
||||
SELECT
|
||||
BT.BOM_REPORT_OBJID,
|
||||
BT.LEV,
|
||||
BT.LEV AS LEVEL,
|
||||
BT.QTY,
|
||||
BT.QTY AS QTY_TEMP,
|
||||
BT.SEQ,
|
||||
BT.LEAF,
|
||||
-- PART 정보
|
||||
PM.OBJID AS PART_OBJID,
|
||||
PM.PART_NO,
|
||||
PM.PART_NAME,
|
||||
PM.REVISION,
|
||||
PM.MATERIAL,
|
||||
PM.SPEC,
|
||||
PM.WEIGHT,
|
||||
PM.THICKNESS,
|
||||
PM.WIDTH,
|
||||
PM.HEIGHT,
|
||||
PM.OUT_DIAMETER,
|
||||
PM.IN_DIAMETER,
|
||||
PM.LENGTH,
|
||||
PM.MAKER,
|
||||
PM.POST_PROCESSING,
|
||||
PM.REMARK,
|
||||
PM.HEAT_TREATMENT_HARDNESS,
|
||||
PM.HEAT_TREATMENT_METHOD,
|
||||
PM.SURFACE_TREATMENT,
|
||||
PM.SUPPLY_CODE,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG O WHERE O.OBJID::VARCHAR = PM.SUPPLY_CODE) AS SUPPLY_NAME,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
|
||||
PM.DESIGN_DATE,
|
||||
(SELECT EO_NO FROM EO_MNG EM WHERE EM.OBJID::VARCHAR = PM.EO_NO) AS EO_NO,
|
||||
(SELECT TO_CHAR(REG_DATE,'YYYY-MM-DD') FROM EO_MNG EM WHERE EM.OBJID::VARCHAR = PM.EO_NO) AS EO_DATE,
|
||||
PM.SUB_MATERIAL,
|
||||
-- 첨부파일 개수
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '3D_CAD' AND AF.STATUS = 'Active') AS FILE_3D_CNT,
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '2D_DRAWING_CAD' AND AF.STATUS = 'Active') AS FILE_2D_CNT,
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '2D_PDF_CAD' AND AF.STATUS = 'Active') AS FILE_PDF_CNT,
|
||||
-- BOM REPORT 정보
|
||||
PBR.PRODUCT_CD,
|
||||
PBR.STATUS AS BOM_STATUS,
|
||||
-- PATH 정보
|
||||
BT.PATH2,
|
||||
(SELECT PART_NO FROM PART_MNG P WHERE P.OBJID::VARCHAR = BT.PART_NO) AS PART_MNG_NO,
|
||||
(SELECT PART_NO FROM PART_MNG P WHERE P.OBJID::VARCHAR = BT.PARENT_PART_NO) AS PARENT_PART_MNG_NO,
|
||||
-- LEAF 계산 (하위 항목이 있는지 체크)
|
||||
(
|
||||
SELECT CASE WHEN COUNT(*) > 0 THEN 0 ELSE 1 END
|
||||
FROM BOM_PART_QTY BPQ2
|
||||
WHERE BPQ2.PARENT_OBJID = BT.CHILD_OBJID
|
||||
AND BPQ2.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID
|
||||
AND COALESCE(BPQ2.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
) AS LEAF,
|
||||
-- 상위 품번 (P_QTY 계산용)
|
||||
BT.QTY AS P_QTY,
|
||||
-- ROOT 정보
|
||||
(SELECT CHILD_OBJID FROM BOM_PART_QTY WHERE BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID AND COALESCE(PARENT_OBJID, '') = '' LIMIT 1) AS ROOT_OBJID,
|
||||
BT.PARENT_OBJID AS SUB_ROOT_OBJID,
|
||||
-- MAX_LEVEL 추가
|
||||
ML.MAX_LEVEL
|
||||
FROM BOM_TREE BT
|
||||
CROSS JOIN MAX_LEVEL_CTE ML
|
||||
LEFT JOIN PART_MNG PM ON BT.LAST_PART_OBJID = PM.OBJID
|
||||
LEFT JOIN PART_BOM_REPORT PBR ON BT.BOM_REPORT_OBJID = PBR.OBJID
|
||||
WHERE (PM.OBJID IS NULL OR PM.STATUS IN ('create', 'release'))
|
||||
<!-- 품번/품명 검색 시: 검색된 품번을 포함하는 PATH만 표시 -->
|
||||
<if test="search_partNo != null and !''.equals(search_partNo)">
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM BOM_TREE BT_SEARCH
|
||||
LEFT JOIN PART_MNG PM_SEARCH ON BT_SEARCH.LAST_PART_OBJID = PM_SEARCH.OBJID
|
||||
WHERE BT_SEARCH.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID
|
||||
AND UPPER(PM_SEARCH.PART_NO) LIKE UPPER('%${search_partNo}%')
|
||||
AND (
|
||||
BT.CHILD_OBJID = BT_SEARCH.CHILD_OBJID
|
||||
OR BT_SEARCH.CHILD_OBJID::TEXT = ANY(BT.PATH)
|
||||
)
|
||||
)
|
||||
</if>
|
||||
<if test="search_partName != null and !''.equals(search_partName)">
|
||||
AND EXISTS (
|
||||
SELECT 1 FROM BOM_TREE BT_SEARCH
|
||||
LEFT JOIN PART_MNG PM_SEARCH ON BT_SEARCH.LAST_PART_OBJID = PM_SEARCH.OBJID
|
||||
WHERE BT_SEARCH.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID
|
||||
AND UPPER(PM_SEARCH.PART_NAME) LIKE UPPER('%${search_partName}%')
|
||||
AND (
|
||||
BT.CHILD_OBJID = BT_SEARCH.CHILD_OBJID
|
||||
OR BT_SEARCH.CHILD_OBJID::TEXT = ANY(BT.PATH)
|
||||
)
|
||||
)
|
||||
</if>
|
||||
|
||||
ORDER BY BT.PATH2
|
||||
</select>
|
||||
|
||||
<!--
|
||||
//역전개 조회 쿼리
|
||||
//역전개 조회 쿼리 (백업)
|
||||
Level을 정전개를 통해가져온다.
|
||||
-->
|
||||
<select id="selectStructureDescendingList" parameterType="map" resultType="map">
|
||||
<select id="selectStructureDescendingList_backup" parameterType="map" resultType="map">
|
||||
WITH RECURSIVE VIEW_BOM(
|
||||
BOM_REPORT_OBJID,
|
||||
PARENT_OBJID,
|
||||
@@ -6134,6 +6297,112 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
PATH1
|
||||
</select>
|
||||
|
||||
<!-- //역전개 조회 쿼리 (신규 - 간소화) -->
|
||||
<select id="selectStructureDescendingList" parameterType="map" resultType="map">
|
||||
WITH RECURSIVE BOM_TREE AS (
|
||||
-- 검색된 파트를 시작점으로
|
||||
SELECT
|
||||
BPQ.BOM_REPORT_OBJID,
|
||||
BPQ.OBJID AS BPQ_OBJID,
|
||||
BPQ.PARENT_OBJID,
|
||||
BPQ.CHILD_OBJID,
|
||||
BPQ.PART_NO,
|
||||
BPQ.PARENT_PART_NO,
|
||||
BPQ.QTY,
|
||||
BPQ.SEQ,
|
||||
COALESCE(BPQ.LAST_PART_OBJID, BPQ.PART_NO) AS LAST_PART_OBJID,
|
||||
1 AS LEV,
|
||||
ARRAY[BPQ.PART_NO::TEXT] AS PATH
|
||||
FROM BOM_PART_QTY BPQ
|
||||
INNER JOIN PART_MNG PM ON COALESCE(BPQ.LAST_PART_OBJID, BPQ.PART_NO) = PM.OBJID
|
||||
WHERE 1=1
|
||||
AND COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
AND PM.STATUS IN ('create', 'release')
|
||||
<if test="search_partNo != null and !''.equals(search_partNo)">
|
||||
AND UPPER(PM.PART_NO) LIKE UPPER('%${search_partNo}%')
|
||||
</if>
|
||||
<if test="search_partName != null and !''.equals(search_partName)">
|
||||
AND UPPER(PM.PART_NAME) LIKE UPPER('%${search_partName}%')
|
||||
</if>
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- 상위로 올라가기 (역방향)
|
||||
SELECT
|
||||
BPQ.BOM_REPORT_OBJID,
|
||||
BPQ.OBJID AS BPQ_OBJID,
|
||||
BPQ.PARENT_OBJID,
|
||||
BPQ.CHILD_OBJID,
|
||||
BPQ.PART_NO,
|
||||
BPQ.PARENT_PART_NO,
|
||||
BPQ.QTY,
|
||||
BPQ.SEQ,
|
||||
COALESCE(BPQ.LAST_PART_OBJID, BPQ.PART_NO) AS LAST_PART_OBJID,
|
||||
BT.LEV + 1,
|
||||
BT.PATH || BPQ.PART_NO::TEXT
|
||||
FROM BOM_PART_QTY BPQ
|
||||
INNER JOIN BOM_TREE BT ON BPQ.CHILD_OBJID = BT.PARENT_OBJID
|
||||
AND BPQ.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID
|
||||
WHERE COALESCE(BPQ.STATUS, '') NOT IN ('deleting', 'deleted')
|
||||
AND BPQ.PART_NO != ALL(BT.PATH) -- 순환 방지
|
||||
),
|
||||
MAX_LEVEL_CTE AS (
|
||||
-- 최대 레벨 계산
|
||||
SELECT MAX(LEV) AS MAX_LEVEL
|
||||
FROM BOM_TREE
|
||||
)
|
||||
SELECT
|
||||
BT.BOM_REPORT_OBJID,
|
||||
BT.LEV,
|
||||
BT.LEV AS LEVEL,
|
||||
BT.QTY,
|
||||
BT.SEQ,
|
||||
-- PART 정보
|
||||
PM.OBJID AS PART_OBJID,
|
||||
PM.PART_NO AS PART_NO_TITLE,
|
||||
PM.PART_NAME,
|
||||
PM.REVISION AS REV,
|
||||
PM.MATERIAL,
|
||||
PM.SPEC,
|
||||
PM.WEIGHT,
|
||||
PM.MAKER,
|
||||
PM.REMARK,
|
||||
PM.HEAT_TREATMENT_HARDNESS,
|
||||
PM.HEAT_TREATMENT_METHOD,
|
||||
PM.SURFACE_TREATMENT,
|
||||
PM.SUPPLY_CODE,
|
||||
(SELECT SUPPLY_NAME FROM ADMIN_SUPPLY_MNG O WHERE O.OBJID::VARCHAR = PM.SUPPLY_CODE) AS SUPPLY_NAME,
|
||||
(SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.PART_TYPE) AS PART_TYPE_TITLE,
|
||||
PM.DESIGN_DATE,
|
||||
(SELECT EO_NO FROM EO_MNG EM WHERE EM.OBJID::VARCHAR = PM.EO_NO) AS EO_NO,
|
||||
(SELECT TO_CHAR(REG_DATE,'YYYY-MM-DD') FROM EO_MNG EM WHERE EM.OBJID::VARCHAR = PM.EO_NO) AS EO_DATE,
|
||||
PM.SUB_MATERIAL,
|
||||
-- 첨부파일 개수
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '3D_CAD' AND AF.STATUS = 'Active') AS FILE_3D_CNT,
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '2D_DRAWING_CAD' AND AF.STATUS = 'Active') AS FILE_2D_CNT,
|
||||
(SELECT COUNT(*) FROM ATTACH_FILE_INFO AF WHERE AF.TARGET_OBJID = PM.OBJID AND AF.DOC_TYPE = '2D_PDF_CAD' AND AF.STATUS = 'Active') AS FILE_PDF_CNT,
|
||||
-- BOM REPORT 정보
|
||||
PBR.REGDATE,
|
||||
PBR.PRODUCT_CD,
|
||||
PBR.STATUS AS BOM_STATUS,
|
||||
-- PATH 정보
|
||||
BT.PATH,
|
||||
BT.PARENT_PART_NO,
|
||||
-- MAX_LEVEL 추가
|
||||
ML.MAX_LEVEL
|
||||
FROM BOM_TREE BT
|
||||
CROSS JOIN MAX_LEVEL_CTE ML
|
||||
LEFT JOIN PART_MNG PM ON BT.LAST_PART_OBJID = PM.OBJID
|
||||
LEFT JOIN PART_BOM_REPORT PBR ON BT.BOM_REPORT_OBJID = PBR.OBJID
|
||||
WHERE 1=1
|
||||
AND (PM.OBJID IS NULL OR PM.STATUS IN ('create', 'release'))
|
||||
|
||||
ORDER BY
|
||||
PBR.REGDATE DESC,
|
||||
BT.LEV,
|
||||
BT.PATH
|
||||
</select>
|
||||
|
||||
<!--
|
||||
//역전개 조회 쿼리
|
||||
Level을 정전개를 통해가져오지 않는다.
|
||||
@@ -7076,6 +7345,9 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
,MAKER
|
||||
,CONTRACT_OBJID
|
||||
,POST_PROCESSING
|
||||
,HEAT_TREATMENT_HARDNESS
|
||||
,HEAT_TREATMENT_METHOD
|
||||
,SURFACE_TREATMENT
|
||||
) VALUES (
|
||||
#{PART_OBJID}::NUMERIC
|
||||
,#{PART_NO}
|
||||
@@ -7101,6 +7373,9 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
|
||||
,#{MAKER}
|
||||
,#{CONTRACT_OBJID}
|
||||
,#{POST_PROCESSING}
|
||||
,#{HEAT_TREATMENT_HARDNESS}
|
||||
,#{HEAT_TREATMENT_METHOD}
|
||||
,#{SURFACE_TREATMENT}
|
||||
)
|
||||
</insert>
|
||||
|
||||
|
||||
@@ -1642,54 +1642,17 @@ public class PartMngService extends BaseService {
|
||||
* @return
|
||||
*/
|
||||
public List getStructureAscendingList(HttpServletRequest request,Map paramMap){
|
||||
List<Map<String,Object>> spareList = new ArrayList();
|
||||
List<Map<String,Object>> resultList = new ArrayList();
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
try{
|
||||
|
||||
System.out.println("paramMap :: " + paramMap);
|
||||
spareList = sqlSession.selectList("partMng.selectStructureAscendingList", paramMap);
|
||||
resultList = sqlSession.selectList("partMng.selectStructureAscendingList", paramMap);
|
||||
resultList = CommonUtils.toUpperCaseMapKey(resultList);
|
||||
|
||||
spareList = CommonUtils.toUpperCaseMapKey(spareList);
|
||||
// 쿼리에서 이미 MAX_LEVEL을 제공하므로 추가 처리 불필요
|
||||
// LEV_X 컬럼도 JSP에서 동적으로 처리하므로 생략
|
||||
|
||||
int maxLevel = 0;
|
||||
|
||||
if(null != spareList && 0 < spareList.size()){
|
||||
for(int i=0;i<spareList.size();i++){
|
||||
Map resultMap = new HashMap();
|
||||
resultMap = (HashMap)spareList.get(i);
|
||||
|
||||
int resultLevel = Integer.parseInt(CommonUtils.checkNull(resultMap.get("LEV"),"0"));
|
||||
|
||||
if(maxLevel < resultLevel){
|
||||
maxLevel = resultLevel;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<spareList.size();i++){
|
||||
Map resultMap = new HashMap();
|
||||
resultMap = (HashMap)spareList.get(i);
|
||||
|
||||
resultMap.put("MAX_LEVEL", maxLevel);
|
||||
|
||||
int level = Integer.parseInt(CommonUtils.checkNull(resultMap.get("LEV"),"0"));
|
||||
|
||||
|
||||
for(int j=0;j<maxLevel;j++){
|
||||
String levelSymbol = "";
|
||||
|
||||
if((j+1) == level){
|
||||
levelSymbol = "*";
|
||||
}else{
|
||||
levelSymbol = "";
|
||||
}
|
||||
resultMap.put("LEV_"+Integer.toString((j+1)), levelSymbol);
|
||||
}
|
||||
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
}
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}finally{
|
||||
@@ -1705,61 +1668,21 @@ public class PartMngService extends BaseService {
|
||||
* @return
|
||||
*/
|
||||
public List getStructureDescendingList(HttpServletRequest request,Map paramMap){
|
||||
List<Map<String,Object>> spareList = new ArrayList();
|
||||
List<Map<String,Object>> resultList = new ArrayList();
|
||||
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
|
||||
try{
|
||||
if(paramMap != null && !paramMap.isEmpty()){
|
||||
|
||||
String partNo = CommonUtils.checkNull(paramMap.get("search_partNo"));
|
||||
String partName = CommonUtils.checkNull(paramMap.get("search_partName"));
|
||||
|
||||
if(!"".equals(partNo) || !"".equals(partName)){
|
||||
setPartMngCommonCD(paramMap);
|
||||
spareList = sqlSession.selectList("partMng.selectStructureDescendingList", paramMap);
|
||||
|
||||
spareList = CommonUtils.toUpperCaseMapKey(spareList);
|
||||
|
||||
int maxLevel = 0;
|
||||
|
||||
if(null != spareList && 0 < spareList.size()){
|
||||
for(int i=0;i<spareList.size();i++){
|
||||
Map resultMap = new HashMap();
|
||||
resultMap = (HashMap)spareList.get(i);
|
||||
|
||||
int resultLevel = Integer.parseInt(CommonUtils.checkNull(resultMap.get("LEV"),"0"));
|
||||
|
||||
if(maxLevel < resultLevel){
|
||||
maxLevel = resultLevel;
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<spareList.size();i++){
|
||||
Map resultMap = new HashMap();
|
||||
resultMap = (HashMap)spareList.get(i);
|
||||
|
||||
resultMap.put("MAX_LEVEL", maxLevel);
|
||||
|
||||
int level = Integer.parseInt(CommonUtils.checkNull(resultMap.get("LEV"),"0"));
|
||||
|
||||
|
||||
for(int j=0;j<maxLevel;j++){
|
||||
String levelSymbol = "";
|
||||
|
||||
if((j+1) == level){
|
||||
levelSymbol = "*";
|
||||
}else{
|
||||
levelSymbol = "";
|
||||
}
|
||||
resultMap.put("LEV_"+Integer.toString((j+1)), levelSymbol);
|
||||
}
|
||||
|
||||
resultList.add(resultMap);
|
||||
}
|
||||
}
|
||||
resultList = sqlSession.selectList("partMng.selectStructureDescendingList", paramMap);
|
||||
resultList = CommonUtils.toUpperCaseMapKey(resultList);
|
||||
|
||||
// 쿼리에서 이미 MAX_LEVEL을 제공하므로 추가 처리 불필요
|
||||
System.out.println("resultList:"+resultList);
|
||||
|
||||
}
|
||||
}
|
||||
}catch(Exception e){
|
||||
@@ -1768,7 +1691,7 @@ public class PartMngService extends BaseService {
|
||||
sqlSession.close();
|
||||
}
|
||||
|
||||
return CommonUtils.toUpperCaseMapKey(resultList);
|
||||
return resultList;
|
||||
}
|
||||
|
||||
|
||||
@@ -4470,6 +4393,9 @@ public class PartMngService extends BaseService {
|
||||
insertMap.put("SUPPLY_CODE", CommonUtils.checkNull((String)insertMap.get("SUP_CODE")));
|
||||
insertMap.put("MAKER", CommonUtils.checkNull((String)insertMap.get("MAKER")));
|
||||
insertMap.put("POST_PROCESSING", CommonUtils.checkNull((String)insertMap.get("POST_PROCESSING")));
|
||||
insertMap.put("HEAT_TREATMENT_HARDNESS", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_HARDNESS")));
|
||||
insertMap.put("HEAT_TREATMENT_METHOD", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_METHOD")));
|
||||
insertMap.put("SURFACE_TREATMENT", CommonUtils.checkNull((String)insertMap.get("SURFACE_TREATMENT")));
|
||||
insertMap.put("STATUS", "deploy"); // 엑셀 업로드 시 deploy 상태로 저장
|
||||
insertMap.put("WRITER", CommonUtils.checkNull((String)paramMap.get("CONNECTUSERID")));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user