진행관리 P1.5 행 클릭 + 검증 문서 — 판매관리 라우팅 (wace fn_openSaleRegPopup 대응)
· 진행관리 행 클릭 → /COMPANY_16/sales/sale?project_no={PROJECT_NO} 라우팅
· 판매관리 page: useSearchParams로 project_no 자동 필터 + 첫 매칭 행 자동 선택 + 초기화 핸들러 보강
· backend SaleListFilter.project_no 추가 (T.project_no = $1 단일 매칭, 기존 영업 흐름 무영향)
· wace 새창 패턴 → RPS SPA 동일 탭 라우팅으로 매핑 (의도 동일)
· docs/migration/project/01-progress.md + 01-progress-verify.md 신설 (영업관리 검증 문서 패턴)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
# 01. 진행관리 wace 1:1 검증
|
||||
|
||||
> 작성: 2026-05-11 / 사이클: 구조적 검증 1차
|
||||
> 목적: wace 운영판 화면(`projectMgmtWbsList3.jsp`)과 RPS 진행관리(`/COMPANY_16/project/progress`)를 데이터 단위로 1:1 일치 확인 + 갭 검증 + 사용자 시나리오 검증.
|
||||
|
||||
## 0. 자격증명
|
||||
|
||||
```
|
||||
RPS : host=211.115.91.141 port=11134 db=vexplor_rps user=postgres pw=vexplor0909!!
|
||||
운영DB : host=211.115.91.141 port=11133 db=waceplm user=postgres pw=waceplm0909!!
|
||||
```
|
||||
|
||||
## 1. 데이터 일치 검증
|
||||
|
||||
### 1.1 운영판 화면 첫 행 일치
|
||||
|
||||
운영판 `projectMgmtWbsList3` 그리드 첫 행 (사용자 화면 캡처) 기준:
|
||||
```
|
||||
PROJECT_NO = S-기타-260506-001
|
||||
주문유형 = 판매
|
||||
제품구분 = 기타
|
||||
국내/해외 = 국내
|
||||
접수일 = 2026-05-06
|
||||
고객사 = 한미반도체주식회사
|
||||
유/무상 = 유상
|
||||
품번 = 31011-0012
|
||||
품명 = CARBON BRUSH SET (HMD V2)
|
||||
수주수량 = 8
|
||||
발주일 = 2026-05-06
|
||||
```
|
||||
|
||||
RPS service SQL 검증:
|
||||
```sql
|
||||
PGPASSWORD='vexplor0909!!' psql -h 211.115.91.141 -p 11134 -U postgres -d vexplor_rps <<SQL
|
||||
SELECT
|
||||
T.PROJECT_NO
|
||||
,CODE_NAME(T.CATEGORY_CD) AS CATEGORY_NAME
|
||||
,CODE_NAME(T.PRODUCT) AS PRODUCT_NAME
|
||||
,CODE_NAME(T.AREA_CD) AS AREA_NAME
|
||||
,TO_CHAR(T.REGDATE,'YYYY-MM-DD') AS REG_DATE
|
||||
,C.customer_name AS CUSTOMER_NAME
|
||||
,(SELECT CASE WHEN O.paid_type='paid' THEN '유상' WHEN O.paid_type='free' THEN '무상' END
|
||||
FROM contract_mgmt O WHERE O.objid=T.CONTRACT_OBJID) AS FREE_OF_CHARGE
|
||||
,T.PART_NO AS PRODUCT_ITEM_CODE
|
||||
,T.PART_NAME AS PRODUCT_ITEM_NAME
|
||||
,COALESCE(NULLIF(T.QUANTITY,'')::numeric,0) AS CONTRACT_QTY
|
||||
,(SELECT O.order_date FROM contract_mgmt O WHERE O.objid=T.CONTRACT_OBJID) AS ORDER_DATE
|
||||
FROM project_mgmt T
|
||||
LEFT JOIN customer_mng C
|
||||
ON C.customer_code = CASE WHEN T.CUSTOMER_OBJID LIKE 'C_%' THEN substring(T.CUSTOMER_OBJID,3) ELSE T.CUSTOMER_OBJID END
|
||||
WHERE T.PROJECT_NO = 'S-기타-260506-001';
|
||||
SQL
|
||||
```
|
||||
|
||||
기대 결과: 운영판 화면 첫 행과 모든 컬럼 값 100% 일치 — **검증 완료 (2026-05-11)** ✅
|
||||
|
||||
### 1.2 정렬 검증 (wace ORDER BY 1:1)
|
||||
|
||||
```sql
|
||||
SELECT PROJECT_NO,
|
||||
SUBSTRING(PROJECT_NO, POSITION('-' IN PROJECT_NO)+1) AS sort_key,
|
||||
OVERHAUL_ORDER
|
||||
FROM project_mgmt
|
||||
ORDER BY SUBSTRING(PROJECT_NO, POSITION('-' IN PROJECT_NO)+1) DESC,
|
||||
OVERHAUL_ORDER DESC NULLS LAST
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
운영판 화면과 동일한 행 순서로 출력되는지 확인.
|
||||
|
||||
### 1.3 부속 테이블 매칭 검증
|
||||
|
||||
```sql
|
||||
-- contract_item.due_date COALESCE 1순위 확인 (요청납기)
|
||||
SELECT T.project_no, T.due_date AS pmgmt_due,
|
||||
(SELECT CI.due_date FROM contract_item CI
|
||||
WHERE CI.contract_objid = T.contract_objid AND CI.part_objid = T.part_objid AND CI.status='ACTIVE'
|
||||
ORDER BY CI.objid DESC LIMIT 1) AS ci_due,
|
||||
(SELECT CM.due_date FROM contract_mgmt CM WHERE CM.objid = T.contract_objid) AS cm_due
|
||||
FROM project_mgmt T WHERE T.project_no = 'S-기타-260506-001';
|
||||
|
||||
-- contract_item_serial S/N 집계 검증
|
||||
SELECT T.project_no,
|
||||
(SELECT MIN(CIS.serial_no) FROM contract_item_serial CIS
|
||||
WHERE CIS.item_objid::varchar = T.contract_item_objid AND UPPER(CIS.status)='ACTIVE') AS first_sn,
|
||||
(SELECT COUNT(*) FROM contract_item_serial CIS
|
||||
WHERE CIS.item_objid::varchar = T.contract_item_objid AND UPPER(CIS.status)='ACTIVE') AS sn_cnt
|
||||
FROM project_mgmt T WHERE T.project_no = 'R-기타-260410-001';
|
||||
|
||||
-- sales_registration 출하일 매칭
|
||||
SELECT T.project_no, SR.shipping_date, SR.sale_no
|
||||
FROM project_mgmt T
|
||||
LEFT JOIN sales_registration SR ON SR.project_no = T.project_no
|
||||
WHERE SR.sale_no IS NOT NULL
|
||||
ORDER BY SR.sale_no DESC LIMIT 10;
|
||||
```
|
||||
|
||||
## 2. 빈 컬럼 진단 (운영판도 동일하게 빈가 확인)
|
||||
|
||||
```sql
|
||||
-- vexplor_rps
|
||||
SELECT count(*) AS total,
|
||||
count(NULLIF(project_name,'')) AS project_name,
|
||||
count(NULLIF(setup,'')) AS setup,
|
||||
count(NULLIF(facility,'')) AS facility,
|
||||
count(NULLIF(pm_user_id,'')) AS pm_user_id,
|
||||
count(NULLIF(manufacture_plant,'')) AS manufacture_plant,
|
||||
count(NULLIF(req_del_date,'')) AS req_del_date,
|
||||
count(NULLIF(ebom_status,'')) AS ebom_status,
|
||||
count(NULLIF(mbom_status,'')) AS mbom_status,
|
||||
count(NULLIF(receiving_rate,'')) AS receiving_rate
|
||||
FROM project_mgmt;
|
||||
```
|
||||
|
||||
기대: 대부분 0건 — **2026-05-11 검증 완료**. `category_cd`/`customer_objid`/`product`/`contract_no`/`contract_result`/`part_no`/`part_name`/`quantity`/`contract_item_objid`/`area_cd`/`writer`/`regdate`만 채워짐. 운영DB(11133/`waceplm`) 89건도 동일 — 코드/이식 정상.
|
||||
|
||||
## 3. 검색 필터 시나리오
|
||||
|
||||
| 시나리오 | 입력 | 기대 결과 | SQL 단편 |
|
||||
|---|---|---|---|
|
||||
| Year | `Year=2026` | 2026년 등록건만 | `TO_CHAR(REGDATE,'YYYY') = '2026'` |
|
||||
| 프로젝트번호 | `project_nos=507449280` (단일 OBJID) | 1건 | `OBJID IN ('507449280')` |
|
||||
| 주문유형 | `category_cd=0001792` (판매) | 판매건만 | `CATEGORY_CD = '0001792'` |
|
||||
| 고객사 | `customer_objid=C_0000003094` | 한미반도체분 47건 | `CUSTOMER_OBJID = 'C_0000003094'` |
|
||||
| 국내/해외 | `area_cd=국내` | `CODE_NAME(area_cd)='국내'` 매칭 | `CODE_NAME(AREA_CD) = '국내'` |
|
||||
| 유/무상 | `free_of_charge=유상` | contract_mgmt.paid_type='paid'인 행 | `(... paid_type 매핑) = '유상'` |
|
||||
| 품번 | `search_partObjId=1626888159` | 특정 part_objid 매칭건 | `T.PART_OBJID = '1626888159'` |
|
||||
| S/N | `serial_no=M080` | contract_item_serial 매칭 | `EXISTS (... CIS.serial_no LIKE '%M080%')` |
|
||||
| 요청납기 from~to | `2026-04-01` ~ `2026-05-31` | COALESCE 3단 매칭 | `TO_DATE(COALESCE(CI.due_date, T.DUE_DATE, CM.due_date),'YYYY-MM-DD') BETWEEN ...` |
|
||||
|
||||
각 시나리오는 `GET /api/project/progress/list?...` 로 직접 호출 또는 화면에서 검색 후 응답 행 수 / 첫 행 데이터 확인.
|
||||
|
||||
## 4. P1.5 행 클릭 라우팅 검증
|
||||
|
||||
### 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. "출하지시/판매등록" 버튼 활성화
|
||||
|
||||
### 4.2 매칭 데이터 부재 케이스
|
||||
|
||||
진행관리에는 있지만 판매관리(project_mgmt 메인 + sales_registration LEFT JOIN)에 매칭이 없는 경우:
|
||||
- Toast: `프로젝트번호 {PROJECT_NO} 의 판매 데이터가 없습니다.`
|
||||
- 그리드 0건 표시
|
||||
- 사용자가 검색 초기화로 전체 복귀 가능 (초기화 버튼이 `project_no`도 비움)
|
||||
|
||||
### 4.3 backend 검증
|
||||
|
||||
```bash
|
||||
curl -s "http://localhost:8080/api/project/progress/list?project_nos=PJ-1778222043948-342" \
|
||||
-H "Cookie: ..." | jq '.data | length' # 1 기대
|
||||
|
||||
curl -s "http://localhost:8080/api/sales?project_no=S-CT-260507-003" \
|
||||
-H "Cookie: ..." | jq '.data | length' # 1 기대 (판매관리에 해당 행 매칭 시)
|
||||
```
|
||||
|
||||
## 5. 미구현 / 알려진 갭
|
||||
|
||||
| 항목 | 메모 | 후속 |
|
||||
|---|---|---|
|
||||
| 다중 프로젝트번호 검색 | wace multi-select2 → RPS 단일 `SmartSelect` | P1.5+ |
|
||||
| 진척율 / 이슈 / 원가 / 출고 컬럼 데이터 | 그리드 표시엔 안 들어가지만 service SQL 자리는 0/NULL | P2(WBS) |
|
||||
| `getById` / `updateProject` 라우트 | 옛 jsp 기반 — 행 클릭 라우팅 통일 후 미사용 | 정리 검토 |
|
||||
|
||||
## 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` 정상 진입 / 조회 / 판매등록 흐름 확인.
|
||||
@@ -0,0 +1,116 @@
|
||||
# 01. 진행관리 이식 상세 매핑
|
||||
|
||||
> 원본: `/project/projectMgmtWbsList3.do` (`projectMgmtWbsList3.jsp` 349줄) + 매퍼 `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
|
||||
|
||||
```sql
|
||||
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` |
|
||||
| **행 클릭** | `cellClick: fn_openSaleRegPopup(PROJECT_NO, "detail")` → `/salesMgmt/salesRegForm.do?orderNo={PROJECT_NO}` 새 창 | `router.push('/COMPANY_16/sales/sale?project_no={PROJECT_NO}')` 페이지 라우팅 + 자동 필터/선택 |
|
||||
|
||||
행 클릭 처리는 RPS SPA 패턴에 맞춰 새 창 대신 같은 탭 내 페이지 라우팅 + URL 쿼리로 `project_no` 전달. 판매관리 페이지가 `useSearchParams`로 받아 검색폼에 자동 적용 + 첫 매칭 행 자동 선택. wace의 의도(특정 프로젝트의 판매 등록 화면 보여주기)는 동일하게 달성.
|
||||
|
||||
## 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) 기반으로 만든 자리. 행 클릭이 판매관리 라우팅으로 통일됐으므로 미사용 — 삭제 검토 가능 |
|
||||
| 엑셀 다운로드 | 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`)
|
||||
- 검증: [01-progress-verify.md](./01-progress-verify.md)
|
||||
Reference in New Issue
Block a user