# 개발관리 이식 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
