· wace fn_openSaleRegPopup(PROJECT_NO, "detail") 의도 재해석 — read-only 상세 조회 모드 · 행 전체 클릭(onRowClick) → PROJECT_NO 컬럼 셀 클릭(cellClick)으로 좁힘 (wace 1:1) · 판매관리 페이지 라우팅 폐기 → ProjectInfoDialog 신설 (같은 탭, list row 직접 사용, 추가 API 호출 0) · 표시 항목: 프로젝트번호/영업번호/주문유형/제품구분/국내해외/고객사/유무상/품번/품명/S/N/수주수량/접수일/요청납기/발주일/프로젝트명/작성자 · 영업관리 변경 롤백 (SaleListFilter.project_no, useSearchParams 자동 선택, 초기화 핸들러) · 01-progress / 01-progress-verify 문서 갱신 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.8 KiB
01. 진행관리 이식 상세 매핑
원본:
/project/projectMgmtWbsList3.do(projectMgmtWbsList3.jsp349줄) + 매퍼projectMgmtWbsGridList(project.xml:3854~4280) 대상:app/(main)/COMPANY_16/project/progress/page.tsx+backend-node/src/services/projectMgmtService.ts작성: 2026-05-11 / 사이클: 구조적 검증 1차 (진행관리 메뉴)
1. 운영판 식별
wace_plm 컨트롤러에 진행관리 관련 endpoint 3개 동시 존재:
| URL | view | 사용처 |
|---|---|---|
/project/projectMgmtList.do (L321) |
projectMgmtList.jsp |
옛 화면 (사용 안 함) |
/project/projectMgmtList1.do (L399) |
projectMgmtList1.jsp |
변종 |
/project/projectMgmtWbsList3.do (L3243) |
projectMgmtWbsList3.jsp |
RPS 운영판 화면 ✅ |
운영판 화면 캡처에서 컬럼 라벨(
주문유형/품번/품명/S/N/수주수량/E-BOM/M-BOM/발주일/입고율/제조1,2팀/...)이 일치하는 jsp를 grep으로 역추적해 확정.
2. 항목 매핑
2.1 검색 폼 — wace 활성 11개 (jsp:222-313)
| # | wace 라벨 | wace name | RPS filter (ProgressListFilter) |
입력 위젯 | 상태 |
|---|---|---|---|---|---|
| 1 | 년도 | Year |
Year |
<select> (sysYear±4) |
✅ |
| 2 | 프로젝트번호 | project_no (multi-select2) |
project_nos |
SmartSelect (단일, 옵션 API 사용) |
🟡 (다중 → 단일) |
| 3 | 주문유형 | category_cd |
category_cd |
CommCodeSelect groupId="0000167" |
✅ |
| 4 | 고객사 | customer_objid |
customer_objid |
CustomerSelect |
✅ |
| 5 | 제품구분 | product |
product |
CommCodeSelect groupId="0000001" |
✅ |
| 6 | 요청납기일 (from~to) | contract_start_date / contract_end_date |
동일 | <Input type="date"> × 2 |
✅ |
| 7 | 국내/해외 | area_cd |
area_cd ('국내'/'해외' 라벨) |
<select> 정적 |
✅ |
| 8 | 유/무상 | free_of_charge |
free_of_charge ('유상'/'무상' 라벨) |
<select> 정적 |
✅ |
| 9 | 품번 | product_item_code (select2-part) |
search_partObjId |
PartSelect mode="partNo" |
🟡 (영업관리 패턴 통일) |
| 10 | 품명 | product_item_name (select2-part) |
search_partObjId (공유) |
PartSelect mode="partName" |
🟡 (영업관리 패턴 통일) |
| 11 | S/N | serial_no |
serial_no |
<Input> |
✅ |
비활성 (JSP <%-- --%> 블록): location / setup / pm_user_id — 무시.
2.2 그리드 컬럼 — wace 8그룹 18셀 → RPS 평탄화 21셀
DataGrid 중첩 헤더 미지원으로 그룹명을 라벨 prefix(이슈/원가/...)로 표현. wace SQL projectMgmtWbsGridList 활성 본문 1:1.
| # | wace title | wace field | RPS GRID_COLUMNS key | SQL 출처 | 상태 |
|---|---|---|---|---|---|
| 1 | 프로젝트번호 (frozen) | PROJECT_NO |
project_no |
project_mgmt.project_no |
✅ |
| 2 | 주문유형 | CATEGORY_NAME |
category_name |
CODE_NAME(category_cd) |
✅ |
| 3 | 제품구분 | PRODUCT_NAME |
product_name |
CODE_NAME(product) |
✅ |
| 4 | 국내/해외 | AREA_NAME |
area_name |
CODE_NAME(area_cd) |
✅ |
| 5 | 접수일 | REG_DATE |
reg_date |
TO_CHAR(regdate,'YYYY-MM-DD') |
✅ |
| 6 | 고객사 | CUSTOMER_NAME |
customer_name |
customer_mng LEFT JOIN |
✅ (RPS 매핑) |
| 7 | 유/무상 | FREE_OF_CHARGE |
free_of_charge |
contract_mgmt.paid_type → '유상'/'무상' |
✅ |
| 8 | 품번 | PRODUCT_ITEM_CODE |
product_item_code |
project_mgmt.part_no |
✅ |
| 9 | 품명 | PRODUCT_ITEM_NAME |
product_item_name |
project_mgmt.part_name |
✅ |
| 10 | S/N | SERIAL_NO |
serial_no |
contract_item_serial 집계 |
✅ |
| 11 | 수주수량 | CONTRACT_QTY |
contract_qty |
project_mgmt.quantity::numeric |
✅ |
| 12 | 요청납기 | REQ_DEL_DATE |
req_del_date |
COALESCE(contract_item.due_date, project_mgmt.due_date, contract_mgmt.due_date) |
✅ |
| 13 | E-BOM | EBOM_STATUS |
ebom_status |
project_mgmt.ebom_status |
✅ (운영도 대부분 빈값) |
| 14 | M-BOM | MBOM_STATUS |
mbom_status |
project_mgmt.mbom_status |
✅ |
| 15 | 발주일 | ORDER_DATE |
order_date |
contract_mgmt.order_date 스칼라 서브쿼리 |
✅ |
| 16 | 입고율 | RECEIVING_RATE |
receiving_rate |
project_mgmt.receiving_rate |
✅ |
| 17 | 제조1,2팀 | PRODUCTION_TEAM_12 |
production_team_12 |
project_mgmt.production_team_12 |
✅ |
| 18 | 제조3팀 | PRODUCTION_TEAM_3 |
production_team_3 |
project_mgmt.production_team_3 |
✅ |
| 19 | 조립 | ASSEMBLY |
assembly |
wace SQL에 없음 → NULL | ✅ (운영도 빈값) |
| 20 | 검증 | VERIFICATION |
verification |
wace SQL에 없음 → NULL | ✅ |
| 21 | 출하일 | SHIPMENT_DATE |
shipment_date |
sales_registration.shipping_date (project_no 매칭, MAX sale_no) |
✅ |
2.3 ORDER BY
ORDER BY SUBSTRING(project_no, POSITION('-' IN project_no)+1) DESC,
overhaul_order DESC NULLS LAST
→ "주문유형-제품구분-YYMMDD-NNN" 패턴에서 첫 - 이후 부분 내림차순 = 사실상 (제품구분 → YYMMDD → NNN) 역순.
2.4 액션
| 동작 | wace | RPS |
|---|---|---|
| 조회 | btnSearch → /projectMgmtWbsGridList.do |
GET /api/project/progress/list |
| 프로젝트번호 옵션 | code_map.project_no = common.getCusProjectNoList |
GET /api/project/progress/project-no-options |
| PROJECT_NO 셀 클릭 (cellClick) | fn_openSaleRegPopup(PROJECT_NO, "detail") → /salesMgmt/salesRegForm.do?orderNo={PROJECT_NO}&saleNo=detail 새 창(read-only 상세 모드) |
ProjectInfoDialog (같은 탭 다이얼로그) — 그리드 row 객체 그대로 read-only 표시 |
행 클릭은 PROJECT_NO 컬럼 셀에만 걸림 (wace cellClick). 행 전체 클릭은 그냥 행 선택만. wace의 "detail" 모드 새 창은 RPS에서는 같은 탭 내 ProjectInfoDialog로 매핑 — 별도 API 호출 없이 list 응답(ProgressRow)을 그대로 다이얼로그에 전달해 read-only 표시. 표시 항목: 프로젝트번호 / 영업번호 / 주문유형 / 제품구분 / 국내해외 / 고객사 / 유무상 / 품번 / 품명 / S/N / 수주수량 / 접수일 / 요청납기 / 발주일 / 프로젝트명 / 작성자.
3. RPS 매핑 변경 사항
| wace 분기 | RPS 매핑 | 이유 |
|---|---|---|
CASE WHEN customer_objid LIKE 'C_%' THEN client_mng ELSE supply_mng END |
LEFT JOIN customer_mng ON customer_code = substring/통합 |
RPS는 customer_mng 단일 마스터 (영업관리 G1 자산) |
product_item_code / product_item_name LIKE 텍스트 검색 |
search_partObjId 단일 part_objid 매칭 |
영업관리 패턴 통일 + RPS의 PartSelect 컴포넌트 재사용 |
CODE_NAME(...) 함수 호출 |
동일 (RPS DB 함수 보유) | 영업관리는 LEFT JOIN 패턴이지만 진행관리는 함수 호출 12회로 가독성 우선 |
4. 의존 테이블 (활성 SQL 기준 20개 중 RPS 보유 12개)
✅ project_mgmt(메인) / contract_mgmt / contract_item / contract_item_serial / customer_mng / user_info / comm_code + CODE_NAME() 함수 / attach_file_info / sales_registration / part_mng
❌ pms_wbs_task / setup_wbs_task / assembly_wbs_task / bom_part_qty / part_bom_report / planning_issue / release_mgmt / input_cost_goal / expense_master/detail / work_diary
→ 부재한 테이블이 의존하는 SQL 항목들(진척율 / 이슈 카운트 / 투입원가 / 출고)은 wace JSP 그리드 컬럼 정의에 노출되지 않음 (8그룹 18셀에 포함 X). 따라서 그리드 표시 데이터엔 영향 없음. backend SQL은 0 / NULL 자리만 유지 후 P2(WBS) 이식에서 채움.
5. 미구현 / P1.5+ 보류
| 항목 | 메모 |
|---|---|
| 다중 프로젝트번호 선택 | wace는 multi-select2. RPS는 단일(SmartSelect). 다중 모드는 P1.5에서 보강 가능 |
| 진척율 / 이슈 / 원가 / 출고 컬럼 채움 | 그리드 표시 컬럼엔 없으므로 영향 없음. 그러나 service SQL의 0 자리들은 P2에서 활성화 |
getById / updateProject 라우트 |
옛 jsp(projectMgmtList) 기반 자리. 행 클릭이 ProjectInfoDialog (list row 직접 사용)로 통일됐으므로 미사용 — 삭제 검토 가능 |
| 엑셀 다운로드 | wace에 없음 — 본 PR 제외 |