# 개발관리 이식 GAP 분석 (원본 wace_plm 대비) > 작성: 2026-05-12 / 작성자: hjjeong > 대상 메뉴 5종 (1 도메인 `development/`): > - PART 등록 / PART 조회 / E-BOM 등록 / E-BOM 조회 / 설계변경 리스트 > 원본 위치: `wace_plm/WebContent/WEB-INF/view/partMng/` (단일 디렉토리) + `mapper/partMng.xml` 단일 매퍼. --- ## 0. 한 문장 요약 5개 메뉴 모두 wace `partMng/` 단일 디렉토리 + `partMng.xml` 매퍼에 1:1 매핑됨. 의존 테이블 15개 중 **6개 보유(`part_mng`/`comm_code`/`pms_wbs_task`/`project_mgmt`/`user_info`/`product_mgmt`)** · **9개 신규 추가 완료(`300_part_bom.sql`)** · **`part_mng`에 누락 15컬럼 ALTER 완료(`301_alter_part_mng.sql`)**. 5개 메뉴 모두 P1에서 실데이터 표시 가능. ## 0.1 이식 원칙 - JSP/매퍼XML 안의 `/* */`, ``, `//` 주석 블록은 비활성. 활성 코드만 이식. - `company_code` 멀티테넌시 분기는 vexplor_rps 측에 만들지 않음 (COMPANY_16 단독). - `CODE_NAME()`은 영업/프로젝트와 동일하게 `LEFT JOIN comm_code CC_X ON CC_X.code_id=...` 패턴 통일. - `client_mng`/`supply_mng` → vexplor는 `customer_mng`로 통합되어 있으나, 개발관리 5개 메뉴는 `customer_mng`를 직접 참조하지 않음(`project_mgmt.customer_objid` 경유). 분기 변환 불필요. - 금액 1,234.00 / 수량 1,234 / 모든 숫자 right-align (memory `feedback_number_format.md`). - wace JSP 컬럼 정의 끝의 주석 블록은 비활성 항목 — grep만으로 카운트하지 말 것 (memory `feedback_wace_jsp_columns.md`). --- ## 1. 메뉴 ↔ JSP ↔ 매퍼 1:1 매핑 | # | 메뉴 | wace JSP | 매퍼 쿼리 (partMng.xml) | LOC | |---|---|---|---|---:| | M1 | **PART 등록** | `partMngTempList.jsp` | `partMngTempGridList` (S), `partMngDeploy` (U), `partMngDelete` (D) | 649 | | M2 | **PART 조회** | `partMngList.jsp` | `partMngGridList` (S), `partMngDelete` (D), `partMngFormPopUp` (S) | 834 | | M3 | **E-BOM 등록** | `structureList.jsp` | `getBOMStandardStructureGridList` (S), `deleteStructure` (D), `structureStatusChange` (U) | 782 | | M4 | **E-BOM 조회** | `structureAscendingList.jsp` | `structureAscendingList`/`structureAscendingListExcel`/`structureDescendingExcelList` (S) | 1,064 | | M5 | **설계변경 리스트** | `partMngHisList.jsp` | `partMngHistList` (S, read-only) | 198 | vexplor_rps 측 라우트(예정): ``` GET /api/development/part-temp/list (M1 그리드) POST /api/development/part-temp/deploy (M1 확정) DEL /api/development/part-temp (M1·M2 삭제 공용) GET /api/development/part/list (M2 그리드) GET /api/development/part/:objid (M2 상세 팝업) GET /api/development/ebom/list (M3 그리드) PUT /api/development/ebom/status (M3 상태변경) DEL /api/development/ebom/:objid (M3 삭제) GET /api/development/ebom/ascending (M4 정전개) GET /api/development/ebom/descending (M4 역전개) GET /api/development/eo/history/list (M5 그리드) ``` --- ## 2. 메뉴별 검색 필드 & 그리드 컬럼 (활성만) ### M1 PART 등록 (`partMngTempList.jsp`) **검색**: SEARCH_PART_NO, SEARCH_PART_NAME (둘 다 autocomplete) **그리드 23셀**: PART_NO · PART_NAME · CU01_CNT(3D) · CU02_CNT(2D) · CU03_CNT(PDF) · MATERIAL · HEAT_TREATMENT_HARDNESS · HEAT_TREATMENT_METHOD · SURFACE_TREATMENT · MAKER · PART_TYPE_TITLE · SPEC · ACCTFG_NM · ODRFG_NM · UNIT_DC_NM · UNITMANG_DC_NM · UNITCHNG_NB · LOT_FG_NM · USE_YN_NM · QC_FG_NM · SETITEM_FG_NM · REQ_FG_NM · UNIT_LENGTH/QTY **액션**: 확정(Deploy) · 삭제 · 등록 · Excel Upload · 도면다중업로드 · 조회 **팝업**: partMngFormPopUp(신규) · partMngDetailPopUp(편집) · openPartExcelImportPopUp **핵심 의존 테이블**: `part_mng` (메인) · `order_spec_mng` · `admin_supply_mng` · `bom_part_qty` ### M2 PART 조회 (`partMngList.jsp`) **검색**: 없음(메인 조회 화면). 그리드 컬럼 동일하게 23셀(M1과 동일). **액션**: 등록 · 삭제 · 도면연동 · ERP업로드(전체/단일/모두) · Excel Upload · 조회 **팝업**: partMngFormPopUp · partMngDetailPopUp · FileRegistPopup · openPartExcelImportPopUp **핵심 의존 테이블**: `part_mng` · `bom_part_qty` ### M3 E-BOM 등록 (`structureList.jsp`) **검색 9 필드**: customer_cd · project_name · unit_code · SEARCH_UNIT_NAME · SEARCH_WRITER · product_cd · SEARCH_PART_NO · SEARCH_PART_NAME · search_fromDate~toDate · status **그리드 9셀**: PRODUCT_NAME · PART_NO · PART_NAME · BOM_CNT · DEPT_USER_NAME · REG_DATE · DEPLOY_DATE · REVISION · STATUS **액션**: 조회 · 삭제 · E-BOM등록 · 상태변경 **팝업**: setStructureStandardFormPopup · setBomCopyFormPopup · setStructurePopupMainFS · changeDesignNotePopUp · structureStatusChangePopup · openBomReportExcelImportPopUp **핵심 의존 테이블**: `part_bom_report` · `supply_mng` · `project_mgmt` · `pms_wbs_task` · `user_info` · `bom_part_qty` · `part_mng` · `comm_code` ### M4 E-BOM 조회 (`structureAscendingList.jsp`) **검색 4 필드**: project_name · unit_code · search_partNo · search_partName **그리드**: 동적 — MAX_LEVEL 레벨 컬럼 + 품번 · 품명 · 3D/2D/PDF · 수량 · 변경일 · 변경항목 · 규격 · 재질 · 중량 · 비고 **액션**: 정전개조회 · 역전개조회 · 엑셀다운로드(정/역전개) **팝업**: partMngDetailPopUp(클릭) · FileRegistPopup(도면) **핵심 의존 테이블**: `bom_part_qty` · `sales_bom_report` · `part_bom_report` · `product_mgmt_upg_detail`/`_master` · `part_mng` · `project_mgmt` · `pms_wbs_task` · `user_info` · `product_mgmt` ### M5 설계변경 리스트 (`partMngHisList.jsp`) **검색 10 필드**: Year · contract_objid · unit_code · part_no · part_name · change_option · eo_start_date~end_date · change_type · part_type · writer_id **그리드 16셀**: EO_NO · PROJECT_NO · PROJECT_NAME · UNIT_NAME · PARENT_PART_INFO · PART_NO · PART_NAME · QTY · QTY_TEMP · CHANGE_TYPE_NAME · CHANGE_OPTION_NAME · REVISION · EO_DATE · PART_TYPE_NAME · WRITER_NAME · HIS_REG_DATE_TITLE **액션**: 조회만(Read-Only) **팝업**: partMngHisDetailPopUp(행 클릭) **핵심 의존 테이블**: `part_mng_history` · `project_mgmt` · `part_bom_report` · `pms_wbs_task` · `user_info` · `comm_code` --- ## 3. RPS DB 보유 매트릭스 (적용 완료) | 테이블 | M1 | M2 | M3 | M4 | M5 | 종류 | RPS 상태 | |---|:-:|:-:|:-:|:-:|:-:|---|---| | `part_mng` | R/W | R/W | R | R | R | 메인 | ✅ +15컬럼 ALTER(`301_alter_part_mng.sql`) | | `bom_part_qty` | R | R | R/W | R | R | BOM 수량 | ✅ 신규(`300`) | | `part_bom_report` | R | R | R/W | R | R | BOM 리포트 헤더 | ✅ 신규(`300`) | | `part_mng_history` | – | – | – | – | R | 변경이력 | ✅ 신규(`300`) | | `order_spec_mng` | R | – | – | – | – | 발주 스펙 | ✅ 신규(`300`) | | `admin_supply_mng` | R | – | – | – | – | 공급사(관리자) | ✅ 신규(`300`) | | `supply_mng` | – | – | R | – | – | 공급사 | ✅ 신규(`300`) | | `sales_bom_report` | – | – | – | R | – | 영업 BOM 단가 | ✅ 신규(`300`) | | `product_mgmt_upg_master` | – | – | – | R | – | 제품 업그레이드 마스터 | ✅ 신규(`300`) | | `product_mgmt_upg_detail` | – | – | – | R | – | 제품 업그레이드 디테일 | ✅ 신규(`300`) | | `project_mgmt` | – | – | R | R | R | 프로젝트 | ✅ 기존 | | `pms_wbs_task` | – | – | R | R | R | 작업/유닛 | ✅ 기존 | | `user_info` | – | – | R | R | R | 사용자 | ✅ 기존(컬럼명 매핑 필요) | | `comm_code` | – | – | R | R | R | 공통코드 | ✅ 기존 | | `product_mgmt` | – | – | R | R | – | 제품 | ✅ 기존 | **→ 5개 메뉴 모두 P1에서 실데이터 표시 가능.** --- ## 4. GAP 매트릭스 | # | 우선 | 항목 | 권장 작업 | |---|---|---|---| | **DEV-1** | 🔴 | 개발관리 메뉴 자체 부재 → 5개 메뉴 운영판 1:1 이식 | **본 PR 시리즈 (3 묶음)** | | **DEV-2** | 🔴 | `part_mng` 15컬럼 누락 (열처리/표면처리/단위/Y-N flag) | ✅ **완료** — `301_alter_part_mng.sql` | | **DEV-3** | 🔴 | 9개 테이블 부재 | ✅ **완료** — `300_part_bom.sql` (BEGIN/COMMIT 트랜잭션, IDEMPOTENT) | | **DEV-4** | 🟠 | `user_info` 컬럼명 매핑 (wace `empseq`/`rank` ↔ vexplor `emp_seq`/`rank_code`+`rank_name`) | 코드 측 alias로 처리 | | **DEV-5** | 🟠 | M3 상태값(작성중/적용완료 등) — wace는 `comm_code` 0000099 자식 사용 | comm_code 그대로 사용. RPS DB에 이미 존재 여부 확인 후 부재 시 INSERT | | **DEV-6** | 🟠 | M1·M2 팝업(등록/상세) 다이얼로그 — wace `partMngFormPopUp.jsp` 별도 LOC 큼 | M1·M2 묶음 PR에 포함 (한 번에 가는 게 효율) | | **DEV-7** | 🟡 | M1 도면 다중 업로드 / M2 ERP 업로드 | 본 PR 시리즈 제외 (별 PR) | | **DEV-8** | 🟡 | M3 BOM Excel Import / M4 엑셀 다운로드 | 본 PR 시리즈 제외 (별 PR) | | **DEV-9** | 🟢 | M4 동적 MAX_LEVEL 컬럼 — BOM 트리 깊이에 따라 컬럼 추가 | DataGrid 동적 컬럼 모드. 본 PR(E-BOM 묶음)에 포함 | | **DEV-10** | 🟢 | `admin_supply_mng.employee_email` 운영 타입 버그(`xid`) | ✅ **완료** — `300` 추출 시 `character varying`으로 정정 | --- ## 5. PR 묶음 스코프 (3 PR 시리즈) ### 5.1 PR-A : PART 등록·조회 묶음 (M1+M2) **범위**: - backend: `routes/devPartRoutes.ts` + `services/devPartService.ts` + `controllers/devPartController.ts` - 엔드포인트: `/api/development/part-temp/list`·`/deploy`, `/api/development/part/list`·`/:objid`, `/api/development/part` (DELETE) - frontend: - `app/(main)/COMPANY_16/development/part-regist/page.tsx` (M1) - `app/(main)/COMPANY_16/development/part-search/page.tsx` (M2) - `components/development/PartFormDialog.tsx` (등록/수정 공용) - `components/development/PartDetailDialog.tsx` (상세) - `lib/api/devPart.ts` - 매퍼 1:1: `partMngTempGridList` · `partMngGridList` · `partMngFormPopUp` · `partMngDeploy` · `partMngDelete` **제외**: 도면 다중 업로드 · ERP 업로드 · Excel Import → 별 PR ### 5.2 PR-B : E-BOM 등록·조회 묶음 (M3+M4) **범위**: - backend: `routes/devBomRoutes.ts` + `services/devBomService.ts` + `controllers/devBomController.ts` - 엔드포인트: `/api/development/ebom/list`·`/status`·`/:objid` (DELETE), `/api/development/ebom/ascending`·`/descending` - frontend: - `app/(main)/COMPANY_16/development/ebom-regist/page.tsx` (M3) - `app/(main)/COMPANY_16/development/ebom-search/page.tsx` (M4) - `components/development/BomStandardFormDialog.tsx` (M3 등록) - `components/development/BomStatusChangeDialog.tsx` (M3 상태변경) - `lib/api/devBom.ts` - M4 동적 MAX_LEVEL 컬럼 처리 (DataGrid 동적 컬럼) **제외**: BOM Excel Import · 정/역전개 엑셀 다운로드 → 별 PR ### 5.3 PR-C : 설계변경 리스트 (M5) **범위**: - backend: `routes/devEoHistoryRoutes.ts` + `services/devEoHistoryService.ts` + `controllers/devEoHistoryController.ts` - 엔드포인트: `/api/development/eo/history/list` (read-only) - frontend: - `app/(main)/COMPANY_16/development/change-list/page.tsx` - `components/development/PartHisDetailDialog.tsx` (행 클릭 상세) - `lib/api/devEoHistory.ts` - read-only — INSERT/UPDATE/DELETE 없음 --- ## 6. 사용자 결정 사항 (2026-05-12) | # | 항목 | 결정 | |---|---|---| | 1 | 도메인 폴더 | 단일 `development/` | | 2 | 메뉴 진행 순서 | PART 묶음(M1+M2) → E-BOM 묶음(M3+M4) → 설계변경(M5) | | 3 | 문서 구조 | 단일 00-gap.md (본 문서) + 묶음별 *.md (총 3개) | | 4 | DDL 적용 | 운영DB → vexplor_rps 직접 적용 완료 (9 신규 + 1 ALTER) | --- ## 7. 다음 단계 1. **PR-A** : `01-part.md` 작성 → backend route → frontend page 2개 → verify 2. **PR-B** : `02-ebom.md` 작성 → backend route → frontend page 2개 → verify 3. **PR-C** : `03-eo-history.md` 작성 → backend route → frontend page → verify