backend (M1+M2):
- devPartService: listTemp/listRelease/getByObjid/create/update/deploy/removeMany
- partMngBaseSimple SELECT + 추가 15컬럼(acctfg/odrfg/unit_dc/unitmang_dc/lot_fg 등) 라벨/CASE
- deploy 트랜잭션 3단계 (isLastInit → part_mng_history INSERT → partMngDeploy + EO_NO 채번)
- EO_NO 분기: is_longd='1'→EOB{yy}-{seq} / else EO{yy}-{seq}
- objidUtil: wace CommonUtils.createObjId() 1:1 (bigint objid 채번)
- DDL: 9 신규 테이블 + part_mng 15컬럼 ALTER (운영판 1:1 추출)
frontend (M1+M2):
- part-regist (M1) / part-search (M2): 23셀 그리드 + 검색폼 + 액션
- PartFormDialog: 등록/수정 통합 (mode prop, 4 섹션)
- PartDetailDialog: 읽기 전용 + "수정" dispatch
- AdminPageRenderer dynamic 임포트 2건 + menu_info URL spec 정렬
본 PR 제외 (별 PR): 도면 다중 업로드, ERP 업로드, Excel Import, BOM_PART_QTY R/W
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
12 KiB
개발관리 이식 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.tsxcomponents/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. 다음 단계
- PR-A :
01-part.md작성 → backend route → frontend page 2개 → verify - PR-B :
02-ebom.md작성 → backend route → frontend page 2개 → verify - PR-C :
03-eo-history.md작성 → backend route → frontend page → verify