E-BOM 확인/수정쪽 속도개선

This commit is contained in:
Johngreen
2025-10-28 13:33:21 +09:00
parent 2feeb8c341
commit a297e660d4
4 changed files with 249 additions and 155 deletions

View File

@@ -609,19 +609,30 @@ public class PartMngController {
* @param paramMap
* @return
*/
/**
* PART 목록 조회 (전체 데이터 조회 - 재귀 CTE 제거로 성능 개선)
* @param request
* @param paramMap
* @return JSON 형태의 전체 데이터
*/
@RequestMapping("/partMng/getPartMngList_ajax.do")
public String getPartList_ajax(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
@ResponseBody
public Map<String, Object> getPartList_ajax(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
paramMap.put("status", "complete");
System.out.println("getPArtList_ajax paramMap : "+paramMap);
paramMap.put("IS_LAST","1");
//paramMap.put("STATUS", "release");
System.out.println("getPartList_ajax paramMap : "+paramMap);
// 전체 데이터 조회 (페이징 제거, 재귀 CTE 제거로 속도 대폭 향상)
List list = partMngService.getToConnectPartMngList(request, paramMap);
// Gson을 사용하여 안전하게 JSON 변환 (특수문자, 이스케이프 처리 자동)
String jsonResult = JsonUtil.ListToJson(list);
request.setAttribute("RESULT", jsonResult);
return "/ajax/ajaxResult";
// 응답 데이터 구성
Map<String, Object> response = new HashMap<>();
response.put("data", list);
System.out.println("데이터 조회 완료 - " + list.size() + "");
return response;
}

View File

@@ -266,8 +266,22 @@
<!-- Part 관리 기본 조회 -->
<sql id="partMngBase">
(
WITH V_FILE AS (
SELECT
-- 파일 개수 집계 (성능 최적화)
WITH V_FILE_COUNTS AS (
SELECT
TARGET_OBJID,
COUNT(CASE WHEN DOC_TYPE = '3D_CAD' THEN 1 END) AS CU01_CNT,
COUNT(CASE WHEN DOC_TYPE = '2D_DRAWING_CAD' THEN 1 END) AS CU02_CNT,
COUNT(CASE WHEN DOC_TYPE = '2D_PDF_CAD' THEN 1 END) AS CU03_CNT,
COUNT(CASE WHEN DOC_TYPE IN ('2D_PDF_CAD', '2D_DRAWING_CAD') THEN 1 END) AS CU_TOTAL_CNT,
COUNT(CASE WHEN DOC_TYPE = 'ECD_DOC' THEN 1 END) AS ECD_CNT
FROM ATTACH_FILE_INFO
WHERE STATUS = 'Active'
AND DOC_TYPE IN ('PART_SHAPE_IMG','ECD_DOC','3D_CAD','2D_DRAWING_CAD','2D_PDF_CAD')
GROUP BY TARGET_OBJID
),
V_FILE AS (
SELECT DISTINCT ON (TARGET_OBJID, DOC_TYPE)
TARGET_OBJID
, SAVED_FILE_NAME
, REAL_FILE_NAME
@@ -276,8 +290,9 @@
, STATUS
FROM ATTACH_FILE_INFO
WHERE 1 = 1
AND DOC_TYPE IN ('PART_SHAPE_IMG','ECD_DOC','3D_CAD','2D_DRAWING_CAD','2D_PDF_CAD')
AND DOC_TYPE IN ('PART_SHAPE_IMG','ECD_DOC')
AND STATUS = 'Active'
ORDER BY TARGET_OBJID, DOC_TYPE, OBJID
)
SELECT DISTINCT
@@ -327,31 +342,17 @@
P.SOURCING_CODE,
CC_SOURCING.CODE_NAME AS SOURCING_NAME,
AF.SAVED_FILE_NAME,
AF.REAL_FILE_NAME,
REPLACE(AF.FILE_PATH, '\', '\\') AS FILE_PATH,
case when CAD.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU01_CNT,
case when DRAWING.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU02_CNT,
case when PDF.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU03_CNT,
case when PDFDRA.SAVED_FILE_NAME is NOT NULL
then 1
else 0 end as CU_TOTAL_CNT,
AF_IMG.SAVED_FILE_NAME,
AF_IMG.REAL_FILE_NAME,
REPLACE(AF_IMG.FILE_PATH, '\', '\\') AS FILE_PATH,
COALESCE(FC.CU01_CNT, 0) AS CU01_CNT,
COALESCE(FC.CU02_CNT, 0) AS CU02_CNT,
COALESCE(FC.CU03_CNT, 0) AS CU03_CNT,
COALESCE(FC.CU_TOTAL_CNT, 0) AS CU_TOTAL_CNT,
AF_ECD.SAVED_FILE_NAME AS ECD_SAVED_FILE_NAME,
AF_ECD.REAL_FILE_NAME AS ECD_REAL_FILE_NAME,
REPLACE(AF_ECD.FILE_PATH, '\', '\\') AS ECD_FILE_PATH,
CASE
WHEN AF_ECD.SAVED_FILE_NAME IS NOT NULL THEN 'Y'
ELSE 'N'
END ECD_FLAG,
CASE WHEN FC.ECD_CNT > 0 THEN 'Y' ELSE 'N' END AS ECD_FLAG,
THICKNESS,
WIDTH,
HEIGHT,
@@ -367,43 +368,15 @@
LEFT JOIN COMM_CODE CC_DESIGN ON CC_DESIGN.CODE_ID = P.DESIGN_APPLY_POINT
LEFT JOIN COMM_CODE CC_SOURCING ON CC_SOURCING.CODE_ID = P.SOURCING_CODE
LEFT JOIN admin_supply_mng SUP ON SUP.objid::varchar = P.SUPPLY_CODE
LEFT OUTER JOIN V_FILE AF
ON P.OBJID = AF.TARGET_OBJID
AND AF.DOC_TYPE IN ('PART_SHAPE_IMG')
<!--
AND AF.STATUS = 'Active'
-->
-- 파일 개수 집계 조인 (한 번만)
LEFT JOIN V_FILE_COUNTS FC ON P.OBJID = FC.TARGET_OBJID
-- 파일 정보 조인 (첫 번째만)
LEFT OUTER JOIN V_FILE AF_IMG
ON P.OBJID = AF_IMG.TARGET_OBJID
AND AF_IMG.DOC_TYPE = 'PART_SHAPE_IMG'
LEFT OUTER JOIN V_FILE AF_ECD
ON P.OBJID = AF_ECD.TARGET_OBJID
AND AF_ECD.DOC_TYPE IN ('ECD_DOC')
<!--
AND AF_ECD.STATUS = 'Active'
-->
LEFT OUTER JOIN V_FILE CAD
ON P.OBJID = CAD.TARGET_OBJID
AND CAD.DOC_TYPE IN ('3D_CAD')
<!--
AND CAD.STATUS = 'Active'
-->
LEFT OUTER JOIN V_FILE DRAWING
ON P.OBJID = DRAWING.TARGET_OBJID
AND DRAWING.DOC_TYPE IN ('2D_DRAWING_CAD')
<!--
AND DRAWING.STATUS = 'Active'
-->
LEFT OUTER JOIN V_FILE PDF
ON P.OBJID = PDF.TARGET_OBJID
AND PDF.DOC_TYPE IN ('2D_PDF_CAD')
<!--
AND PDF.STATUS = 'Active'
-->
LEFT OUTER JOIN V_FILE PDFDRA
ON P.OBJID = PDFDRA.TARGET_OBJID
AND PDFDRA.DOC_TYPE IN ('2D_PDF_CAD', '2D_DRAWING_CAD')
<!--
AND PDFDRA.STATUS = 'Active'
-->
AND AF_ECD.DOC_TYPE = 'ECD_DOC'
<!--
LEFT OUTER JOIN
@@ -2467,69 +2440,17 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
)A WHERE 1=1
</select> -->
<!-- PART 관리 목록 조회 -->
<!-- PART 관리 목록 조회 (전체 데이터, 재귀 CTE 제거로 성능 개선) -->
<select id="getToConnectPartMngList" parameterType="map" resultType="map">
WITH RECURSIVE VIEW_BOM(
OBJID,
PART_NO,
BOM_REPORT_OBJID,
PARENT_PART_NO,
QTY,
LEV,
PATH,
CYCLE
) AS (
SELECT
A.OBJID,
A.PART_NO,
A.BOM_REPORT_OBJID,
A.PARENT_PART_NO,
A.QTY,
1,
ARRAY [A.PART_NO],
FALSE
FROM
PART_BOM_QTY A
WHERE 1=1
AND (A.PARENT_PART_NO IS NULL OR A.PARENT_PART_NO = '')
AND A.BOM_REPORT_OBJID = #{bomReportObjId}::NUMERIC
UNION ALL
SELECT
B.OBJID,
B.PART_NO,
B.BOM_REPORT_OBJID,
B.PARENT_PART_NO,
B.QTY,
LEV + 1,
PATH,
B.PARENT_PART_NO = ANY(PATH)
FROM
PART_BOM_QTY B
JOIN
VIEW_BOM
ON B.PARENT_PART_NO = VIEW_BOM.PART_NO
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
T.*,
ROW_NUMBER() OVER(ORDER BY EXCEL_UPLOAD_SEQ ASC) RNUM
ROW_NUMBER() OVER(ORDER BY EXCEL_UPLOAD_SEQ ASC, PART_NO ASC) RNUM
FROM(
SELECT
T.*
FROM
<include refid="partMngBase"/> T
WHERE 1=1
<!-- AND IS_LAST = '1' -->
<!-- AND NOT EXISTS
(
SELECT
1
FROM VIEW_BOM V
WHERE 1=1
AND V.PART_NO = T.PART_NO
) -->
<!-- EO 기능 말들고 추가 필요 -->
<if test="search_eo != null and search_eo != ''">
AND UPPER(EO_NO) LIKE UPPER('%${search_eo}%')
@@ -2582,7 +2503,113 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
AND UPG_NO = #{search_product_mgmt_upg}
</if>
ORDER BY PART_NO
ORDER BY EXCEL_UPLOAD_SEQ ASC, PART_NO ASC
) T
</select>
<!-- PART 관리 목록 총 개수 조회 (페이징용) -->
<select id="getToConnectPartMngListCount" parameterType="map" resultType="int">
WITH RECURSIVE VIEW_BOM(
OBJID,
PART_NO,
BOM_REPORT_OBJID,
PARENT_PART_NO,
QTY,
LEV,
PATH,
CYCLE
) AS (
SELECT
A.OBJID,
A.PART_NO,
A.BOM_REPORT_OBJID,
A.PARENT_PART_NO,
A.QTY,
1,
ARRAY [A.PART_NO],
FALSE
FROM
PART_BOM_QTY A
WHERE 1=1
AND (A.PARENT_PART_NO IS NULL OR A.PARENT_PART_NO = '')
AND A.BOM_REPORT_OBJID = #{bomReportObjId}::NUMERIC
UNION ALL
SELECT
B.OBJID,
B.PART_NO,
B.BOM_REPORT_OBJID,
B.PARENT_PART_NO,
B.QTY,
LEV + 1,
PATH,
B.PARENT_PART_NO = ANY(PATH)
FROM
PART_BOM_QTY B
JOIN
VIEW_BOM
ON B.PARENT_PART_NO = VIEW_BOM.PART_NO
AND VIEW_BOM.BOM_REPORT_OBJID = B.BOM_REPORT_OBJID
)
SELECT
COUNT(*)
FROM(
SELECT
T.OBJID
FROM
<include refid="partMngBase"/> T
WHERE 1=1
<if test="search_eo != null and search_eo != ''">
AND UPPER(EO_NO) LIKE UPPER('%${search_eo}%')
</if>
<if test="search_except_eo != null and search_except_eo != ''">
AND EO != #{search_except_eo}
AND (EO IS NULL OR EO = '' OR EO = '0')
</if>
<if test="search_eo_date_from != null and search_eo_date_from != ''">
AND EO_DATE <![CDATA[ >= ]]> #{search_eo_date_from}::TIMESTAMP
</if>
<if test="search_eo_date_to != null and search_eo_date_to != ''">
AND EO_DATE <![CDATA[ <= ]]> #{search_eo_date_to}::TIMESTAMP
</if>
<if test="search_product_mgmt_objid != null and search_product_mgmt_objid != ''">
AND PRODUCT_MGMT_OBJID = #{search_product_mgmt_objid}
</if>
<if test="search_part_no != null and search_part_no != ''">
AND UPPER(PART_NO) LIKE UPPER('%${search_part_no}%')
</if>
<if test="search_part_name != null and search_part_name != ''">
AND UPPER(PART_NAME) LIKE UPPER('%${search_part_name}%')
</if>
<if test="search_spec != null and search_spec != ''">
AND UPPER(SPEC) LIKE UPPER('%${search_spec}%')
</if>
<if test="search_maker != null and search_maker != ''">
AND UPPER(MAKER) LIKE UPPER('%${search_maker}%')
</if>
<if test="search_writer != null and search_writer != ''">
AND WRITER = #{search_writer}
</if>
<if test="IS_LAST != null and IS_LAST != ''">
AND IS_LAST = #{IS_LAST}
</if>
<if test="STATUS != null and STATUS != ''">
AND STATUS = #{STATUS}
</if>
<if test="searchTargetStatus != null and searchTargetStatus != '' and 'create'.equals(searchTargetStatus)">
AND STATUS = 'create'
</if>
<if test="searchTargetStatus != null and searchTargetStatus != '' and 'deploy'.equals(searchTargetStatus)">
AND STATUS = 'release'
</if>
<if test="searchTargetStatus != null and searchTargetStatus != '' and 'changeDesign'.equals(searchTargetStatus)">
AND STATUS = 'release'
</if>
<if test="search_product_mgmt_upg != null and !''.equals(search_product_mgmt_upg)">
AND UPG_NO = #{search_product_mgmt_upg}
</if>
) T
</select>

View File

@@ -1538,6 +1538,28 @@ public class PartMngService extends BaseService {
return CommonUtils.toUpperCaseMapKey(resultList);
}
/**
* PART 목록 총 개수 조회 (페이징용)
*/
public int getToConnectPartMngListCount(HttpServletRequest request, Map paramMap){
int totalCount = 0;
SqlSession sqlSession = null;
try{
sqlSession = SqlMapConfig.getInstance().getSqlSession();
setPartMngCommonCD(paramMap);
totalCount = (Integer)sqlSession.selectOne("partMng.getToConnectPartMngListCount", paramMap);
}catch(Exception e){
e.printStackTrace();
}finally{
sqlSession.close();
}
return totalCount;
}
/**