10 KiB
10 KiB
SN-노후하수관로정비사업 최종확정예산사업 팝업 FE 작업계획
1. 목표와 기준
- 기준 문서:
COMMON_DOCS_ROOT/작업계획/SN-노후하수관로정비사업/006-de-공통-최종확정예산사업팝업-신규기능작업계획.md - 대상 부모 화면:
/oper/obsltPplBiz - 상태: 사용자 승인 구현 완료, 실 API·브라우저 검증 대기
- 부모 화면에서 필수 사업구분을 먼저 선택한 경우에만 공용 브라우저 popup을 연다.
- popup에서 ONSEMIRO 최종확정예산 33개 항목을 조회·다중선택하고 부모 업무로 일괄 등록한다.
- 등록 성공 메시지를 부모에 전달한 뒤 popup을 닫고 부모 목록을 기존 조회조건으로 다시 조회한다.
2. 공통계획 변경사항 동기화 확인
| 항목 | 이전 FE 계획 | 사용자 수정 공통계획 반영 |
|---|---|---|
| 팝업 방식 | 같은 화면의 UiModal |
app/(popupLayout)/popup/[popupKey] 기반 window popup |
| popup 구현 위치 | features/obsltPpl/ui/CfmtnBgtModal.tsx |
features/cfmtnBgt/ui/CfmtnBgtPopupContent.tsx |
| 사업구분 선택 | popup 내부 SelectBox | 부모 화면 조회조건에서 먼저 선택, 미선택 시 알림 후 popup 미오픈 |
| 등록 버튼 | 노후하수관로사업 등록 |
popup의 등록 버튼 |
| 검색 초기값 | 최신연도 일반 조회 | 전년도 및 부모 업무별 세부사업·내역사업·세부내역 자동조건 |
| 지역 데이터 | 신규 옵션 API 직접 사용 | useOperStore.ts에 ONSEMIRO 주소 옵션을 추가하여 사용 |
| 완료 처리 | Modal state close | postMessage로 부모 알림·재조회 요청 후 window.close() |
| 기능 재사용 | 노후하수관로 전용 Modal | 부모 업무정보를 query parameter로 받는 공용 popup content |
3. 예정 수정 파일
| 구분 | 예정 파일 | 변경 계획 |
|---|---|---|
| 부모 연결 | apps/sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx |
사업구분 필수검증, window popup open, 완료 메시지 수신, 기존 조건 재조회 |
| popup 본체 | apps/sn/src/features/cfmtnBgt/ui/CfmtnBgtPopupContent.tsx |
검색, 33개 열, 다중선택, 등록, Excel 다운로드 |
| API | apps/sn/src/features/cfmtnBgt/api/cfmtn-bgt-api.ts |
코드·목록·선택등록 API |
| 타입 | apps/sn/src/features/cfmtnBgt/model/cfmtn-bgt-types.ts |
33개 조회필드, 검색·등록·응답, 부모 context 계약 |
| Excel | apps/sn/src/features/cfmtnBgt/lib/cfmtn-bgt-excel.ts |
적용 조회조건 전체 결과 XLSX 생성 |
| popup 정의 | apps/sn/src/features/windowPopup/model/popupDefinitions.ts |
cfmtnBgt key, 제목, 대형 popup 크기, 필수 query parameter 정의 |
| popup 등록 | apps/sn/src/features/windowPopup/registry.tsx |
CfmtnBgtPopupContent registry 연결 |
| 완료 메시지 | apps/sn/src/features/windowPopup/model/types.ts |
최종확정예산 등록 완료 message type 추가 |
| popup 메시지 | 기존 features/windowPopup/lib/popupMessage.ts 재사용 |
등록 결과 payload 전송 후 popup 닫기 |
| 운영 store | apps/sn/app/store/useOperStore.ts |
기존 operation-service 주소 상태를 유지하고 ONSEMIRO 전용 주소 상태·fetch 함수 추가 |
4. 부모 화면 계약
최종확정예산사업버튼은 기존 목록 액션 영역에 추가한다.- 버튼 클릭 시 현재 조회조건의 사업구분을 검사한다.
- 선택되지 않았으면
사업구분을 먼저 선택해 주세요.알림을 표시하고 popup을 열지 않는다. - 선택된 사업구분과 부모 식별정보를
openWindowPopup("cfmtnBgt", params)로 전달한다. - popup 완료 메시지는 다른 popup 메시지와 구분되는 고유 type으로 수신한다.
- 성공 시 popup 응답의 등록·중복제외 건수를 부모 알림에 표시하고, 기존 적용 조회조건을 유지한 첫 페이지를 재조회한다.
- popup이 단순 종료되거나 등록에 실패하면 부모 목록은 재조회하지 않는다.
5. popup query parameter와 재사용 계약
제안 parameter:
| 이름 | 필수 | 설명 |
|---|---|---|
parentType |
Y | 부모 업무 식별자, 노후하수관로는 obsltPplBiz |
bizSe |
Y | 부모가 선택한 사업구분 |
parentMessageType |
Y | 성공 시 부모가 수신할 popup message type |
- popup은
parentType과bizSe로 초기 검색조건과 등록 API를 결정한다. - 다른 화면이 재사용할 때는 popup 본체를 복사하지 않고 부모별 초기조건·등록 adapter만 추가한다.
- 필수 parameter가 없으면 조회하지 않고 누락 안내를 표시한다.
6. 검색 초기값
- 연도 기본값은 공통계획의 최신 명시인 전년도로 한다.
- 예: 현재가 2026년이면 2025년
- 부모가
obsltPplBiz일 때:
| 부모 사업구분 | 세부사업 초기조건 | 내역사업 초기조건 | 세부내역 초기조건 |
|---|---|---|---|
정비사업 |
하수관로정비% |
하수관로정비 |
노후하수관로정비% |
정밀조사 |
하수관로정비% |
노후하수관로정밀조사지원 |
전체/미지정 |
%조건은 화면 label에%를 표시한다는 뜻이 아니라 BE code/options 조회에서 prefix 일치 항목을 선택하는 계약이다.- popup을 닫았다 다시 열면 부모가 전달한 사업구분으로 초기조건을 다시 계산한다.
- 조회조건: 환경청, 시도, 시군구, 세부사업, 내역사업, 세부내역, 년도, 사업명
구분조건은 만들지 않는다. 환경청은 선택조건이며, 환경청을 선택하지 않아도 시도를 독립적으로 선택할 수 있어야 한다.- 버튼 순서:
조회,초기화,엑셀다운로드 초기화는 부모 업무에서 계산한 초기조건으로 되돌리고 결과와 선택을 지운다.- 초기 년도는 현재년도 기준 전년도로 고정한다.
7. ONSEMIRO 주소 store 계약
- 기존
useOperStore의govArea/city/sgg와/operation-service/api/v1/addr/*호출은 다른 화면이 사용하므로 변경하거나 대체하지 않는다. - 같은 store에 다음과 같은 ONSEMIRO 전용 상태를 별도로 추가한다.
onsemiroGovArea,onsemiroCity,onsemiroSggfetchOnsemiroGovArea,fetchOnsemiroCity,fetchOnsemiroSgg
- 신규 API:
/api/v1/onsemiro/addr/city/api/v1/onsemiro/addr/sgg/api/v1/onsemiro/addr/govArea
- 현재 신규 Addr API 응답은 원본 camelCase 필드이므로 SelectBox 변환 시 다음을 사용한다.
| 구분 | text | val |
|---|---|---|
| 시도 | sido |
adstDstrCd |
| 시군구 | gugun |
adstDstrCd |
| 환경청/지자체 | lclgvrnmntNm |
lclgvrnmntCd 또는 조회계약에서 확정한 환경청 코드 |
- 시도 변경 시
adstDstrCd앞자리 또는 BE가 제공하는 관계 기준으로 시군구 후보를 제한하고 기존 시군구 선택을 초기화한다. govArea응답은 원본 테이블이 지자체 기준이므로 popup의 실제 환경청 선택 label/code가 맞는지 BE 조회결과로 최종 확인한다.
8. 목록·선택·등록 계약
- 첫 열에 전체선택/행선택 checkbox를 제공한다.
- 페이지 이동 후에도
SEQ_NOSet을 유지한다. - 조회·초기화로 적용조건이 바뀌면 선택 Set을 지운다.
- 33개 열은 다단 헤더와 목록 내부 가로 스크롤을 사용한다.
- popup 내부에는 사업구분 SelectBox를 두지 않는다.
- 선택행이 없으면
등록버튼을 비활성화한다. - 확인 문구는 부모가 전달한 사업구분을 사용한다.
- 등록 요청은
SEQ_NO[]만이 아니라 부모에서 전달한bizSe를 함께 보낸다. - 성공 시 등록·중복제외 건수를 popup message payload로 전달하고 닫는다.
- 실패 시 popup과 선택상태를 유지한다.
9. Excel 계약
- FE에서 적용 조회조건 전체 결과를 1,000건 단위로 반복 조회해 생성한다.
- 파일명:
최종확정예산관리_{년도}.xlsx - 시트명:
최종확정예산관리 - 열 순서: 원본 Excel A~AG 33개 열
- 날짜는
apps/sn/src/features/common/util.ts의formatDate()를 사용해yyyy-MM-dd로 표시한다. - 금액/보조율은 숫자, 사업코드는 문자열로 출력한다.
- 버튼명은
엑셀다운로드이며초기화바로 오른쪽에 둔다.
10. 검증
- 부모 사업구분 미선택 시 popup 미오픈과 알림 확인
popupDefinitions → registry → CfmtnBgtPopupContent연결 확인- 부모별 전년도·사업구분별 초기조건 확인
- ONSEMIRO 주소 store가 기존 operation-service 상태를 변경하지 않는지 확인
- 여러 페이지 다중선택과 조건 변경 시 선택 초기화 확인
- 성공 postMessage 수신, popup close, 부모 목록 조회조건 유지 재조회 확인
- popup 재오픈 시 부모 조건으로 초기화 확인
- 33개 열 가로 스크롤, 날짜·금액 포맷, Excel 전체결과 확인
- 변경 파일 ESLint·대상 TypeScript 및 사용자 승인 후 SN build·브라우저 검증
11. 영향·롤백·확정 계약
- 영향:
features/obsltPpl, 신규features/cfmtnBgt, 기존features/windowPopup,app/store/useOperStore.ts - route 파일은 공용
/popup/[popupKey]를 재사용하고 신규 route를 만들지 않는다. - 타 앱과 공통 package는 변경하지 않는다.
- 롤백: 신규
cfmtnBgtfeature 제거, popup definition/registry/message와 부모 연결·store 전용 상태만 원복한다. - 부모 화면에서 선택한 사업구분을 별도 명칭 변환 없이 등록 API에 전달한다.
- 같은 원본은 다시 등록하지 않고 이미 등록된 사업임을 안내한다.
- 초기 년도는 현재년도의 전년도로 설정하며 최신 보유연도 fallback은 적용하지 않는다.
- 규모·금액 15개 필드는 조회·Excel 전용으로 유지한다.
- 운영 ONSEMIRO의
하수관로정비(312)코드는 현 계획대로 우선 구현하고 운영 확인 결과에 따라 후속 보정한다. govArea응답에서 환경청 label/code로 사용할 필드는 구현 전 실제 응답으로 확인한다.