진행관리 P1.5 재작업 — PROJECT_NO 셀 클릭 시 프로젝트 정보 다이얼로그

· 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>
This commit is contained in:
hjjeong
2026-05-12 12:06:01 +09:00
parent 332688a441
commit 7c4817b045
8 changed files with 117 additions and 71 deletions
+21 -30
View File
@@ -130,35 +130,34 @@ SELECT count(*) AS total,
각 시나리오는 `GET /api/project/progress/list?...` 로 직접 호출 또는 화면에서 검색 후 응답 행 수 / 첫 행 데이터 확인.
## 4. P1.5 행 클릭 라우팅 검증
## 4. P1.5 PROJECT_NO 셀 클릭 → 프로젝트 정보 다이얼로그 검증
### 4.1 시나리오
1. `/COMPANY_16/project/progress` 진입 → 그리드 90건
2. 임의 행(예: `S-CT-260507-003`) 클릭
3. 브라우저 URL이 `/COMPANY_16/sales/sale?project_no=S-CT-260507-003` 로 변경
4. 판매관리 페이지 로딩 후:
- `searchForm.project_no` 자동 세팅
- 그리드에 매칭 행 1건만 표시
- 그 행이 자동 선택(`selected`) 상태
5. "출하지시/판매등록" 버튼 활성화
2. **PROJECT_NO 컬럼 셀만 클릭** (wace `cellClick`과 동일). 다른 컬럼 셀 클릭은 행 선택만.
3. `ProjectInfoDialog` 오픈 — 같은 탭 내 다이얼로그 (새 창 X)
4. 다이얼로그 내용 확인:
- 프로젝트번호 / 영업번호 / 주문유형 / 제품구분 / 국내해외 / 고객사 / 유무상 / 품번 / 품명 / S/N / 수주수량 / 접수일 / 요청납기 / 발주일 / 프로젝트명 / 작성자
- 모두 read-only (편집 불가)
- 빈 값은 `-` 로 표시
5. 닫기 버튼으로 다이얼로그 닫힘
### 4.2 매칭 데이터 부재 케이스
### 4.2 별도 API 호출 없음
진행관리에는 있지만 판매관리(project_mgmt 메인 + sales_registration LEFT JOIN)에 매칭이 없는 경우:
- Toast: `프로젝트번호 {PROJECT_NO} 의 판매 데이터가 없습니다.`
- 그리드 0건 표시
- 사용자가 검색 초기화로 전체 복귀 가능 (초기화 버튼이 `project_no`도 비움)
list SQL 응답(`ProgressRow`)에 표시 필요 데이터가 모두 포함돼 있어 다이얼로그 오픈 시 추가 fetch 없음. 네트워크 검증:
- DevTools Network 패널 → 셀 클릭 시 추가 `/api/...` 호출 0건 확인
### 4.3 backend 검증
### 4.3 wace 운영판과의 차이
```bash
curl -s "http://localhost:8080/api/project/progress/list?project_nos=PJ-1778222043948-342" \
-H "Cookie: ..." | jq '.data | length' # 1 기대
| 항목 | wace | RPS |
|---|---|---|
| 클릭 대상 | PROJECT_NO 셀 (cellClick) | 동일 |
| 화면 형식 | 새 창 (`fn_centerPopup` 1000×550) | 같은 탭 내 Dialog |
| 모드 | `saleNo="detail"` (판매등록 폼 detail 모드) | 프로젝트 정보 read-only |
| 데이터 | `salesRegForm.do?orderNo=...` 서버 렌더 | list row 객체 직접 사용 (추가 API 호출 없음) |
curl -s "http://localhost:8080/api/sales?project_no=S-CT-260507-003" \
-H "Cookie: ..." | jq '.data | length' # 1 기대 (판매관리에 해당 행 매칭 시)
```
RPS는 SPA 패턴 + 진행관리 본연의 목적이 "프로젝트 상황 모니터링"이라 정보 표시에 집중. 판매 등록은 영업관리 판매관리 메뉴에서 처리.
## 5. 미구현 / 알려진 갭
@@ -168,14 +167,6 @@ curl -s "http://localhost:8080/api/sales?project_no=S-CT-260507-003" \
| 진척율 / 이슈 / 원가 / 출고 컬럼 데이터 | 그리드 표시엔 안 들어가지만 service SQL 자리는 0/NULL | P2(WBS) |
| `getById` / `updateProject` 라우트 | 옛 jsp 기반 — 행 클릭 라우팅 통일 후 미사용 | 정리 검토 |
## 6. 회귀 방지 — 영업관리에 미친 변경
## 6. 회귀 방지 — 영업관리에 영향 없음
진행관리 P1.5 라우팅을 위해 추가 변경 — 회귀 검증 필요:
| 파일 | 변경 | 회귀 위험 |
|---|---|---|
| `backend-node/src/services/salesSaleService.ts` | `SaleListFilter.project_no` 추가, `getSaleList`에 1줄 필터 추가 | 기존 영업 검색 흐름 영향 없음 (조건 추가만) |
| `frontend/lib/api/salesSale.ts` | `SaleListFilter.project_no` 타입만 추가 | 무영향 |
| `frontend/app/(main)/COMPANY_16/sales/sale/page.tsx` | `useSearchParams` import + 자동 행 선택 useEffect 추가, 검색폼/초기화 핸들러에 `project_no: ""` 추가 | URL 쿼리 없으면 기존 동작과 동일 |
→ 영업관리 4개 메뉴 회귀 테스트 시 `/sales/sale` 정상 진입 / 조회 / 판매등록 흐름 확인.
P1.5 초기 시도(판매관리 페이지 라우팅)는 사용자 의도와 어긋나 폐기. 영업관리에 추가했던 변경(`SaleListFilter.project_no` / `useSearchParams` 자동 선택 / 검색폼 `project_no` 필드)을 모두 롤백해 **영업관리에 변경 영향 없음**. 진행관리 P1.5는 진행관리 페이지 + 신규 `ProjectInfoDialog` 컴포넌트만으로 완결됨.
+4 -5
View File
@@ -79,9 +79,9 @@ ORDER BY SUBSTRING(project_no, POSITION('-' IN project_no)+1) DESC,
|---|---|---|
| 조회 | `btnSearch``/projectMgmtWbsGridList.do` | `GET /api/project/progress/list` |
| 프로젝트번호 옵션 | `code_map.project_no = common.getCusProjectNoList` | `GET /api/project/progress/project-no-options` |
| ** 클릭** | `cellClick: fn_openSaleRegPopup(PROJECT_NO, "detail")``/salesMgmt/salesRegForm.do?orderNo={PROJECT_NO}` 새 창 | `router.push('/COMPANY_16/sales/sale?project_no={PROJECT_NO}')` 페이지 라우팅 + 자동 필터/선택 |
| **PROJECT_NO 셀 클릭** (cellClick) | `fn_openSaleRegPopup(PROJECT_NO, "detail")``/salesMgmt/salesRegForm.do?orderNo={PROJECT_NO}&saleNo=detail` 새 창(read-only 상세 모드) | `ProjectInfoDialog` (같은 탭 다이얼로그) — 그리드 row 객체 그대로 read-only 표시 |
행 클릭 처리는 RPS SPA 패턴에 맞춰 새 창 대신 같은 탭 내 페이지 라우팅 + URL 쿼리로 `project_no` 전달. 판매관리 페이지가 `useSearchParams`로 받아 검색폼에 자동 적용 + 첫 매칭 행 자동 선택. wace의 의도(특정 프로젝트의 판매 등록 화면 보여주기)는 동일하게 달성.
행 클릭**PROJECT_NO 컬럼 셀에만** 걸림 (wace `cellClick`). 행 전체 클릭은 그냥 행 선택만. wace의 "detail" 모드 새 창은 RPS에서는 같은 탭 내 `ProjectInfoDialog`로 매핑 — 별도 API 호출 없이 list 응답(`ProgressRow`)을 그대로 다이얼로그에 전달해 read-only 표시. 표시 항목: 프로젝트번호 / 영업번호 / 주문유형 / 제품구분 / 국내해외 / 고객사 / 유무상 / 품번 / 품명 / S/N / 수주수량 / 접수일 / 요청납기 / 발주일 / 프로젝트명 / 작성자.
## 3. RPS 매핑 변경 사항
@@ -105,12 +105,11 @@ ORDER BY SUBSTRING(project_no, POSITION('-' IN project_no)+1) DESC,
|---|---|
| 다중 프로젝트번호 선택 | wace는 multi-select2. RPS는 단일(`SmartSelect`). 다중 모드는 P1.5에서 보강 가능 |
| 진척율 / 이슈 / 원가 / 출고 컬럼 채움 | 그리드 표시 컬럼엔 없으므로 영향 없음. 그러나 service SQL의 `0` 자리들은 P2에서 활성화 |
| `getById` / `updateProject` 라우트 | 옛 jsp(projectMgmtList) 기반으로 만든 자리. 행 클릭이 판매관리 라우팅으로 통일됐으므로 미사용 — 삭제 검토 가능 |
| `getById` / `updateProject` 라우트 | 옛 jsp(projectMgmtList) 기반 자리. 행 클릭이 `ProjectInfoDialog` (list row 직접 사용)로 통일됐으므로 미사용 — 삭제 검토 가능 |
| 엑셀 다운로드 | wace에 없음 — 본 PR 제외 |
## 6. 관련 파일
- backend: [services/projectMgmtService.ts](../../backend-node/src/services/projectMgmtService.ts) · [controllers/projectMgmtController.ts](../../backend-node/src/controllers/projectMgmtController.ts) · [routes/projectMgmtRoutes.ts](../../backend-node/src/routes/projectMgmtRoutes.ts)
- frontend: [app/(main)/COMPANY_16/project/progress/page.tsx](../../frontend/app/(main)/COMPANY_16/project/progress/page.tsx) · [lib/api/projectMgmt.ts](../../frontend/lib/api/projectMgmt.ts)
- 판매관리 연동: [app/(main)/COMPANY_16/sales/sale/page.tsx](../../frontend/app/(main)/COMPANY_16/sales/sale/page.tsx)(useSearchParams `project_no`) · [services/salesSaleService.ts](../../backend-node/src/services/salesSaleService.ts)(`SaleListFilter.project_no`)
- frontend: [app/(main)/COMPANY_16/project/progress/page.tsx](../../frontend/app/(main)/COMPANY_16/project/progress/page.tsx) · [components/project/ProjectInfoDialog.tsx](../../frontend/components/project/ProjectInfoDialog.tsx) · [lib/api/projectMgmt.ts](../../frontend/lib/api/projectMgmt.ts)
- 검증: [01-progress-verify.md](./01-progress-verify.md)