This commit is contained in:
@@ -28,18 +28,18 @@
|
||||
```
|
||||
┌────────────────────────────────┬─────────────────────────────────────────────────┐
|
||||
│ [영역 A] 전국 행정지원 지도 │ [영역 B] 문서별 진행상황 카드 (2×2) │
|
||||
│ 타이틀: 전국 행정지원 지도 │ ┌───────────────┐ ┌───────────────┐ │
|
||||
│ │ │ 재원협의 │ │ 설치인가 │ │
|
||||
│ (대한민국 시도·시군구 경계) │ │ 신청/진행/완료│ │ 신청/진행/완료│ │
|
||||
│ 마커: 서울 강남구, │ ├───────────────┤ ├───────────────┤ │
|
||||
│ 대전 유성구, │ │ 설계자문 │ │ 기본계획 │ │
|
||||
│ 부산 해운대구 │ │ 신청/진행/완료│ │ 신청/진행/완료│ │
|
||||
│ │ └───────────────┘ └───────────────┘ │
|
||||
│ 타이틀: 전국 행정지원 지도 │ ┌────────────────┐ ┌────────────────┐ │
|
||||
│ │ │ 재원협의 │ │ 설치인가 │ │
|
||||
│ (대한민국 시도·시군구 경계) │ │ 신청/진행/완료 │ │ 신청/진행/완료 │ │
|
||||
│ 마커: 서울 강남구, │ ├────────────────┤ ├────────────────┤ │
|
||||
│ 대전 유성구, │ │ 설계자문 │ │ 기본계획 │ │
|
||||
│ 부산 해운대구 │ │ 신청/진행/완료 │ │ 신청/진행/완료 │ │
|
||||
│ │ └────────────────┘ └────────────────┘ │
|
||||
│ ├─────────────────────────────────────────────────┤
|
||||
│ │ [영역 C] 알림이력 │
|
||||
│ │ 알림이력 업데이트 HH:mm [전체보기]│
|
||||
│ │ 알림이력 업데이트 HH:mm [전체보기] │
|
||||
│ │ [오늘 N건] [지연 N건] [완료대기 N건] │
|
||||
│ │ [뱃지] [일자] 제목 [처리하기]│
|
||||
│ │ [뱃지] [일자] 제목 [처리하기] │
|
||||
│ │ … (최대 5건) │
|
||||
│ ├─────────────────────────────────────────────────┤
|
||||
│ │ [영역 D] 공지사항 [더보기] │
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 538 755">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: #fff;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<!-- Generator: Adobe Illustrator 28.7.9, SVG Export Plug-In . SVG Version: 1.2.0 Build 218) -->
|
||||
<g>
|
||||
<g id="Layer_1">
|
||||
<g id="han" data-label-shift="dx,dy">
|
||||
<path class="cls-1" d="M159.2,197l-5,5.8,5.1,3.7,13.2,9.7-7.3,3.5-8.2-1.2-9.4,1.4,1.4,4.9-3.5,7.3,3.8,2.6-.9,4.7,8.9-2.3,4.2-3.7,5.2,4.2-6.1,2.3.9,12,3,7-.9,3.3-.5,1.6,5.4,6.8,5.2,13.4h-3.6c0-.1,6.4,3.8,6.4,3.8l4.8,6h1.2l3.6-5.4,3.6-.6,13.8,5.9,19.7-1.1,4.6-6.5,3-5.2,8.2-1.7,11.7-17.8,7.1,1.9,4.9,10,13.2,9.6,3.8,13-1.4,12.2-.5,9.5,1.6,1.1-.6,1.3v1.1c.1,0-2.2,2.4-2.2,2.4l-17.5,7.4,7.6,19.2,16.3,1.1,8.4,10.8,12.6.6,4.2-5.2-4.6-7.9-9.2-6.2,12.1-7.1,6.4,5.2,1.3-5.6-6.6-6.5,17.5-5.8,4.8,4.4,4.8-2.1-4.7-6.5,4.5-8.8,6.3-.4,4.7-3,8,3,24.1,4.5,11.5-7.8-2.8-6.4,6.5-11.7,10.5-5.5,7.6-7.9,10.2-2.3,13.4,4.6,4.4-8,12.4,8.2,3.4-3.1.2-15.2.4-11.3,13.4-3.2,4.6-.4-1.9,9.9,9.8,4.6,1.6,12.8,12.2,9.2,9.8-8.4,15-8.9-3.7-19-21.8-40.6-5.7-10.6,1.2-6.8-4.9-6.1-4-4.9,1.2-5.2-26.3-33.1-5.8-12.1-7.1-14.9-11.9-20.9-2.9-9.4-2.1-6.7-1.8-5.2-8.7-25.5-8.6-14.4-.9-11-5.2-11-3-6.3-6,6.5-5.2,22.8-9.8,11-5.5,2.8-7.4,3.7-17.1.5-12.7-1.6-8.2,2.3-5.2-3.4-3.4-2.2-18.8-2.3-21.8,4.5-19-3.7-3.5,4.7-11.2-7.3-5.2,4.2-6.1-.7-11.5,3.5-14.1,10.8-3.7,10.1-12.9,9.8-4,7.3-8.5,6.8-2.3,1.9-9.1,4.5-4,18.3-9.2,11.5-14.3,1.2-2.1,30,5.6,1.4,3.3,9.2-1.4,2.7.9,2.6,2.9-.7,1.8,3.2-4.5,2.2,1.7,8.6,3.8,6.9,8.9,3.4Z"/>
|
||||
</g>
|
||||
<g id="yeongsan" data-label-shift="dx,dy">
|
||||
<path class="cls-1" d="M57.4,578.4s.2,1.4.2,2.3.7,1.6.7,1.9.5,1.4.7,2.3c.2.9,1.2,1.2,1.2,1.2h0s.5,1.4.5,1.4c0,0-.5.7-.9,1.4-.5.7,1.6.9,1.6.9l2.8-.7s1.4-.7,1.4-1.2,0,0-.2-.7c-.2-.7-.5-.7-.9-1.2-.5-.5.5-.2.5-.2l.5.2,2.6-.5s.9-.5,1.4-.7c.5-.2-.2-.5-.2-.9s-.2-1.2-.2-1.2l.2-.9v-1.2c0-.5.7-.7.9-1.2.2-.5.5-.7.9-1.2.5-.5,0-.7,0-1.6s-.5-.5-.5-.9-.5,0-.5,0l-.9.5-.9.7s-.2.9-.5,1.2c-.2.2-1.4.2-1.4.2,0,0-.2-.5-1.2-.9-.9-.5,0,0-.5,0s-1.2-.2-1.2-.2c0,0-1.2-.7-1.6-.9-.5-.2-.5-.9-.5-.9h-1.2s-1.9,1.4-2.8,1.9c-.9.5,0,1.2,0,1.2Z"/>
|
||||
<path class="cls-1" d="M45.2,585.7c.2.2,0,.2.7.9.7.7.5,1.6.9,1.6s.2-.5,1.2,0c.9.5,1.4.5,1.9.7.5.2,1.6.9,1.9.9s1.4.7,1.4.9-.2.2,0,.5c.2.2,0,.5.5,1.4.5.9,1.9,2.6,1.9,2.6,0,0-.7.7.5.5,1.2-.2,1.9-.2,1.9-.9s.2-1.2.2-1.4-.2-.2-.5-1.2c-.2-.9-.7-1.6-.7-1.6,0,0,1.2-.2,0-1.2-1.2-.9-.2-1.2-1.2-.9-.9.2-1.9.2-1.9.2-.2-1.2-.2-1.9-.2-1.9l-.5-.5.7-1.4h0c.5,0,.9-.2,1.2-.2s.9-.7.9-.7c0,0,.2-.2,0-.7-.2-.5-.2-.2-.9-.7s-1.6-.7-1.6-.7l-2.1-1.2-1.4-.9c-.7-.2-2.6.9-2.6.9,0,0,.9-.5,0,.7-.9,1.2-2.3,1.9-2.3,1.9,0,0-.2.5,0,.9.2.5,0,1.2.2,1.4Z"/>
|
||||
<path class="cls-1" d="M28.6,585.5s0,.7,1.2.7h2.1c.5,0,.9.7.9.7v1.9l1.2.7s1.4,0,1.9-.5c.5-.5.5-.7.5-.7l-.5-1.4,2.3-.7s.5-.5.7-1.2c.2-.7-.2-1.2,0-2.3.2-1.2,0-2.8,0-2.8,0,0,.9-1.4.9-2.1s1.9-2.6,1.9-2.8h0v-.7h-1.4c-.2,0-1.7.5-2.1.7-.5.2,0,0-.9,1.2s-.2,1.6-.2,1.6l-1.9.5-1.4.7-.9.2s-1.2-.2-2.1-.2-.5.9-.5.9c0,0-1.2,1.4-1.9,1.6-.7.2-.7.7-.7.7,0,0,.9,2.3.9,2.8v.5Z"/>
|
||||
<path class="cls-1" d="M41.7,591.4c-.5.2-.7-1.2-.5,0,.2,1.2,1.2,2.1,1.2,2.1l1.4.9s.9-.2,1.4,0c.5.2.9,0,.9,0l1.9.7v.2s.7-.2.5-1.6c-.2-1.4,0-1.4,0-1.4l-.7-.9-2.6-1.4h0s-2.8-.7-3-.5c-.2.2-.5-.2-.5.2s.5,1.4,0,1.6Z"/>
|
||||
<path class="cls-1" d="M34.2,597.7s0,0,0,0c0,0,0,0,0,0Z"/>
|
||||
<path class="cls-1" d="M45,598.9l-.7-.7-.5-.9s.2-1.4-.2-1.4-1.9-.5-1.9-.5l-1.4-.7h0s-1.4,0-1.4,0c0,0-.9,0-1.2.7-.2.7-.9.5-.9.9s-2.1,1.2-2.5,1.4c0,0,.2.2.4.5.5.7.5,1.4,1.2,1.4s2.1.2,2.3,0c.2-.2.9-.7,1.2-.5.2.2.5.5.5.9s-.5,1.2-.5,1.6.5,0,0,.5c-.5.5.2,1.4.5,1.6.2.2-.7,2.1-.7,2.1,0,0-.5.5-.5.7s1.4.7,1.6,0c.2-.7.7-1.2.9-1.4.2-.2.9-.5.9-.5,0,0-.5.2.7.2s2.1.2,2.1-.5v-1.9s-.2-1.2,0-1.4c.2-.2,0-2.3,0-2.3Z"/>
|
||||
<path class="cls-1" d="M18.5,619.7c.7,0,1.9-.9,2.3,0,.5.9,1.9,2.6,1.9,2.6,0,0,.2-.2,1.4,0,1.2.2,1.2.5,2.1,0,.9-.5,1.4-1.4,1.4-1.4l1.2-1.2,3.3-1.4s-.2-.7-.7-2.1c-.5-1.4-.7-2.1-.7-2.1,0,0,1.2.2.5-.9-.7-1.2-.9-1.9-.9-1.9l-.5-1.6h0s-.7-.9-.7-.9l-2.1.2s-.2,1.2,0,1.9c.2.7.2.9,0,1.4-.2.5-.7-.5-1.2,0-.5.5-2.3.2-2.3.2h-1.2l-.9,1.4-1.2.9-2.3.9-2.1,1.4s-.5,0,0,.9c.5.9,2.1,1.6,2.8,1.6Z"/>
|
||||
<path class="cls-1" d="M33.1,624h-.9l-1.4-.7-2.1.7s-.9,1.2-.9,1.6.7,1.9,1.4,2.3c.7.5,1.6.7,1.9,1.6.2.9.2,1.9.2,1.9,0,0,1.9.7,2.3-.7.5-1.4.2-2.3.7-2.6.5-.2,1.9-1.6,1.9-1.6,0,0-.5-.5.7-.5s1.6-.5,1.6-.7v-1.9l-.9-.9h.9l.7-.9s.2-.7,0-1.2c-.2-.5-.5-1.9-.5-1.9l-2.6.5h0l-1.4,1.4-.5.9s.2.9,0,1.2c-.2.2-1.2,1.4-1.2,1.4Z"/>
|
||||
<path class="cls-1" d="M65.6,620.2l1.9-.7-2.1-2.6-3.5-1.9h0s-3.3.7-3.3.7l1.6,2.1.9,1.4s-.5.5-.9.9c-.5.5-1.6.7-1.6.7,0,0-.5.5-.5.9s-.9,0-2.1.7c-1.2.7-4.5,1.9-4.5,1.9h-.9c.9,0,1.6,2.6,2.3,2.6h3.1s-.2-.5.9-.7c1.2-.2,2.6-1.2,2.6-1.2,1.4.2,2.3-.7,3,.5.7,1.2,1.4.9,1.6,1.4.2.5,1.2,2.1,1.2,2.1l-.7,2.6s1.2.9,1.6.7c.5-.2,1.9-1.4,1.9-1.4l.9-1.9s-.5-1.4,0-1.9c.5-.5-1.6-1.4-1.6-1.4l-2.8-.7-1.9-2.6v-1.2l2.8-1.2Z"/>
|
||||
<path class="cls-1" d="M64.2,635.5v-1.6s-3.3,1.4-3.3,1.6.9,1.6.9,1.6h1.6l.7-1.6Z"/>
|
||||
<path class="cls-1" d="M59.8,639.2c0,1.2.5,2.8,1.2,3,.7.2,1.6,0,1.6,0v-3l-1.6-.9s-1.2-.2-1.2.9Z"/>
|
||||
<path class="cls-1" d="M38.4,638.3c1.2,0,2.8-4.5,2.8-4.5v-1.4h0s-3.5,0-3.5,0l-2.1,1.4-3.5.7s-.2,1.9,1.4,1.9.7-.1.6-.2c0,0,.3,0,.6.2,1.6.5,3.3.7,3.3,1.2s-.7.7.5.7Z"/>
|
||||
<path class="cls-1" d="M15.4,630.1h0s0,0,0,0h0Z"/>
|
||||
<path class="cls-1" d="M7,642.7c.2-.5,1.2-.7,1.2-1.4s-1.6-2.6-.5-3.1c1.2-.5,2.6-.9,2.8-1.2.2-.2,1.2-.7,1.6-.5s.9.9.9.9l1.4-.5.5-.9s.2-.9.5-1.4c.2-.5.7-1.9.7-1.9v-1.2l-.7-1.6c-.3.2-2.6,2.1-2.8,2.3-.2.2-3,1.2-3.3,1.2s-3.1.2-3.1.2l-3.8.5-2.6,1.9,1.9,2.1s-.2,1.9,0,2.1c.2.2-.5,1.2.5,1.6.9.5,1.6.9,1.6.9,0,0,2.8.2,3-.2Z"/>
|
||||
<path class="cls-1" d="M16.6,649.1c0-.7-1.2-1.6-1.2-1.6l-.7-.7-.9-.9s-.2-1.2-.2-1.4-.7-.9-.7-.9c0,0-2.3.2-2.3.5s-.7.7-.7.7c0,0-.2.7-1.6.7s-2.8-.5-2.6,0c.2.5-.2.9-.2,1.6s-.5,1.9-.5,1.9v1.2s.2,1.2.7,1.4c.5.2,1.2.5,1.4.7.2.2,1.4.9,1.2,1.4-.2.5,2.3.2,2.3.2l.5-.5c.2-.2,1.9-1.2,1.9-1.2,0,0,0-.9.5-.9s3.3-.5,3.3-.5v-1.6Z"/>
|
||||
<polygon class="cls-1" points="12.9 643.4 12.9 643.4 12.9 643.4 12.9 643.4"/>
|
||||
<path class="cls-1" d="M27.7,639.9c.5.5,1.4,1.6,2.1,1.9.7.2,1.2.5,1.4,1.2.2.7.2,1.4.5,2.1.2.7,1.9.7,1.9,1.2s.5-.2,1.4,0c.9.2.2-.2,1.6,1.2,1.4,1.4,2.3,2.1,2.6,2.6.2.5.9,0,.9,0l1.2-.9s-.2-1.6,0-1.6.2-2.1.2-2.3-.5-2.3-.5-2.3c0,0-1.2-1.4-1.4-1.4s-2.1-.7-2.1-.7l-1.2-1.2-.9-1.2-1.4-.5h0l-3.7-.7h-2.1l-1.2,1.6s.2.7.7,1.2Z"/>
|
||||
<path class="cls-1" d="M32.6,663.4c.5.2,2.3.5,2.8.5s1.6-.2,1.9-.5c.2-.2.9-.2,1.6-.2s3.5.2,3.5.2c0,0,.5-.7.2-1.4-.2-.7-.9-1.4-.9-1.4l-.2-.7-.7-.5.7-1.2v-.9s-.7-.5-1.4-.5-1.4.2-1.4-.2-.9-1.9-.9-1.9l-1.4.7h0c-.9.5-1.9.7-2.1.9-.2.2-3.3.2-3.1.7.2.5.7,1.2.9,1.4.2.2.9,1.6.9,1.6,0,0-.5,1.6-.5,1.9s-.5,1.2,0,1.4Z"/>
|
||||
<path class="cls-1" d="M21.3,670.4c0-.2,0-1.4.5-1.6.5-.2.7-.5.7-.7s-.7-1.2-.7-1.4-1.2-1.2-1.2-1.2l-.5-1.2-.2-1.2-.2-1.9h0s-.9-1.9-1.2-1.9-1.4-.2-1.4,0-.5.9-.5.9v.7c0,.2-.2.7,0,1.2.2.5-.2,1.4,0,1.6.2.2.2.7.5,1.4.2.7.7,1.2.7,1.4s-.2,1.2-.2,1.2c0,0-.5-.7-.5.5s-1.9,1.9-.5,2.1c1.4.2,2.8.5,3,.5s1.6-.2,1.6-.5Z"/>
|
||||
<path class="cls-1" d="M27.4,673s-.5-.9,0-1.6c.3-.5.5-.9.7-1.2.2-.5.9-.5.9-.9s.5-2.3,0-2.8c-.5-.5-.9-1.6-1.4-2.3-.5-.7-.2-.9-1.2-1.6-.9-.7-1.9-1.2-1.9-1.2l-1.2.2h0s-.7,2.1-.7,2.3.2,2.3.7,2.6c.5.2,1.6,1.4,1.9,1.9.2.5.2,1.2.2,1.6s-.7,2.1-.9,2.1,0,0-1.2.5c-1.2.5-2.6.2-3,.9-.5.7-1.2,1.4-1.2,1.4v1.4c0,.2-.2.7.5.7s2.3-.2,2.8-.5c.5-.2,1.4-.7,1.4-.7l2.3-2.1,1.2-.7Z"/>
|
||||
<path class="cls-1" d="M63.7,683.1c-.2-.5-1.4-2.1-1.4-2.1l-.5-.9s0-1.6-.9-1.9c-.9-.2-3-.2-3-.2l-1.6-2.3s-1.4-2.6-1.6-2.6-1.4,0-2.1-.2c-.7-.2-2.6-1.2-2.6-1.2l-.9.7c.2.7,1.6,2.8,1.6,2.8l1.2,2.3-.5,1.9s-1.9.5-2.3.5h-3s-.5-.7-.7.7c-.2,1.4-2.6,2.6-2.6,2.6h-3s-.9,1.6-.9,2.1-6.1,3.1-6.1,3.1l-1.9,2.6-1.9.5s-.5.7-.5.9-1.2,1.6-1.2,1.6h-.7s-2.3.5-2.3.9.5,1.6.5,2.1v1.6s0,1.6.2,1.6,1.4.7,1.4.7l.7,1.2s.5.2.5.5.7,1.2.7,1.2l1.2,1.2s-.5,1.6,0,2.1c.5.5.9.5,1.4.7.5.2,4.2.7,4.2.7,0,0,1.9.2,2.1.5.2.2,1.4.5,2.1,0,.7-.5,7-1.6,7-1.6,0,0-.7-.9,0-1.2.7-.2,1.9-.5,3-1.4,1.2-.9,3.7-1.2,3.7-1.2,0,0-.5-1.2.2-1.6.7-.5,2.6-2.1,2.8-2.1s2.1,1.4,2.1,1.4c0,0-.7.7.5.7s1.4-.5,1.9-2.1c.5-1.6,1.9-2.3,1.9-2.3l.5-.7s-.5-.5,0-1.6c.5-1.2.9-2.6.9-2.6v-3.5s-.5,0,.5-.5c.9-.5,2.1-2.3,1.4-3.1-.7-.7-1.6-1.9-1.9-2.3Z"/>
|
||||
<polygon class="cls-1" points="49 672.3 49 672.3 49 672.3 49 672.3"/>
|
||||
<path class="cls-1" d="M93.5,737.5c-2.3-1.2-4.2-2.3-4.2-2.3h-1.9l-1.2,3.5s1.4,0,1.2.9c-.2.9-1.6.5-1.2,1.6.5,1.2-.5.7,1.6,1.6,2.1.9,2.8,1.9,3.7.9.9-.9,1.9-2.6,1.9-2.6h0l.7-1.2s1.6-1.4-.7-2.6Z"/>
|
||||
<path class="cls-1" d="M86.2,745l-2.8-1.9s-2.8,2.6-2.8,3.1-2.1,3.3-1.6,4,1.2,1.6,2.8,1.6,3.3-1.6,5.4-2.6c2.1-.9,2.8-2.3,3.7-1.9.9.5,2.1-.5,2.1-.5h0l-1.9-1.2-4.9-.7Z"/>
|
||||
<path class="cls-1" d="M101.7,742h0l-3.5,1.2s-.9,1.2-.9,1.6.5,2.6.5,2.6c0,0-.5.5-.5,1.6v2.3s1.2,3.1,2.1,3.5c.9.5,2.6-.5,3.1-1.9.5-1.4-.9-5.6-.9-5.6,0,0-2.8-1.2-2.1-1.4.7-.2,2.8-.5,3.1-.5s.9-.7.9-.7l-.7-2.8h-.9Z"/>
|
||||
<path class="cls-1" d="M115.1,720.4l-1.2-1.6-.5-1.6h0v-2.6l-2.1-3.3s-1.6-1.2-1.9-1.6c-.2-.5-3-2.3-3-2.1s-2.3,2.3-2.3,2.6-3.7,2.8-3.7,2.8c0,0,1.2,4,1.2,4.2s-1.9.2-.5,1.9c1.4,1.6,5.9,2.1,5.9,2.1,0,0,.2-1.4.5.5.2,1.9-.5,2.8-.5,3.1s1.2,1.2,2.6,1.2,3.3-.2,3.5,0c.2.2,3.5.5,3.5.5,0,0,.2,0,0-2.1-.2-2.1-1.4-3.8-1.4-3.8Z"/>
|
||||
<path class="cls-1" d="M125.6,711.9c.5,0,1.4-1.9,1.4-1.9,0,0-.5-.7.9-.5,1.4.2.9,0,1.6.5.7.5,1.2.5,1.4.5s1.2-.7.5-1.4c-.7-.7-1.4-.9-1.9-1.6-.5-.7-.5-2.6-.5-2.6,0,0-.5-1.4-.7-1.4h-2.8l-.9.9h0c-.7,0-3.5-.7-3.5-.7l-.5,2.8-2.1,1.4s-.9.5-.5,1.2c.5.7.9,1.2.7,1.6-.2.5-1.6,0-1.4.7.2.7,1.6,1.9,1.6,1.9,0,0-.7,1.2-.7,1.6s.9,1.4,1.4,1.4,1.9-2.1,1.9-2.1c0,0,.5-.9.9-1.2.5-.2,2.1-1.2,2.1-1.2h.9Z"/>
|
||||
<path class="cls-1" d="M141.5,712.4c0-.2-.9-.5-1.2-.7-.2-.2-1.6-.7-1.6-.7l-3-.9h-1.7s-.7,2.1-.7,2.3-.5,1.2,0,1.4c.5.2,2.1.7,2.1.7v1.2c0,.5-.7.7.5,1.2,1.2.5,4.2-.5,4.2-.5h2.6s.9-1.4.5-1.9c-.5-.5-1.6-1.9-1.6-2.1Z"/>
|
||||
<path class="cls-1" d="M128.6,725.1s.2-.2.5,0c.2.2,1.4-.5,1.4-.5,0,0-.2-.5.5-.5s1.9.5,1.9.5c0,0,.7-.2.9-.7.2-.5-.2-.9,0-1.4.2-.5,0-1.6,0-1.6l-.7-1.6s-.9-.2-1.4-.2-1.2-.2-1.2-.2l-.5-.2-.9-.7h0s-2.3-.2-2.6.5c-.2.7-.7,1.6-.9,1.9-.2.2-1.9.9-1.9.9l1.4,1.4s.2.7,1.2,1.2c.9.5,2.3,1.4,2.3,1.4Z"/>
|
||||
<path class="cls-1" d="M121.1,719.9c-.3-.3-.7-.5-1.2-.5h0c-.6,0-1.1.6-1.2,1.2,0,.4.2.8.5,1.2.1.2.3.5.7.7.5.3,1.4.6,1.6.2.2-.2,0-.5-.2-1.6,0-.7,0-.9-.2-1.2Z"/>
|
||||
<path class="cls-1" d="M137.3,747.6c-.9-.5-1.9-.9-1.9-.9l-.5-1.2.9-1.2.2-2.3-4.2-.5-2.1.5h0s-1.2,2.1-1.4,2.6c-.2.5-2.1,1.9-2.1,2.1s0,.7-.2,1.4c-.2.7-.9,1.9,0,2.3.9.5,2.1.7,2.1.7,0,0,2.6-1.4,2.8-.7.2.7.2,1.2,1.2,1.9.9.7,2.1.9,2.3.9s.2-1.2.9-1.4c.7-.2,2.6-1.9,2.6-1.9,0,0,.2-1.9-.7-2.3Z"/>
|
||||
<path class="cls-1" d="M267.1,679.6s.5-.5,0-1.6c-.5-1.2-.7-2.1-.7-2.1l-.7-1.2-.5-1.4s-.5-.5-.2-1.2c.2-.7,0-2.6,0-2.6l-.2-.7.7-.9h0c.2-.2.5-2.1.5-2.1l-3.3-2.3s-1.4.9-1.2,1.9c.2.9.9,2.1.9,2.6s.2,1.6,0,2.1c-.2.5-.9,1.2-.9,1.4s-.7,1.4-.9,1.9c-.2.5-2.8,1.9-2.8,1.9,0,0-1.9,1.9-1.9,2.1s-1.2.2-.7,1.6c.5,1.4.5,3.3.5,3.3,0,0-1.2.9-.5,1.6.7.7,1.4,1.6,2.8,2.1,1.4.5,4.2,1.6,4.2,1.6l3.1.5s2.3-.9,1.9-1.4c-.5-.5-1.6-1.4-1.6-1.4l-.5-1.2s0-1.2.5-1.9,1.6-2.6,1.6-2.6Z"/>
|
||||
<polygon class="cls-1" points="279.4 600.4 279.4 586.1 272 579.9 262.7 571.1 261.3 561.5 254.5 559.9 251.7 557.3 244.7 562.9 243.5 566.9 235.1 563.3 234.4 553 235.1 535.7 240.9 533.6 245.9 532.1 247.1 523.8 256.9 510.3 248.3 507 239.9 515.4 232.7 509.4 238.7 493.8 231.6 486.6 229.2 475.8 217.2 472.2 206.4 484.2 205.2 493.8 195.7 486.6 186.1 495 186.1 502.2 176.5 510.6 159.8 515.4 157.4 523.8 140.6 521.4 127.4 517.8 124.5 512.7 119.4 508.3 115.3 512.5 110.2 512.4 96.4 517.8 89.3 530 84.4 535 85.6 538.3 88.3 540.1 87.2 541.1 82.3 539.9 76.8 551.3 72.3 553.6 67.3 564.8 76.6 566.5 73.6 571.4 75.3 574.4 80.6 583.9 85.4 585.9 85.4 589.7 80 596 78.4 589.4 69.9 588.5 68.8 590 71.3 593.4 75.4 595.9 74.3 598.4 69.7 600 68.7 603.3 63 605.4 61.9 611.5 67.8 615.5 70.4 613.1 73.2 605.9 74.3 613.6 75.3 626.5 69.7 634.5 69.7 639.2 68.1 643.4 67.8 644.3 80.4 650.4 92.7 661.4 89.3 661.9 86.5 659.8 85.6 664 79 654.2 69.4 650 67.8 656.3 70.6 661.9 74.3 663.3 77.1 670.4 72.7 669.9 66.1 661.5 62.9 648.1 58.5 642.1 51.9 654.2 55.1 668.3 59.6 674.6 61.9 673.9 65.8 676.6 67.1 680.5 69.9 680.2 72.7 677.9 79 686.6 77.7 698.2 82.8 699.7 79.7 706.7 76.6 709.9 77.4 712.1 82.5 712.8 82.7 721.2 93.1 719.9 97.3 713.3 97.1 709.8 112.1 701.6 110.7 695.9 117.2 694.3 120.8 688.2 120.2 673.4 122.8 671.1 124.7 675.1 124.5 684.5 122.4 694.3 125.7 699.9 130.4 702.1 134.8 704.2 136.9 700.4 143.5 702.3 145.8 697.6 149.1 698.3 148.3 688.6 152.1 687 152.9 684.2 151.7 682 155 673 162 671.1 167.4 666.2 174.9 662.4 179.6 664 183.8 662.6 187.1 655.8 192.4 654.7 194.6 657.2 202.1 657.2 202.7 663.8 200.6 669.2 196 669.8 194.8 663.8 189.6 664 187.5 671.6 189.1 675.6 185.9 681.9 181.9 681.2 183.1 676 181.4 674.3 176 692.2 189.2 694.5 191.7 701.4 195.5 706.3 203.9 704.4 207.4 697.8 213.3 694.1 214.2 689.9 209.3 687.1 210 684 218 684.7 221 686.6 224.2 683.9 222.7 674.6 209.2 661.4 209.5 657 212.8 653.7 210.5 650.9 215.4 646.2 211.9 643.7 213.5 642.5 216.5 642.5 222 642.5 227.6 640.4 228.1 635.9 230.9 638 231.2 641.7 231.8 647.4 236.2 650.7 238.4 657 234.6 663.8 232.6 672.3 234.9 676.9 238.7 676.9 243.5 679.8 244.5 675.1 243.3 671.1 245.9 662.9 249.9 659.4 255 664.1 261.6 661 262.3 655.8 265.1 651.9 267 645.5 264.6 642 261.1 642.5 257.9 642 248 646 246.3 642 239.9 634.6 244.2 626.8 246.3 631 251.6 632.8 262.5 623.5 278.8 628.6 285.4 617.2 285.4 607.6 279.4 600.4"/>
|
||||
</g>
|
||||
<g id="nakdong" data-label-shift="dx,dy">
|
||||
<path class="cls-1" d="M405.4,649.3l-2.1-.2-1.6,1.2-.9,1.6-1.2.2-.9-.5v-1.2l.2-.9,1.4-.9.9-.7v-.9l.9-.9.7-1.2-.2-1.6-.2-1.4.5-3v-1.9l-1.6-1.6-.9-.9.2-1.9.7-2.8h0c0,0,1.6-.5,1.6-.5,0,0,1.2-.9,1.2-1.2s.2-.7.2-.7l-.2-.9-1.4-.9-1.9-.7-1.6.2-1.2.5-.9,1.2-.7,1.2-.2,1.2.5,1.9v.9l-.5.7-.7.2-1.2.2-.9.5-.5.5-.2,1.2-.2.5h-1.4l-1.4.5s-.9.2-1.2.2-.7.7-.7.7l-1.2.5h-1.4c-.2,0-.7.2-.7.2l-.5.5v.5l.2.7s.7.7.9.7,0,.7,0,.7l.2.9v.7l.2.9.5.5.7.5s.5.5.7.5.2.7.2.7c0,0,.5.7.5.9v2.1h-.2s-.7-.2-.9-.2-.5-.5-.5-.5l-.9-.7h-.9l-.9-.5-.5-.7-.7-1.2-.7-.5-.5-.2-.5.2-.7.7-.7.2h-.9l-1.4-.9-1.4-.9-1.4-.7h-1.2l-.5.2-.7.9-.5.7-1.2.7s-.2,0-.5.2c-.2.2-.7.5-.7.5l-.5.7-.7,1.2-.5,1.2-.9.9v3.3l1.2,1.4s.7,1.4.7,1.6.2,1.4.2,1.4l.7,1.2.7,1.6,1.6.2,1.4-.9.7-1.2.7-.7h2.6l1.4-1.2.9-1.6.7-.9.7-.5.5.5.5.7v2.6s.5.5.7.5,0,.7,0,.7l-.7,1.2-1.2,1.9-.5.7-.2.5-.2.5-.9.5-1.2.2-1.4.2-.7.5-.5.5-.2.7,1.4.5.5.5v.7l.5.5.7.2h1.2l2.1.2.7.5.2.7-.2.5-.7.5s-.9.7-1.2.7-.5.9-.5.9l-.2.7.2.9v.7l.9.2.9.7,1.2.2v.9l-.2.2-.9.5-1.4.5-.7.2-.5.7v.9l.5.7s.5.5.7.5,1.4.2,1.4.2c0,0,1.4.2,1.6.2s.9-.5.9-.5l1.2-.5,1.2-.7.5-.7v-.7l.2-1.2s.5-.9.5-1.2.9-.5.9-.5l1.4-.2.2-.7-.9-.9-.7-1.4.5-1.6v-1.2l.7-.7,1.6-.2,1.6-.2.7-.9.2-1.2v-2.1l.7-.7,1.9.2,1.6-.2.5,2.1,1.2,1.4,2.1.9,1.6-.7.2-1.2-.2-1.2-1.6-1.2-.7-1.4.2-1.2-1.2-.7-.9-.9.5-1.4h1.9c.2,0,.7-.5.7-.5l.7-.9v-1.6h.9c.2,0,.7-.5.7-.5l.2-1.4s.2-.5.7-.7c.5-.2,0-1.4,0-1.4v-1.4Z"/>
|
||||
<path class="cls-1" d="M330.3,650.8v-1.2l-.9-.5h0s-4.2-1.2-4.2-.9-2.8,0-2.8,0l-1.4.9s-.2.7-.2.9.2,1.2.2,1.2l.5.2.9.7,2.8.5h1.9l.9-.7.9-.7.9-.2.5-.2Z"/>
|
||||
<polygon class="cls-1" points="333.8 654.8 332.6 654.1 332.2 652.9 331.7 652.7 331 652.9 329.8 653.9 329.6 654.8 329.1 656 329.1 657.6 329.4 659 329.8 659.7 330.8 659.7 331.9 659.5 332.4 659 333.8 659 335 658.8 335.2 657.8 335.2 656.9 334.7 655.7 333.8 654.8"/>
|
||||
<polygon class="cls-1" points="308 649.2 307.6 648.4 307.6 647.5 308 646.3 308.7 645.2 308.7 644.2 308.3 644 307.3 643.5 306.4 642.8 305.5 641.9 304.7 641.2 303.1 641.4 302.2 642.8 302.2 644.7 301.2 645.2 300.8 644.2 300.5 642.6 301 641.4 301.7 639.8 302.4 638.4 303.6 637.2 303.6 636.5 303.3 635.8 302.6 635.8 301 636 299.8 637 298.4 638.1 298.2 639.5 297.3 640 295.6 640.9 294.7 642.4 293.5 643.5 293.3 644.9 293.3 645.9 293.5 647 294.2 648.2 295.4 648.4 297 649.2 299.4 649.2 301.2 648.7 303.1 649.2 304.1 649.9 306.2 651 307.8 652 308.3 651.7 309.4 651.7 309.7 651 309.2 650.3 308 649.2"/>
|
||||
<path class="cls-1" d="M305.2,653.4l-1.2-.5-.9-.7-.7-.2h-2.1l-1.6-.2-.9-.7h-1.6l-1.2,1.2-1.6,1.2-.9.7v.7l-1.4-.2-.5-1.2-.9-1.4-.2-.7-.5-.9-1.2-.5-1.2-.5-.5-.5s-.2-.5-.2-.7-.2-1.2-.2-1.2v-.5c0-.2-.7-.7-.7-.7l-.2-.7-.5-1.2-.2-1.4.7-.9.2-.9,1.6-.2.7-.5.5-.2.2-.7.2-1.2.5-.5.7-.9v-.7l-.2-1.2-.5-1.4.2-1.4-2.1-1.4h-3.1l-1.9.2-1.4,1.2-.9,1.4-.5,1.2-.5,1.4v.7l-1.6.5-.9.5-.7.9s.2.5,0,.7c-.2.2-1.2.9-1.2.9v1.4l-.5,1.2-.7.5-.9.5-.2.9v1.4l.2,1.2-.2,1.4.5,1.6.5,1.9,1.2,1.9h0v1.6l.2,1.4.7.9.9.7.2.7-.2.7-.9.9-.9.7-.5.7-.2.7,1.2.7.7.5,1.4.7v.7l.2,1.2.5.9.9.5.9-.2h1.9l1.2-.2.9-.5.9-.9v-1.4l-.5-.9-.2-1.4.2-.7.7-.5,1.9-.2,1.2-.9h2.3l.5.9v.7s-.5.7-.5.9-.2,1.2-.2,1.2l-.5,1.4v.5l-.2.9.2.5.2.5.2,1.2v1.2l.5.9,2.1.2,2.3.7,1.6-.2,1.2.2.9-.7s.5.5.7.5.5.9.5.9l1.6.7,1.6.2h.7l.2-1.2-.2-1.4-.7-.7-.2-.9v-1.2l.5-.5.9-.9.7-.2.5-.5v-2.3s-.5-2.1-.5-2.3v-.9l.2-1.2.5-1.4s-.2-.9,0-.9.7-.7.7-.7l.7-.5.2-.9-.2-.9-1.2-.5Z"/>
|
||||
<polygon class="cls-1" points="533.7 451.9 529.9 457.3 516.8 465.7 509.4 457.5 516.6 447.7 513.8 417.3 513.1 408.8 521.3 392.4 522.9 355.1 523.6 353.3 531.1 333.9 526.2 315.4 526.2 282.1 519.8 263.8 504.8 272.7 495 281.2 482.8 272 481.1 259.2 471.4 254.5 473.3 244.6 468.7 245 455.3 248.2 454.9 259.5 454.7 274.8 451.4 277.9 438.9 269.7 434.5 277.6 421.1 273 410.9 275.3 403.3 283.3 392.8 288.8 386.2 300.5 389 306.9 377.6 314.7 353.5 310.3 345.4 307.2 340.7 310.3 334.5 310.7 330 319.5 334.6 326 329.8 328.1 325 323.7 307.5 329.5 314.2 336 312.9 341.5 306.5 336.4 294.4 343.5 303.6 349.6 308.1 357.5 304 362.7 314.1 371.6 316.5 383.6 314.1 388.4 326.1 392 323.3 402.6 325.2 414.4 315.5 413.8 315 423.6 307.5 439.1 298 443 298.5 447.6 301.2 454.4 296.8 462.5 286.2 472.3 276.7 473.4 269.4 480.7 267.1 483.1 264.5 485.8 256.9 505.2 256.9 510.3 247.1 523.8 245.9 532.1 240.9 533.6 235.1 535.7 234.4 553 235.1 563.3 243.5 566.9 244.7 562.9 251.7 557.3 254.5 559.9 261.3 561.5 262.7 571.1 272 579.9 279.4 586.1 279.4 600.4 285.4 607.6 285.4 617.2 278.8 628.6 282.6 628.4 288.8 622.6 289.3 620.3 291.9 621.5 292.3 624.3 296.3 623 298.7 624.3 301.6 622.6 298.9 615.9 301.2 614.9 303.4 615.5 304.7 611.2 309.9 609.7 307.1 614.2 306.9 625.2 305.5 632.3 314.8 637.2 317 641.5 318.3 642.1 322.4 640.3 325.1 641.7 326.8 641.4 329.4 634.9 335.5 635.5 338.5 640.5 342.8 638.4 346.2 633 347.4 636.3 348.6 639.8 343.1 642.3 344.4 645.9 349.4 647.4 351.4 645.9 353.5 647.7 353.3 655.5 347.7 654.1 346.2 655.7 351 659.7 353.7 666.6 356.3 667.8 358.7 665.9 359.9 659.7 358.5 655.6 361.6 654.2 365.6 646.5 363.1 643.5 360.7 647.8 358.5 646.8 361.3 632.3 361.1 630.7 361 629.5 368.3 628 371.4 624.3 365.9 619.1 357.2 620.8 355.4 623.6 351.9 624.1 354.8 618.5 361.5 616.3 367.3 614.4 366.1 610.6 379 609.8 381.7 611.6 383.5 619.4 389.9 616.8 383.5 596.4 387.2 591.5 388.9 592.4 387.7 599.2 390.1 604.4 394.7 605 398 608.8 399.5 604.8 401.5 606.5 400.5 612.2 406.2 614.7 414 613.3 414.9 615.6 420.1 616.2 424.6 617.3 428.8 614.1 432.5 616.6 438.5 610.1 436.6 622.3 438 626.7 441.3 625.8 442.5 620.6 445.7 622.8 453.5 612.9 457 616.4 461.6 616.6 461.7 613.8 459.8 610.5 463.1 606.6 469.9 608.2 480.9 594.4 480.7 591.3 485.5 581.8 491 579.8 494.6 576.1 498.5 573.7 497.1 571.8 499.6 567.6 499.9 561.3 498 558.2 504.1 554 504 546.1 505.5 548.8 506.9 554.5 511.6 551.2 514.6 544.4 514.4 537.4 515.8 532.7 513.9 528 514 525.4 524.7 493.4 527.1 486.2 527.8 477.8 535.1 466.5 538 455.6 533.7 451.9"/>
|
||||
</g>
|
||||
<g id="geum" data-label-shift="dx,dy">
|
||||
<path class="cls-1" d="M298,443l9.5-3.9,7.5-15.6.5-9.8,9.7.6-1.9-11.8,2.8-10.6-12-3.6,2.4-4.8-2.4-12-10.1-8.9-12.6-.6-8.4-10.8-16.3-1.1-7.6-19.2,17.5-7.4,2.3-2.4v-1.1c-.1,0,.4-1.3.4-1.3l-1.6-1.1.5-9.5,1.4-12.2-3.8-13-13.2-9.6-4.9-10-7.1-1.9-11.7,17.8-8.2,1.7-3,5.2-4.6,6.5-19.7,1.1-13.8-5.9-3.6.6-3.6,5.4h-1.2l-4.8-6-6.4-3.9-5-.2-9.1-18.5-5.4,3-2.4-5.7-11.4-2.8-11.7-9.2h-3.9c0,.1-3.4,4.8-3.4,4.8l1,6.2,2.1,5.4-1.2.8-4.4-7.5-6.7-3.2-6.3-.3-5.2,3.3,5.9,3.4-3.6,2.2,5.3,4.4,2.5.8.4,3-6.5,6.1-8.7,11.2-4-1.9,6.4-13.5-1.6-1.9,1.1-7.9-2.1-3-4.7,14.5-3,1.8-3.8-5.7-4.4,2.7.5,8.4-1.5,1.7-3.3-.8-4.2,3.2-5.1,13.8.5,1.5,3.9-.2.2-6.5,5.6,2.5,2.8,5.3-7.4,2.4v3c0,0,5.9,1.2,5.9,1.2l4.3-1.5,2.1-3.3,4-.3-1.4,6,4.1,3.7-2.4,9.4,4.3,6.1,1.1,27,11.6,2.1-6.6-26.7,2.3-4.1-6.3-4.9,1.7-1.9,1-6.9,2-1.5,2.2,9,4.4,3.2,3.1-1.9,3.1-6.1,1.8,1.5-1.9,8.6,2,14.4,1.9,13.7-2.8,6.5,8.2,7.8v2.1l-6.9,2.9,2.9,21.8-1.6,1.9-5.9,6.7,1.3,2.7,3.3-2.7,8.2,2.8,6.2,7.7-1.2,2.8,5.1,13.1,5.6,3.1-19.1.5-1.8,3.3,6.4,3.1-.6,10.7,7.3,2.8,3-3.3,8.9,1.9,9.4-3.4.3,1.4.2.9-3.1,5.4-5.1-.9-9.4,3.5,6.8,6.4,4.3,1.4-.2,5.6-20.6-5.8-6.4,13.7-18.1,10.4-1.9,6.6,5.9,4.7h19.9s3.8,4.2,3.8,4.2l-.5,3.4,3,5.1,13.2,3.6,16.8,2.4,2.4-8.4,16.8-4.8,9.6-8.4v-7.2l9.6-8.4,9.6,7.2,1.2-9.6,10.8-12,12,3.6,2.4,10.8,7.2,7.2-6,15.6,7.2,6,8.4-8.4,8.6,3.3v-5.1s7.6-19.4,7.6-19.4l12.2-12.4,9.6-1.1,10.5-9.8,4.5-8.1-2.7-6.8-.6-4.6Z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 20 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 219 KiB |
@@ -6,7 +6,8 @@ export const FNRS_SHAR_SE_SAVE_MODE = {
|
||||
DELETE: "D",
|
||||
} as const;
|
||||
|
||||
export type FnrsSharSeSaveMode = (typeof FNRS_SHAR_SE_SAVE_MODE)[keyof typeof FNRS_SHAR_SE_SAVE_MODE];
|
||||
export type FnrsSharSeSaveMode =
|
||||
(typeof FNRS_SHAR_SE_SAVE_MODE)[keyof typeof FNRS_SHAR_SE_SAVE_MODE];
|
||||
|
||||
/** 백엔드 FnrsSharSeMngResponseDto */
|
||||
export interface FnrsSharSeMngResponseDto {
|
||||
@@ -69,6 +70,8 @@ export interface FnrsSharBizCstTreeDto {
|
||||
ajmtAmt?: number;
|
||||
rmrkCn?: string;
|
||||
envoRmrkCn?: string;
|
||||
chgAmt: number;
|
||||
chgRt: number;
|
||||
}
|
||||
|
||||
/** Controller public 메서드명·시그니처와 동일 */
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
.mapArea {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.bgLayer {
|
||||
position: absolute;
|
||||
inset: var(--map-inset);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1;
|
||||
width: calc(100% - var(--map-inset) * 2);
|
||||
height: calc(100% - var(--map-inset) * 2);
|
||||
background-image: url("/images/region_map_bg.png");
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
background-position: center center;
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
image-rendering: crisp-edges;
|
||||
image-rendering: pixelated;
|
||||
opacity: 0.7;
|
||||
filter: drop-shadow(0 1px 0 rgba(0, 0, 0, 0.02));
|
||||
pointer-events: none;
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
.svgLayer {
|
||||
position: absolute;
|
||||
inset: var(--map-inset);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 2;
|
||||
width: calc(100% - var(--map-inset) * 2);
|
||||
height: calc(100% - var(--map-inset) * 2);
|
||||
}
|
||||
|
||||
.svgLayer > svg {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
image-rendering: crisp-edges;
|
||||
shape-rendering: geometricPrecision;
|
||||
}
|
||||
|
||||
.svgContainer :global(svg) :global(path) {
|
||||
fill: rgba(0, 150, 255, 0.2) !important;
|
||||
stroke: #0066cc;
|
||||
stroke-width: 1;
|
||||
vector-effect: non-scaling-stroke;
|
||||
}
|
||||
|
||||
.svgContainer :global(svg) :global(.cls-1) {
|
||||
fill: rgba(0, 150, 255, 0.2) !important;
|
||||
stroke: #0066cc;
|
||||
stroke-width: 1;
|
||||
vector-effect: non-scaling-stroke;
|
||||
}
|
||||
|
||||
.svgContainer :global(svg) :global(.basin) {
|
||||
opacity: 0;
|
||||
pointer-events: all;
|
||||
transition: opacity 0.15s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.svgContainer :global(svg) :global(.basin.active),
|
||||
.svgContainer :global(svg) :global(.basin:hover) {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.svgContainer :global(svg) :global(.basin) :global(path),
|
||||
.svgContainer :global(svg) :global(.basin) :global(polygon),
|
||||
.svgContainer :global(svg) :global(.basin) :global(polyline) {
|
||||
fill: rgba(0, 209, 209, 0.5);
|
||||
stroke: #399ac3;
|
||||
stroke-width: 1.3;
|
||||
vector-effect: non-scaling-stroke;
|
||||
}
|
||||
|
||||
.popup {
|
||||
position: absolute;
|
||||
width: 300px;
|
||||
height: 150px;
|
||||
min-width: 220px;
|
||||
background: #fff;
|
||||
border: 1px solid #e5e7eb;
|
||||
border-radius: 10px;
|
||||
box-shadow:
|
||||
0 12px 24px rgba(0, 0, 0, 0.18),
|
||||
0 2px 0 rgba(0, 0, 0, 0.05);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transform: translate(-50%, -8px) scale(0.98);
|
||||
transition:
|
||||
opacity 0.12s,
|
||||
visibility 0.12s,
|
||||
transform 0.12s;
|
||||
pointer-events: none;
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
.popup.show {
|
||||
opacity: 1 !important;
|
||||
visibility: visible !important;
|
||||
transform: translate(-50%, -12px) scale(1) !important;
|
||||
}
|
||||
|
||||
.show {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.labelsLayer {
|
||||
position: absolute;
|
||||
inset: var(--map-inset);
|
||||
pointer-events: none;
|
||||
z-index: 3;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.basinLabel {
|
||||
position: absolute;
|
||||
transform: translate(-50%, -50%);
|
||||
pointer-events: none;
|
||||
padding: 6px 12px;
|
||||
border-radius: 6px;
|
||||
font-weight: 700;
|
||||
font-size: 16px;
|
||||
background: #ffffffee;
|
||||
border: 2px solid #d0d0d0;
|
||||
white-space: nowrap;
|
||||
min-width: 60px;
|
||||
text-align: center;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
|
||||
.basinLabel.active {
|
||||
background: #006bf8;
|
||||
color: #fff;
|
||||
border-color: #96c3ff;
|
||||
box-shadow: 0 4px 12px rgba(0, 107, 248, 0.3);
|
||||
}
|
||||
@@ -0,0 +1,310 @@
|
||||
import { type CSSProperties, useCallback, useEffect, useRef, useState } from "react";
|
||||
|
||||
import {
|
||||
BASIN_DATA,
|
||||
BASIN_IDS,
|
||||
type BasinKey,
|
||||
MANUAL_LABEL_POS,
|
||||
type ManualLabelPos,
|
||||
} from "../model/map-data";
|
||||
|
||||
import styles from "./national-as-map.module.css";
|
||||
|
||||
const SVG_URL = "/images/region_map.svg";
|
||||
const POPUP_EDGE_PADDING_PX = 12;
|
||||
const LABEL_OFFSET_Y_PX = 18;
|
||||
const DEFAULT_VIEWBOX = "0 0 100 100";
|
||||
|
||||
export const PLACEHOLDER_POPUP_ITEMS = [{ header: "현황", data: "-" }] as const;
|
||||
|
||||
export interface MapPopupItem {
|
||||
header: string;
|
||||
data: string;
|
||||
}
|
||||
|
||||
export interface MapPopupContent {
|
||||
title: string;
|
||||
items: MapPopupItem[];
|
||||
}
|
||||
|
||||
const INITIAL_POPUP_CONTENT: MapPopupContent = {
|
||||
title: "",
|
||||
items: [...PLACEHOLDER_POPUP_ITEMS],
|
||||
};
|
||||
|
||||
function isBasinKey(key: string | undefined): key is BasinKey {
|
||||
return Boolean(key && key in BASIN_DATA);
|
||||
}
|
||||
|
||||
function resolveBasinName(group: SVGGElement) {
|
||||
const key = group.dataset.key;
|
||||
if (isBasinKey(key)) return BASIN_DATA[key].name;
|
||||
return group.dataset.label ?? "";
|
||||
}
|
||||
|
||||
function hidePopup(popup: HTMLDivElement | null) {
|
||||
if (!popup) return;
|
||||
if (styles.show) popup.classList.remove(styles.show);
|
||||
popup.style.opacity = "0";
|
||||
popup.style.visibility = "hidden";
|
||||
}
|
||||
|
||||
function showPopupAtGroup(stage: HTMLDivElement, popup: HTMLDivElement, group: SVGGElement) {
|
||||
const stageRect = stage.getBoundingClientRect();
|
||||
const groupRect = group.getBoundingClientRect();
|
||||
const centerX = (groupRect.left + groupRect.right) / 2 - stageRect.left;
|
||||
const topY = groupRect.top - stageRect.top;
|
||||
|
||||
popup.style.left = `${centerX}px`;
|
||||
popup.style.top = `${topY + 6}px`;
|
||||
popup.style.opacity = "1";
|
||||
popup.style.visibility = "visible";
|
||||
if (styles.show) popup.classList.add(styles.show);
|
||||
|
||||
const popupRect = popup.getBoundingClientRect();
|
||||
const clampedX = Math.max(
|
||||
POPUP_EDGE_PADDING_PX + popupRect.width / 2,
|
||||
Math.min(centerX, stageRect.width - POPUP_EDGE_PADDING_PX - popupRect.width / 2),
|
||||
);
|
||||
popup.style.left = `${clampedX}px`;
|
||||
}
|
||||
|
||||
function collectBasinGroups(svg: SVGSVGElement) {
|
||||
const groups: SVGGElement[] = [];
|
||||
|
||||
BASIN_IDS.forEach((item) => {
|
||||
let group: SVGGElement | null = null;
|
||||
for (const id of item.labels) {
|
||||
group = svg.getElementById(id) as SVGGElement | null;
|
||||
if (group) break;
|
||||
}
|
||||
if (!group) return;
|
||||
|
||||
group.classList.add("basin");
|
||||
group.dataset.key = item.key;
|
||||
group.dataset.label = item.labels[0] ?? "";
|
||||
|
||||
group.querySelectorAll("path").forEach((path) => {
|
||||
path.style.fill = "rgba(0, 150, 255, 0.2)";
|
||||
path.style.stroke = "#0066cc";
|
||||
path.style.strokeWidth = "1";
|
||||
path.style.vectorEffect = "non-scaling-stroke";
|
||||
});
|
||||
|
||||
groups.push(group);
|
||||
});
|
||||
|
||||
return groups;
|
||||
}
|
||||
|
||||
function createLabels(labelsLayer: HTMLDivElement, groups: SVGGElement[]) {
|
||||
labelsLayer.innerHTML = "";
|
||||
return groups.map((group) => {
|
||||
const label = document.createElement("div");
|
||||
label.className = styles.basinLabel ?? "";
|
||||
label.textContent = group.dataset.label ?? "";
|
||||
labelsLayer.appendChild(label);
|
||||
return label;
|
||||
});
|
||||
}
|
||||
|
||||
function applyViewBox(svg: SVGSVGElement, stage: HTMLDivElement) {
|
||||
if (!svg.hasAttribute("viewBox")) {
|
||||
const bbox = svg.getBBox();
|
||||
svg.setAttribute("viewBox", [bbox.x, bbox.y, bbox.width, bbox.height].join(" "));
|
||||
}
|
||||
|
||||
const viewBox = (svg.getAttribute("viewBox") || "").split(/\s+/).map(Number);
|
||||
if (viewBox.length === 4 && viewBox[3]! > 0)
|
||||
stage.style.aspectRatio = String(viewBox[2]! / viewBox[3]!);
|
||||
|
||||
svg.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
||||
svg.style.width = "100%";
|
||||
svg.style.height = "100%";
|
||||
}
|
||||
|
||||
function positionLabels(
|
||||
stage: HTMLDivElement,
|
||||
svg: SVGSVGElement,
|
||||
groups: SVGGElement[],
|
||||
labels: HTMLDivElement[],
|
||||
) {
|
||||
const stageRect = stage.getBoundingClientRect();
|
||||
const inset = parseFloat(getComputedStyle(stage).getPropertyValue("--map-inset") || "0") / 100;
|
||||
const left = stageRect.width * inset;
|
||||
const top = stageRect.height * inset;
|
||||
const width = stageRect.width * (1 - inset * 2);
|
||||
const height = stageRect.height * (1 - inset * 2);
|
||||
const [viewX, viewY, viewWidth, viewHeight] = (svg.getAttribute("viewBox") || DEFAULT_VIEWBOX)
|
||||
.split(/\s+/)
|
||||
.map(Number);
|
||||
|
||||
const svgRect = svg.getBoundingClientRect();
|
||||
const offsetX = svgRect.left - stageRect.left - left;
|
||||
const offsetY = svgRect.top - stageRect.top - top;
|
||||
|
||||
groups.forEach((group, index) => {
|
||||
const key = group.dataset.key;
|
||||
const manual = key ? (MANUAL_LABEL_POS as Record<string, ManualLabelPos>)[key] : undefined;
|
||||
let posX: number;
|
||||
let posY: number;
|
||||
|
||||
if (manual && (("x" in manual && "y" in manual) || ("px" in manual && "py" in manual))) {
|
||||
if ("px" in manual) {
|
||||
posX = left + (manual.px || 0) + offsetX;
|
||||
posY = top + (manual.py || 0) + offsetY;
|
||||
} else {
|
||||
posX = left + width * (manual.x || 0) + offsetX;
|
||||
posY = top + height * (manual.y || 0) + offsetY;
|
||||
}
|
||||
} else {
|
||||
const bbox = group.getBBox();
|
||||
const centerX = bbox.x + bbox.width / 2;
|
||||
const centerY = bbox.y + bbox.height / 2;
|
||||
posX = ((centerX - viewX!) / viewWidth!) * width + left + offsetX;
|
||||
posY = ((centerY - viewY!) / viewHeight!) * height + top + offsetY;
|
||||
}
|
||||
|
||||
const label = labels[index];
|
||||
if (!label) return;
|
||||
label.style.left = `${posX}px`;
|
||||
label.style.top = `${posY + LABEL_OFFSET_Y_PX}px`;
|
||||
});
|
||||
}
|
||||
|
||||
export function useNationalAsMap() {
|
||||
const stageRef = useRef<HTMLDivElement>(null);
|
||||
const svgLayerRef = useRef<HTMLDivElement>(null);
|
||||
const labelsLayerRef = useRef<HTMLDivElement>(null);
|
||||
const popupRef = useRef<HTMLDivElement>(null);
|
||||
const [popupContent, setPopupContent] = useState<MapPopupContent>(INITIAL_POPUP_CONTENT);
|
||||
|
||||
const showFor = useCallback((group: SVGGElement) => {
|
||||
const stage = stageRef.current;
|
||||
const popup = popupRef.current;
|
||||
if (!stage || !popup) return;
|
||||
|
||||
setPopupContent({
|
||||
title: resolveBasinName(group),
|
||||
items: [...PLACEHOLDER_POPUP_ITEMS],
|
||||
});
|
||||
showPopupAtGroup(stage, popup, group);
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const abortController = new AbortController();
|
||||
let svg: SVGSVGElement | null = null;
|
||||
let groups: SVGGElement[] = [];
|
||||
let labels: HTMLDivElement[] = [];
|
||||
let resizeObserver: ResizeObserver | null = null;
|
||||
let positionLabelsHandler: (() => void) | null = null;
|
||||
let clearActive: (() => void) | null = null;
|
||||
let handleStageClick: (() => void) | null = null;
|
||||
|
||||
const listeners: Array<{
|
||||
target: EventTarget;
|
||||
type: string;
|
||||
listener: EventListener;
|
||||
}> = [];
|
||||
|
||||
function addListener(target: EventTarget, type: string, listener: EventListener) {
|
||||
target.addEventListener(type, listener);
|
||||
listeners.push({ target, type, listener });
|
||||
}
|
||||
|
||||
fetch(SVG_URL, { signal: abortController.signal })
|
||||
.then((response) => {
|
||||
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);
|
||||
return response.text();
|
||||
})
|
||||
.then((svgText) => {
|
||||
if (abortController.signal.aborted) return;
|
||||
if (!svgLayerRef.current || !stageRef.current) return;
|
||||
|
||||
svgLayerRef.current.innerHTML = svgText;
|
||||
svg = svgLayerRef.current.querySelector("svg");
|
||||
if (!svg) throw new Error("SVG element not found in loaded content");
|
||||
|
||||
applyViewBox(svg, stageRef.current);
|
||||
groups = collectBasinGroups(svg);
|
||||
labels = labelsLayerRef.current ? createLabels(labelsLayerRef.current, groups) : [];
|
||||
|
||||
clearActive = () => {
|
||||
groups.forEach((group) => group.classList.remove("active"));
|
||||
hidePopup(popupRef.current);
|
||||
labels.forEach((label) => label.classList.remove("active"));
|
||||
};
|
||||
|
||||
const revealGroup = (group: SVGGElement) => {
|
||||
showFor(group);
|
||||
const index = groups.indexOf(group);
|
||||
labels.forEach((label) => label.classList.remove("active"));
|
||||
if (index >= 0) labels[index]?.classList.add("active");
|
||||
};
|
||||
|
||||
groups.forEach((group) => {
|
||||
addListener(group, "mouseenter", () => {
|
||||
clearActive?.();
|
||||
group.classList.add("active");
|
||||
revealGroup(group);
|
||||
});
|
||||
addListener(group, "mousemove", () => {
|
||||
if (group.classList.contains("active")) revealGroup(group);
|
||||
});
|
||||
addListener(group, "mouseleave", () => clearActive?.());
|
||||
addListener(group, "click", (event) => {
|
||||
event.stopPropagation();
|
||||
clearActive?.();
|
||||
group.classList.add("active");
|
||||
revealGroup(group);
|
||||
});
|
||||
});
|
||||
|
||||
handleStageClick = () => clearActive?.();
|
||||
addListener(stageRef.current, "mouseleave", () => clearActive?.());
|
||||
addListener(stageRef.current, "click", () => handleStageClick?.());
|
||||
|
||||
positionLabelsHandler = () => {
|
||||
if (!stageRef.current || !svg) return;
|
||||
positionLabels(stageRef.current, svg, groups, labels);
|
||||
};
|
||||
positionLabelsHandler();
|
||||
window.addEventListener("resize", positionLabelsHandler);
|
||||
resizeObserver = new ResizeObserver(positionLabelsHandler);
|
||||
resizeObserver.observe(stageRef.current);
|
||||
})
|
||||
.catch((error: unknown) => {
|
||||
if (abortController.signal.aborted) return;
|
||||
const message = error instanceof Error ? error.message : "알 수 없는 오류";
|
||||
if (svgLayerRef.current) {
|
||||
svgLayerRef.current.innerHTML = `<div style="display: flex; align-items: center; justify-content: center; height: 100%; color: #666; font-size: 14px;">지도를 불러올 수 없습니다. (${message})</div>`;
|
||||
}
|
||||
});
|
||||
|
||||
return () => {
|
||||
abortController.abort();
|
||||
listeners.forEach(({ target, type, listener }) => {
|
||||
target.removeEventListener(type, listener);
|
||||
});
|
||||
if (positionLabelsHandler) window.removeEventListener("resize", positionLabelsHandler);
|
||||
resizeObserver?.disconnect();
|
||||
if (svgLayerRef.current) svgLayerRef.current.innerHTML = "";
|
||||
if (labelsLayerRef.current) labelsLayerRef.current.innerHTML = "";
|
||||
};
|
||||
}, [showFor]);
|
||||
|
||||
const popupGridStyle = {
|
||||
minWidth: 160,
|
||||
display: "grid",
|
||||
gridTemplateColumns: `repeat(${Math.max(1, popupContent.items.length)}, 1fr)`,
|
||||
} satisfies CSSProperties;
|
||||
|
||||
return {
|
||||
stageRef,
|
||||
svgLayerRef,
|
||||
labelsLayerRef,
|
||||
popupRef,
|
||||
popupContent,
|
||||
popupGridStyle,
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
export const MANUAL_LABEL_POS = {
|
||||
han: { x: 0.52, y: 0.14 },
|
||||
geum: { x: 0.28, y: 0.47 },
|
||||
nakdong: { x: 0.64, y: 0.47 },
|
||||
yeongsan: { x: 0.18, y: 0.77 },
|
||||
} as const;
|
||||
|
||||
export const BASIN_DATA = {
|
||||
han: { name: "한강" },
|
||||
geum: { name: "금강" },
|
||||
nakdong: { name: "낙동강" },
|
||||
yeongsan: { name: "영산강" },
|
||||
} as const;
|
||||
|
||||
export const BASIN_IDS = [
|
||||
{ key: "han", labels: ["한강", "han"] },
|
||||
{ key: "geum", labels: ["금강", "geum"] },
|
||||
{ key: "nakdong", labels: ["낙동강", "nakdong"] },
|
||||
{ key: "yeongsan", labels: ["영산강", "yeongsan"] },
|
||||
] as const;
|
||||
|
||||
export type BasinKey = keyof typeof BASIN_DATA;
|
||||
|
||||
export interface ManualLabelPos {
|
||||
x?: number;
|
||||
y?: number;
|
||||
px?: number;
|
||||
py?: number;
|
||||
}
|
||||
@@ -11,9 +11,11 @@ export function DashboardPage() {
|
||||
const { data, isPending, isError, dataUpdatedAt } = useGetMainDashboard();
|
||||
|
||||
return (
|
||||
<div className="grid gap-4 px-[1.8rem] pb-6 lg:grid-cols-2">
|
||||
<NationalAsMap />
|
||||
<div className="flex min-h-0 flex-col gap-4">
|
||||
<div className="flex gap-4 px-[1.8rem] pb-6">
|
||||
<div className="flex-[0.5]">
|
||||
<NationalAsMap />
|
||||
</div>
|
||||
<div className="flex min-h-0 flex-1 flex-col gap-4">
|
||||
<DocPrgrsSttsCards items={data?.docPrgrsSttsList} isPending={isPending} isError={isError} />
|
||||
<DashboardNotiList
|
||||
notiList={data?.notiList}
|
||||
|
||||
@@ -1,13 +1,84 @@
|
||||
import { Skeleton } from "@common/components";
|
||||
"use client";
|
||||
|
||||
import type { CSSProperties } from "react";
|
||||
|
||||
import { useNationalAsMap } from "../lib/use-national-as-map";
|
||||
|
||||
import styles from "../lib/national-as-map.module.css";
|
||||
|
||||
export function NationalAsMap() {
|
||||
const { stageRef, svgLayerRef, labelsLayerRef, popupRef, popupContent, popupGridStyle } =
|
||||
useNationalAsMap();
|
||||
const popupColumnSpan = Math.max(1, popupContent.items.length);
|
||||
|
||||
return (
|
||||
<section className="card card-border mx-0 flex h-full min-h-[40rem] flex-col bg-background">
|
||||
<div className="card-header">
|
||||
<h3 className="text-2xl font-semibold">전국 행정지원 지도</h3>
|
||||
</div>
|
||||
<div className="flex-1 p-4">
|
||||
<Skeleton className="h-full min-h-[36rem] w-full rounded-xl" />
|
||||
<div className={styles.mapArea}>
|
||||
<div
|
||||
ref={stageRef}
|
||||
style={
|
||||
{
|
||||
aspectRatio: 0.72 / 1,
|
||||
width: "100%",
|
||||
maxHeight: "100%",
|
||||
position: "relative",
|
||||
margin: "auto",
|
||||
"--map-inset": "0%",
|
||||
} as CSSProperties
|
||||
}
|
||||
>
|
||||
<div className={styles.bgLayer} />
|
||||
<div
|
||||
ref={svgLayerRef}
|
||||
className={`${styles.svgLayer} ${styles.svgContainer}`}
|
||||
style={{ width: "100%", height: "100%" }}
|
||||
/>
|
||||
<div
|
||||
ref={labelsLayerRef}
|
||||
className={styles.labelsLayer}
|
||||
style={{
|
||||
position: "absolute",
|
||||
left: 0,
|
||||
top: 0,
|
||||
width: "100%",
|
||||
height: "100%",
|
||||
pointerEvents: "none",
|
||||
}}
|
||||
/>
|
||||
<div
|
||||
ref={popupRef}
|
||||
className={`${styles.popup} invisible absolute z-20 overflow-hidden rounded-lg border border-blue-200 bg-blue-50 font-sans opacity-0 shadow-md`}
|
||||
style={popupGridStyle}
|
||||
>
|
||||
<div
|
||||
className="flex items-center justify-center border-b-2 border-blue-200 bg-blue-100 text-center font-bold"
|
||||
style={{ gridColumn: `span ${popupColumnSpan}` }}
|
||||
>
|
||||
{popupContent.title}
|
||||
</div>
|
||||
{popupContent.items.map((item, index) => (
|
||||
<div
|
||||
key={`header-${item.header}`}
|
||||
className={`flex items-center justify-center border-b-2 border-blue-200 text-center ${index < popupContent.items.length - 1 ? "border-r-2" : ""}`}
|
||||
>
|
||||
{item.header}
|
||||
</div>
|
||||
))}
|
||||
{popupContent.items.map((item, index) => (
|
||||
<div
|
||||
key={`data-${item.header}`}
|
||||
className={`flex items-center justify-center text-center ${index < popupContent.items.length - 1 ? "border-r-2" : ""}`}
|
||||
>
|
||||
{item.data}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
|
||||
@@ -33,10 +33,6 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
) : (
|
||||
bizSclList.map((node) => {
|
||||
const pl = indentPx(node.indCnstpSeCdNm);
|
||||
const bscPlanQty = Number(node.bscPlanQty) || 0;
|
||||
const budgetReflct = Number(node.bgtRfltQty) || 0;
|
||||
const tstmDesignQty = Number(node.tstmDesignQty) || 0;
|
||||
const diff = tstmDesignQty - budgetReflct;
|
||||
|
||||
return (
|
||||
<TableRow key={node.cnstpSeCd}>
|
||||
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
{node.cnstpSeCdNm}
|
||||
</TableHead>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(bscPlanQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bscPlanQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bgtRfltQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(tstmDesignQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.tstmDesignQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
|
||||
{node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
|
||||
</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
@@ -4,7 +4,7 @@ import { useMemo } from "react";
|
||||
|
||||
import { SectionCollapsible } from "@/shared/ui";
|
||||
import type { BizCstTreeDto } from "@/entities/fnrs-cnsltn";
|
||||
import { calcDiffPercent, fmtNumber, indentPx } from "@/widgets/pbadms-sprt";
|
||||
import { fmtNumber, indentPx } from "@/widgets/pbadms-sprt";
|
||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@common/components";
|
||||
|
||||
import { sortBizCstListByTreePath } from "../../lib/business-cost-utils";
|
||||
@@ -46,10 +46,6 @@ function BusinessCostSection({ bizCstList }: BusinessCostSectionProps) {
|
||||
) : (
|
||||
sortedBizCstList.map((node) => {
|
||||
const pl = indentPx(node.indAcntgSeCdNm);
|
||||
const bscPlanAmt = Number(node.bscPlanAmt) || 0;
|
||||
const budgetReflct = Number(node.bgtRfltAmt) || 0;
|
||||
const tstmDesignAmt = Number(node.tstmDesignAmt) || 0;
|
||||
const diff = tstmDesignAmt - budgetReflct;
|
||||
const showSubIcon = node.treeLevel >= 3;
|
||||
|
||||
return (
|
||||
@@ -63,21 +59,21 @@ function BusinessCostSection({ bizCstList }: BusinessCostSectionProps) {
|
||||
</TableHead>
|
||||
)}
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(bscPlanAmt)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bgtRfltAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bscPlanAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(tstmDesignAmt)}</div>
|
||||
<div className="text-right">{fmtNumber(node.tstmDesignAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
|
||||
{node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
|
||||
</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{calcDiffPercent(diff, budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.chgRt)}%</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
);
|
||||
|
||||
@@ -33,10 +33,6 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
) : (
|
||||
bizSclList.map((node) => {
|
||||
const pl = indentPx(node.indCnstpSeCdNm);
|
||||
const bscPlanQty = Number(node.bscPlanQty) || 0;
|
||||
const budgetReflct = Number(node.bgtRfltQty) || 0;
|
||||
const tstmDesignQty = Number(node.tstmDesignQty) || 0;
|
||||
const diff = tstmDesignQty - budgetReflct;
|
||||
|
||||
return (
|
||||
<TableRow key={node.cnstpSeCd}>
|
||||
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
{node.cnstpSeCdNm}
|
||||
</TableHead>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(bscPlanQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bscPlanQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bgtRfltQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(tstmDesignQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.tstmDesignQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
|
||||
{node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
|
||||
</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
@@ -61,8 +61,14 @@ function FnrsSharSection({ fnrsSharList }: FnrsSharSectionProps) {
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(node.chgRqtAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell />
|
||||
<TableCell />
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
|
||||
</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(node.chgRt)}%</div>
|
||||
</TableCell>
|
||||
<TableCell>{node.rmrkCn ?? ""}</TableCell>
|
||||
</TableRow>
|
||||
);
|
||||
|
||||
@@ -4,7 +4,7 @@ import { useMemo } from "react";
|
||||
|
||||
import { SectionCollapsible } from "@/shared/ui";
|
||||
import type { BizCstTreeDto } from "@/entities/instl-sncn";
|
||||
import { calcDiffPercent, fmtNumber, indentPx } from "@/widgets/pbadms-sprt";
|
||||
import { fmtNumber, indentPx } from "@/widgets/pbadms-sprt";
|
||||
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@common/components";
|
||||
|
||||
import { sortBizCstListByTreePath } from "../../lib/business-cost-utils";
|
||||
@@ -46,10 +46,6 @@ function BusinessCostSection({ bizCstList }: BusinessCostSectionProps) {
|
||||
) : (
|
||||
sortedBizCstList.map((node) => {
|
||||
const pl = indentPx(node.indAcntgSeCdNm);
|
||||
const bscPlanAmt = Number(node.bscPlanAmt) || 0;
|
||||
const budgetReflct = Number(node.bgtRfltAmt) || 0;
|
||||
const tstmDesignAmt = Number(node.tstmDesignAmt) || 0;
|
||||
const diff = tstmDesignAmt - budgetReflct;
|
||||
const showSubIcon = node.treeLevel >= 3;
|
||||
|
||||
return (
|
||||
@@ -63,21 +59,21 @@ function BusinessCostSection({ bizCstList }: BusinessCostSectionProps) {
|
||||
</TableHead>
|
||||
)}
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(bscPlanAmt)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bgtRfltAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bscPlanAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(tstmDesignAmt)}</div>
|
||||
<div className="text-right">{fmtNumber(node.tstmDesignAmt)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
|
||||
{node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
|
||||
</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{calcDiffPercent(diff, budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.chgRt)}%</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
);
|
||||
|
||||
@@ -33,10 +33,6 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
) : (
|
||||
bizSclList.map((node) => {
|
||||
const pl = indentPx(node.indCnstpSeCdNm);
|
||||
const bscPlanQty = Number(node.bscPlanQty) || 0;
|
||||
const budgetReflct = Number(node.bgtRfltQty) || 0;
|
||||
const tstmDesignQty = Number(node.tstmDesignQty) || 0;
|
||||
const diff = tstmDesignQty - budgetReflct;
|
||||
|
||||
return (
|
||||
<TableRow key={node.cnstpSeCd}>
|
||||
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
|
||||
{node.cnstpSeCdNm}
|
||||
</TableHead>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(bscPlanQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bscPlanQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(budgetReflct)}</div>
|
||||
<div className="text-right">{fmtNumber(node.bgtRfltQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">{fmtNumber(tstmDesignQty)}</div>
|
||||
<div className="text-right">{fmtNumber(node.tstmDesignQty)}</div>
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
<div className="text-right">
|
||||
{diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
|
||||
{node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
|
||||
</div>
|
||||
</TableCell>
|
||||
</TableRow>
|
||||
|
||||
@@ -28,6 +28,10 @@ export interface BizSclTreeDto {
|
||||
bgtRfltQty: number;
|
||||
/** 금회설계수량 */
|
||||
tstmDesignQty: number;
|
||||
/** 증감수량(금회설계수량 - 예산반영수량, C-B) */
|
||||
chgQty: number;
|
||||
/** 증감율 % ((증감수량 / 기본계획수량) * 100) */
|
||||
chgRt: number;
|
||||
}
|
||||
|
||||
/** 회계구분 트리와 사업비용 조합 DTO */
|
||||
@@ -44,12 +48,16 @@ export interface BizCstTreeDto {
|
||||
treeLevel: number;
|
||||
/** 트리 경로 표시용 문자열 */
|
||||
treePath: string;
|
||||
/** 기본계획금액 */
|
||||
bscPlanAmt: number;
|
||||
/** 예산반영금액 */
|
||||
/** 예산반영금액(A) */
|
||||
bgtRfltAmt: number;
|
||||
/** 금회설계금액 */
|
||||
/** 표준사업비(B) */
|
||||
bscPlanAmt: number;
|
||||
/** 금회설계금액(C) */
|
||||
tstmDesignAmt: number;
|
||||
/** 증감금액(금회설계금액 - 표준사업비, C-B) */
|
||||
chgAmt: number;
|
||||
/** 증감율 % ((증감금액 / 표준사업비) * 100) */
|
||||
chgRt: number;
|
||||
}
|
||||
|
||||
/** 점검표 검토결과 트리 DTO */
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
export function fmtNumber(value: number | null | undefined): string {
|
||||
if (typeof value === "number") return value.toLocaleString();
|
||||
if (value === null || value === undefined) return "";
|
||||
export function fmtNumber(value: number | string | null | undefined): string {
|
||||
if (typeof value === "number") {
|
||||
return value.toLocaleString();
|
||||
}
|
||||
if (value === null || value === undefined) {
|
||||
return "";
|
||||
}
|
||||
const num = Number(value);
|
||||
if (!isNaN(num)) {
|
||||
return num.toLocaleString();
|
||||
}
|
||||
return String(value);
|
||||
}
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ function ProgressStatusSection({
|
||||
|
||||
return (
|
||||
<SectionCollapsible title="진행 상태">
|
||||
<Table variant="secondary">
|
||||
<Table variant="secondary" className="table-fixed">
|
||||
<TableHeader>
|
||||
<TableRow>
|
||||
{columns.map((column) => (
|
||||
|
||||
@@ -16,6 +16,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputExcretaTreatmentFacilityApi } from "@/entities/statistics/api/input/statistics-input-excreta-treatment-facility-service";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -193,13 +194,6 @@ function mapExcretaTreatmentFacilityListToGridRows(
|
||||
});
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -212,9 +206,9 @@ function toApiYmd(value: string | number | Date | null | undefined): string | nu
|
||||
function resolveExcretaTreatmentFacilityAdmdst(
|
||||
row: Record<string, string | number>,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
const existingCd = String(row.admdstCd ?? "").trim();
|
||||
const existingNm = String(row.admdstNm ?? "").trim();
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const existingCd = nullableTrimmedString(row.admdstCd);
|
||||
const existingNm = nullableTrimmedString(row.admdstNm);
|
||||
if (existingCd && existingNm) {
|
||||
return { admdstCd: existingCd, admdstNm: existingNm };
|
||||
}
|
||||
@@ -223,7 +217,10 @@ function resolveExcretaTreatmentFacilityAdmdst(
|
||||
if (matched) {
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
|
||||
return {
|
||||
admdstCd: existingCd,
|
||||
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
|
||||
};
|
||||
}
|
||||
|
||||
/** 그리드 행 → ST00070001 저장/삭제 API 항목 */
|
||||
@@ -238,18 +235,18 @@ function buildExcretaTreatmentFacilitySaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
fcltNm: String(row.fcltNm ?? ""),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? ""),
|
||||
telNo: String(row.telNo ?? ""),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
telNo: nullableTrimmedString(row.telNo),
|
||||
cmptnStrtYmd: toApiYmd(row.cmptnStrtYmd),
|
||||
oprtngStrtYmd: toApiYmd(row.oprtngStrtYmd),
|
||||
wholPjtcoAmt: toGridNumber(row.wholPjtcoAmt),
|
||||
prcsFcltCpct: toGridNumber(row.prcsFcltCpct),
|
||||
cpct: toGridNumber(row.cpct),
|
||||
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
|
||||
prcsMthdExpln: String(row.prcsMthdExpln ?? ""),
|
||||
linkTmplntCn: String(row.linkTmplntCn ?? ""),
|
||||
prcsMthdExpln: nullableTrimmedString(row.prcsMthdExpln),
|
||||
linkTmplntCn: nullableTrimmedString(row.linkTmplntCn),
|
||||
linkPrcsQnt: toGridNumber(row.linkPrcsQnt),
|
||||
inflwBodWqVl: toGridNumber(row.inflwBodWqVl),
|
||||
inflwTocWqVl: toGridNumber(row.inflwTocWqVl),
|
||||
@@ -263,11 +260,11 @@ function buildExcretaTreatmentFacilitySaveItem(
|
||||
dschgTnWqVl: toGridNumber(row.dschgTnWqVl),
|
||||
dschgTpWqVl: toGridNumber(row.dschgTpWqVl),
|
||||
dschgClfgCnt: toGridNumber(row.dschgClfgCnt),
|
||||
wtsysNm: String(row.wtsysNm ?? ""),
|
||||
trbtrNm: String(row.trbtrNm ?? ""),
|
||||
msirbCn: String(row.msirbCn ?? ""),
|
||||
ssirbCn: String(row.ssirbCn ?? ""),
|
||||
operMthdCdCn: String(row.operMthdCdCn ?? ""),
|
||||
wtsysNm: nullableTrimmedString(row.wtsysNm),
|
||||
trbtrNm: nullableTrimmedString(row.trbtrNm),
|
||||
msirbCn: nullableTrimmedString(row.msirbCn),
|
||||
ssirbCn: nullableTrimmedString(row.ssirbCn),
|
||||
operMthdCdCn: nullableTrimmedString(row.operMthdCdCn),
|
||||
wholNope: toGridNumber(row.wholNope),
|
||||
sftyAcdntEvntcsCnt: toGridNumber(row.sftyAcdntEvntcsCnt),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
|
||||
@@ -62,6 +62,7 @@ import {
|
||||
patchVerificationFailedByTab,
|
||||
} from "@/components/util/input/verification-failed-flag";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
import { useTabStore } from "@/store/tab-store";
|
||||
|
||||
@@ -169,17 +170,6 @@ function mapRegionalListToGridRows<
|
||||
});
|
||||
}
|
||||
|
||||
function normalizeGridString(value: unknown): string {
|
||||
if (value === null || value === undefined) return "";
|
||||
return typeof value === "string" ? value : String(value);
|
||||
}
|
||||
|
||||
function normalizeGridRmrk(value: unknown): string | null {
|
||||
if (value === null || value === undefined) return null;
|
||||
const s = typeof value === "string" ? value : String(value);
|
||||
return s.trim() === "" ? null : s;
|
||||
}
|
||||
|
||||
function buildColumnFormatNumber(
|
||||
columns: { fieldName?: string; dataFormat?: string }[],
|
||||
) {
|
||||
@@ -208,8 +198,8 @@ function buildSewageTreatFactStatusSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(SewageTreatFactStatusInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
step1StaaPrcsQnt: formatNumber(d.step1StaaPrcsQnt, "step1StaaPrcsQnt"),
|
||||
step2StaaPrcsQnt: formatNumber(d.step2StaaPrcsQnt, "step2StaaPrcsQnt"),
|
||||
step3StaaPrcsQnt: formatNumber(d.step3StaaPrcsQnt, "step3StaaPrcsQnt"),
|
||||
@@ -224,7 +214,7 @@ function buildSewageTreatFactStatusSaveList(
|
||||
step5StaaExcpPrcsQnt: formatNumber(d.step5StaaExcpPrcsQnt, "step5StaaExcpPrcsQnt"),
|
||||
step6StaaExcpPrcsQnt: formatNumber(d.step6StaaExcpPrcsQnt, "step6StaaExcpPrcsQnt"),
|
||||
step7StaaExcpPrcsQnt: formatNumber(d.step7StaaExcpPrcsQnt, "step7StaaExcpPrcsQnt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -234,8 +224,8 @@ function buildSepticTankStatusSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(SepticTankStatusInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
staaInsdSttkNprsflCnt: formatNumber(d.staaInsdSttkNprsflCnt, "staaInsdSttkNprsflCnt"),
|
||||
step1StaaInsdSttkFrcCnt: formatNumber(d.step1StaaInsdSttkFrcCnt, "step1StaaInsdSttkFrcCnt"),
|
||||
staaInsdSprktpFltrtbCnt: formatNumber(d.staaInsdSprktpFltrtbCnt, "staaInsdSprktpFltrtbCnt"),
|
||||
@@ -264,7 +254,7 @@ function buildSepticTankStatusSaveList(
|
||||
step6StaaExcpNope: formatNumber(d.step6StaaExcpNope, "step6StaaExcpNope"),
|
||||
step7StaaExcpNope: formatNumber(d.step7StaaExcpNope, "step7StaaExcpNope"),
|
||||
step8StaaExcpNope: formatNumber(d.step8StaaExcpNope, "step8StaaExcpNope"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -274,8 +264,8 @@ function buildPrivateSewageDesigStatusSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(PrivateSewageDesigStatusInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
indvSwagePbancRgnCnt: formatNumber(d.indvSwagePbancRgnCnt, "indvSwagePbancRgnCnt"),
|
||||
indvSwageDsgnScpLen: formatNumber(d.indvSwageDsgnScpLen, "indvSwageDsgnScpLen"),
|
||||
spctnkGrssFcltCnt: formatNumber(d.spctnkGrssFcltCnt, "spctnkGrssFcltCnt"),
|
||||
@@ -285,7 +275,7 @@ function buildPrivateSewageDesigStatusSaveList(
|
||||
"drtwPrcsFcltGrssFcltCnt",
|
||||
),
|
||||
drtwPrcsFcltQnt: formatNumber(d.drtwPrcsFcltQnt, "drtwPrcsFcltQnt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ import { toGridRows } from '@/components/util/grid/gridFunction';
|
||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||
import { patchFooterVerificationByTab,patchVerificationFailedByTab } from '@/components/util/input/verification-failed-flag';
|
||||
import type { VerificationResultLikeMap } from '@/components/util/input/verification-result-display';
|
||||
import { nullableTrimmedString } from '@/components/util/input/nullableString';
|
||||
import { useAdminStore } from '@/store/admin-store';
|
||||
import { useTabStore } from '@/store/tab-store';
|
||||
|
||||
@@ -277,19 +278,13 @@ const PublicSewageFacilityInp = () => {
|
||||
return Number.isFinite(num) ? num : 0;
|
||||
};
|
||||
|
||||
const toNullableString = (v: unknown): string | null => {
|
||||
if (v === null || v === undefined) return null;
|
||||
const s = typeof v === 'string' ? v : String(v);
|
||||
return s.trim() === '' ? null : s;
|
||||
};
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: String(d.admdstCd ?? ''),
|
||||
admdstNm: String(d.admdstNm ?? ''),
|
||||
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ''),
|
||||
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ''),
|
||||
fcltSn: String(d.fcltSn ?? ''),
|
||||
fcltPstnCn: d.fcltPstnCn === '' ? null : toNullableString(d.fcltPstnCn),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
|
||||
fcltSn: nullableTrimmedString(d.fcltSn),
|
||||
fcltPstnCn: nullableTrimmedString(d.fcltPstnCn),
|
||||
inflwSwagePhysQnt: toNumber(d.inflwSwagePhysQnt),
|
||||
inflwSwageBoilQnt: toNumber(d.inflwSwageBoilQnt),
|
||||
inflwSwageAltdQnt: toNumber(d.inflwSwageAltdQnt),
|
||||
@@ -298,7 +293,7 @@ const PublicSewageFacilityInp = () => {
|
||||
prcsAltdCpct: toNumber(d.prcsAltdCpct),
|
||||
prxyCtrtCn: normalizePrxyCtrtCn(d.prxyCtrtCn),
|
||||
sftyAcdntEvntcsCnt: toNumber(d.sftyAcdntEvntcsCnt),
|
||||
rmrk: toNullableString(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
};
|
||||
|
||||
@@ -528,12 +523,12 @@ const PublicSewageFacilityInp = () => {
|
||||
const saveList: PublicSewageMainFacilityMappingSaveItem[] = rightRows
|
||||
.filter((r) => isCheckedRow(r))
|
||||
.map((r) => ({
|
||||
fcltSn: String(r.fcltSn ?? ''),
|
||||
admdstCd: String(r.admdstCd ?? ''),
|
||||
admdstNm: String(r.admdstNm ?? ''),
|
||||
swtrmtFcltCd: String(r.swtrmtFcltCd ?? ''),
|
||||
swtrmtFcltNm: String(r.swtrmtFcltNm ?? ''),
|
||||
isMainYn: String(r.isMainYn ?? ''),
|
||||
fcltSn: nullableTrimmedString(r.fcltSn),
|
||||
admdstCd: nullableTrimmedString(r.admdstCd),
|
||||
admdstNm: nullableTrimmedString(r.admdstNm),
|
||||
swtrmtFcltCd: nullableTrimmedString(r.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(r.swtrmtFcltNm),
|
||||
isMainYn: nullableTrimmedString(r.isMainYn),
|
||||
}));
|
||||
|
||||
const deleteList = rightRows
|
||||
|
||||
@@ -16,6 +16,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputPumpingStationApi } from "@/entities/statistics/api/input/statistics-input-pumping-station-service";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -192,13 +193,6 @@ function mapPumpingStationListToGridRows(
|
||||
});
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -207,9 +201,9 @@ function toGridNumber(value: string | number | null | undefined): number {
|
||||
function resolvePumpingStationAdmdst(
|
||||
row: Record<string, string | number>,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
const existingCd = String(row.admdstCd ?? "").trim();
|
||||
const existingNm = String(row.admdstNm ?? "").trim();
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const existingCd = nullableTrimmedString(row.admdstCd);
|
||||
const existingNm = nullableTrimmedString(row.admdstNm);
|
||||
if (existingCd && existingNm) {
|
||||
return { admdstCd: existingCd, admdstNm: existingNm };
|
||||
}
|
||||
@@ -218,7 +212,10 @@ function resolvePumpingStationAdmdst(
|
||||
if (matched) {
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
|
||||
return {
|
||||
admdstCd: existingCd,
|
||||
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
|
||||
};
|
||||
}
|
||||
|
||||
/** 그리드 행 → ST00050001 저장/삭제 API 항목 */
|
||||
@@ -227,15 +224,14 @@ function buildPumpingStationSaveItem(
|
||||
sggOptions: Sgg[] = [],
|
||||
): PumpingStationSaveItem {
|
||||
const { admdstCd, admdstNm } = resolvePumpingStationAdmdst(row, sggOptions);
|
||||
const fcltSn = String(row.fcltSn ?? "").trim();
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: fcltSn,
|
||||
swtrmtFcltNm: String(row.swtrmtFcltNm ?? ""),
|
||||
fcltNm: String(row.fcltNm ?? ""),
|
||||
pumpSeNm: String(row.pumpSeNm ?? ""),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? ""),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
pumpSeNm: nullableTrimmedString(row.pumpSeNm),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
|
||||
planMltvArea: toGridNumber(row.planMltvArea),
|
||||
sndyArea: toGridNumber(row.sndyArea),
|
||||
|
||||
@@ -9,6 +9,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsInputSewageExcretaRelatedApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-related-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -319,7 +320,7 @@ function buildSggNmColumn(
|
||||
function resolvePublicInstitutionAdmdst(
|
||||
row: Record<string, string | number>,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const sggNm = String(row.sggNm ?? "").trim();
|
||||
if (sggNm) {
|
||||
const matched = sggOptions.find((s) => s.gugun === sggNm);
|
||||
@@ -327,9 +328,12 @@ function resolvePublicInstitutionAdmdst(
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
}
|
||||
const existingCd = String(row.admdstCd ?? "").trim();
|
||||
const existingNm = String(row.admdstNm ?? "").trim();
|
||||
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
|
||||
const existingCd = nullableTrimmedString(row.admdstCd);
|
||||
const existingNm = nullableTrimmedString(row.admdstNm);
|
||||
return {
|
||||
admdstCd: existingCd,
|
||||
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
|
||||
};
|
||||
}
|
||||
|
||||
function mergeGridRowsWithMapRows(
|
||||
@@ -369,13 +373,6 @@ function mergeGridRowsWithArticleMeta(
|
||||
});
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -390,8 +387,8 @@ function buildPublicInstitutionIndustrySaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
ognzSn: String(row.ognzSn ?? "").trim(),
|
||||
ognzNm: String(row.ognzNm ?? "").trim(),
|
||||
ognzSn: nullableTrimmedString(row.ognzSn),
|
||||
ognzNm: nullableTrimmedString(row.ognzNm),
|
||||
pbadmsNope: toGridNumber(row.pbadmsNope),
|
||||
engrkCnt: toGridNumber(row.engrkCnt),
|
||||
mchnCnt: toGridNumber(row.mchnCnt),
|
||||
@@ -409,8 +406,8 @@ function buildExcretaRelatedIndustrySaveItem(
|
||||
row: Record<string, string | number>,
|
||||
): ExcretaRelatedIndustrySaveItem {
|
||||
return {
|
||||
admdstCd: String(row.admdstCd ?? "").trim(),
|
||||
admdstNm: String(row.admdstNm ?? "").trim(),
|
||||
admdstCd: nullableTrimmedString(row.admdstCd),
|
||||
admdstNm: nullableTrimmedString(row.admdstNm),
|
||||
bzentyCnt: toGridNumber(row.bzentyCnt),
|
||||
empNope: toGridNumber(row.empNope),
|
||||
n3TonUdrCnt: toGridNumber(row.n3TonUdrCnt),
|
||||
@@ -427,8 +424,8 @@ function buildPrivateSewageTreatRelatedIndustrySaveItem(
|
||||
row: Record<string, string | number>,
|
||||
): PrivateSewageTreatRelatedIndustrySaveItem {
|
||||
return {
|
||||
admdstCd: String(row.admdstCd ?? "").trim(),
|
||||
admdstNm: String(row.admdstNm ?? "").trim(),
|
||||
admdstCd: nullableTrimmedString(row.admdstCd),
|
||||
admdstNm: nullableTrimmedString(row.admdstNm),
|
||||
designMdsrCnt: toGridNumber(row.designMdsrCnt),
|
||||
designMdsrNope: toGridNumber(row.designMdsrNope),
|
||||
mfbizCnt: toGridNumber(row.mfbizCnt),
|
||||
@@ -1715,8 +1712,8 @@ const SewageExcretaRelatedInp = () => {
|
||||
newRow.__isNewArticle = 1;
|
||||
if (sggNm) {
|
||||
const { admdstCd, admdstNm } = resolvePublicInstitutionAdmdst(newRow, list);
|
||||
newRow.admdstCd = admdstCd;
|
||||
newRow.admdstNm = admdstNm;
|
||||
newRow.admdstCd = admdstCd ?? "";
|
||||
newRow.admdstNm = admdstNm ?? "";
|
||||
}
|
||||
|
||||
flushSync(() => {
|
||||
|
||||
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsInputSewageExcretaSlurgeApi } from "@/entities/statistics/api/input/statistics-input-sewage-excreta-slurge-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -441,13 +442,6 @@ function mergeGridRowsWithMapRows(
|
||||
});
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -456,7 +450,7 @@ function toGridNumber(value: string | number | null | undefined): number {
|
||||
function resolveSlurgeFacStatusAdmdst(
|
||||
row: Record<string, string | number>,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const sggNm = String(row.sggNm ?? "").trim();
|
||||
if (sggNm) {
|
||||
const matched = sggOptions.find((s) => s.gugun === sggNm);
|
||||
@@ -464,12 +458,15 @@ function resolveSlurgeFacStatusAdmdst(
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
}
|
||||
const existingCd = String(row.admdstCd ?? "").trim();
|
||||
const existingNm = String(row.admdstNm ?? "").trim();
|
||||
const existingCd = nullableTrimmedString(row.admdstCd);
|
||||
const existingNm = nullableTrimmedString(row.admdstNm);
|
||||
if (existingCd || existingNm) {
|
||||
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
|
||||
return {
|
||||
admdstCd: existingCd,
|
||||
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
|
||||
};
|
||||
}
|
||||
return { admdstCd: "", admdstNm: sggNm };
|
||||
return { admdstCd: null, admdstNm: nullableTrimmedString(sggNm) };
|
||||
}
|
||||
|
||||
/** 그리드 행 → ST00110001 저장/삭제 API 항목 */
|
||||
@@ -481,12 +478,12 @@ function buildSlurgeProcessingFacStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
|
||||
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
itslfQnt: toGridNumber(row.itslfQnt),
|
||||
otsdInflwQnt: toGridNumber(row.otsdInflwQnt),
|
||||
transfTmplntNm: String(row.transfTmplntNm ?? "").trim(),
|
||||
transfTmplntNm: nullableTrimmedString(row.transfTmplntNm),
|
||||
transfPrcsQnt: toGridNumber(row.transfPrcsQnt),
|
||||
srpFncRt: toGridNumber(row.srpFncRt),
|
||||
itslfTs1RclmQnt: toGridNumber(row.itslfTs1RclmQnt),
|
||||
@@ -495,31 +492,31 @@ function buildSlurgeProcessingFacStatusSaveItem(
|
||||
itslfTs1DryQnt: toGridNumber(row.itslfTs1DryQnt),
|
||||
itslfTs1FuelQnt: toGridNumber(row.itslfTs1FuelQnt),
|
||||
itslfTs2CmpstgQnt: toGridNumber(row.itslfTs2CmpstgQnt),
|
||||
cmpsPrcsFcltBzentyNm: String(row.cmpsPrcsFcltBzentyNm ?? "").trim(),
|
||||
cmpsPrcsFcltBzentyNm: nullableTrimmedString(row.cmpsPrcsFcltBzentyNm),
|
||||
incnrPrcsLfvlm: toGridNumber(row.incnrPrcsLfvlm),
|
||||
incnrPrcsPrdctRmtrlQnt: toGridNumber(row.incnrPrcsPrdctRmtrlQnt),
|
||||
incnrPrcsFmlyrQnt: toGridNumber(row.incnrPrcsFmlyrQnt),
|
||||
incnrPrcsFcltNm: String(row.incnrPrcsFcltNm ?? "").trim(),
|
||||
incnrPrcsFcltNm: nullableTrimmedString(row.incnrPrcsFcltNm),
|
||||
stbznPrcsLfvlm: toGridNumber(row.stbznPrcsLfvlm),
|
||||
stbznPrcsFmlyrQnt: toGridNumber(row.stbznPrcsFmlyrQnt),
|
||||
stbznPrcsFcltNm: String(row.stbznPrcsFcltNm ?? "").trim(),
|
||||
stbznPrcsFcltNm: nullableTrimmedString(row.stbznPrcsFcltNm),
|
||||
dryPrcsLfvlm: toGridNumber(row.dryPrcsLfvlm),
|
||||
dryPrcsIncnrQnt: toGridNumber(row.dryPrcsIncnrQnt),
|
||||
dryPrcsFuelQnt: toGridNumber(row.dryPrcsFuelQnt),
|
||||
dryPrcsPrdctRmtrlQnt: toGridNumber(row.dryPrcsPrdctRmtrlQnt),
|
||||
dryPrcsFmlyrQnt: toGridNumber(row.dryPrcsFmlyrQnt),
|
||||
dryPrcsCmpstgQnt: toGridNumber(row.dryPrcsCmpstgQnt),
|
||||
dryPrcsFcltNm: String(row.dryPrcsFcltNm ?? "").trim(),
|
||||
dryPrcsFcltNm: nullableTrimmedString(row.dryPrcsFcltNm),
|
||||
fuelPrcsIncnrQnt: toGridNumber(row.fuelPrcsIncnrQnt),
|
||||
fuelPrcsFuelQnt: toGridNumber(row.fuelPrcsFuelQnt),
|
||||
fuelPrcsFcltNm: String(row.fuelPrcsFcltNm ?? "").trim(),
|
||||
fuelPrcsFcltNm: nullableTrimmedString(row.fuelPrcsFcltNm),
|
||||
otsdCnsgnRclmQnt: toGridNumber(row.otsdCnsgnRclmQnt),
|
||||
otsdCnsgnIncnrQnt: toGridNumber(row.otsdCnsgnIncnrQnt),
|
||||
otsdCnsgnFuelPwplQnt: toGridNumber(row.otsdCnsgnFuelPwplQnt),
|
||||
otsdCnsgnPrdctRmtrlQnt: toGridNumber(row.otsdCnsgnPrdctRmtrlQnt),
|
||||
otsdCnsgnFmlyrQnt: toGridNumber(row.otsdCnsgnFmlyrQnt),
|
||||
otsdCnsgnCmpstgQnt: toGridNumber(row.otsdCnsgnCmpstgQnt),
|
||||
otsdCnsgnFcltNm: String(row.otsdCnsgnFcltNm ?? "").trim(),
|
||||
otsdCnsgnFcltNm: nullableTrimmedString(row.otsdCnsgnFcltNm),
|
||||
cparTs1Whol: toGridNumber(row.cparTs1Whol),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
@@ -534,10 +531,10 @@ function buildDigestorOperatingStatusSaveItem(
|
||||
const base = {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
|
||||
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
digstnEnYn: String(row.digstnEnYn ?? "").trim(),
|
||||
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
digstnEnYn: nullableTrimmedString(row.digstnEnYn),
|
||||
};
|
||||
|
||||
if (isDigestorOperatingRowDisabled(row)) {
|
||||
@@ -585,9 +582,9 @@ function buildSewageSlurgeProcessingFacStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
fcltNm: String(row.fcltNm ?? "").trim(),
|
||||
prcsMthExpln: String(row.prcsMthExpln ?? "").trim(),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
prcsMthExpln: nullableTrimmedString(row.prcsMthExpln),
|
||||
fcltCpct: toGridNumber(row.fcltCpct),
|
||||
anlPrcsQnt: toGridNumber(row.anlPrcsQnt),
|
||||
dayAvgOprtngHr: toGridNumber(row.dayAvgOprtngHr),
|
||||
@@ -605,9 +602,9 @@ function buildExcretaSlurgeProcessingStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
fcltNm: String(row.fcltNm ?? "").trim(),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
rcycQnt: toGridNumber(row.rcycQnt),
|
||||
olandLfvlm: toGridNumber(row.olandLfvlm),
|
||||
incnrQnt: toGridNumber(row.incnrQnt),
|
||||
@@ -615,7 +612,7 @@ function buildExcretaSlurgeProcessingStatusSaveItem(
|
||||
fuelQnt: toGridNumber(row.fuelQnt),
|
||||
etcQnt: toGridNumber(row.etcQnt),
|
||||
nondspsQnt: toGridNumber(row.nondspsQnt),
|
||||
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
|
||||
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ import {
|
||||
patchFooterVerificationByTab,
|
||||
patchVerificationFailedByTab,
|
||||
} from "@/components/util/input/verification-failed-flag";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
||||
@@ -364,10 +365,10 @@ function buildRegionalFactSubmitListFromGrid(
|
||||
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
|
||||
};
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
sggNm: String(d.sggNm ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
goalYr: String(d.goalYr ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
goalYr: nullableTrimmedString(d.goalYr),
|
||||
wholPplMtncPlanPrlg: formatNumber(d.wholPplMtncPlanPrlg, "wholPplMtncPlanPrlg"),
|
||||
wholPlanPrlg: formatNumber(d.wholPlanPrlg, "wholPlanPrlg"),
|
||||
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
|
||||
@@ -403,7 +404,7 @@ function buildRegionalFactSubmitListFromGrid(
|
||||
exlnOtflCnt: formatNumber(d.exlnOtflCnt, "exlnOtflCnt"),
|
||||
sewerLdgrEdpPrlg: formatNumber(d.sewerLdgrEdpPrlg, "sewerLdgrEdpPrlg"),
|
||||
sewerLdgrEdpRt: formatNumber(d.sewerLdgrEdpRt, "sewerLdgrEdpRt"),
|
||||
rmrk: (d.rmrk as string | null) ?? null,
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -1257,12 +1258,12 @@ const SewagePipeInp = () => {
|
||||
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
|
||||
};
|
||||
const submitList = currentData.map((d) => ({
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
sggNm: String(d.sggNm ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
fcltSn: String(d.fcltSn ?? ""),
|
||||
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ""),
|
||||
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
fcltSn: nullableTrimmedString(d.fcltSn),
|
||||
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
|
||||
prcsFcltCpct: formatNumber(d.prcsFcltCpct, "prcsFcltCpct"),
|
||||
prcsZoneArea: formatNumber(d.prcsZoneArea, "prcsZoneArea"),
|
||||
cbsysPrcsZoneArea: formatNumber(d.cbsysPrcsZoneArea, "cbsysPrcsZoneArea"),
|
||||
@@ -1284,7 +1285,7 @@ const SewagePipeInp = () => {
|
||||
cbsysBrchlnPrlg: formatNumber(d.cbsysBrchlnPrlg, "cbsysBrchlnPrlg"),
|
||||
exlnBrchlnPrlg: formatNumber(d.exlnBrchlnPrlg, "exlnBrchlnPrlg"),
|
||||
drtwBrchlnPrlg: formatNumber(d.drtwBrchlnPrlg, "drtwBrchlnPrlg"),
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
const requestData: SeweragePipeInputFactInstallStatusSubmitRequest = {
|
||||
...submitBase,
|
||||
@@ -1328,11 +1329,11 @@ const SewagePipeInp = () => {
|
||||
});
|
||||
}
|
||||
return {
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
pipeSeCd: String(d.pipeSeCd ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
|
||||
yearlyStatList,
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
||||
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
||||
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
|
||||
@@ -1366,7 +1367,7 @@ const SewagePipeInp = () => {
|
||||
return decimalPlaces > 0 ? parseFloat(num.toFixed(decimalPlaces)) : Math.round(num);
|
||||
};
|
||||
const submitList = currentData.map((d) => ({
|
||||
pipeSeCd: String(d.pipeSeCd ?? ""),
|
||||
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
|
||||
step1PdmtPrlg: formatNumber(d.step1PdmtPrlg, "step1PdmtPrlg"),
|
||||
step2PdmtPrlg: formatNumber(d.step2PdmtPrlg, "step2PdmtPrlg"),
|
||||
step3PdmtPrlg: formatNumber(d.step3PdmtPrlg, "step3PdmtPrlg"),
|
||||
@@ -1374,10 +1375,10 @@ const SewagePipeInp = () => {
|
||||
step5PdmtPrlg: formatNumber(d.step5PdmtPrlg, "step5PdmtPrlg"),
|
||||
sqrePdmtPrlg: formatNumber(d.sqrePdmtPrlg, "sqrePdmtPrlg"),
|
||||
etcPdmtPrlg: formatNumber(d.etcPdmtPrlg, "etcPdmtPrlg"),
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
pdmtByTsmWhol: formatNumber(d.pdmtByTsmWhol, "pdmtByTsmWhol"),
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
}));
|
||||
const requestData: SeweragePipeInputPipeDiameterStatusSubmitRequest = {
|
||||
...submitBase,
|
||||
@@ -1429,11 +1430,11 @@ const SewagePipeInp = () => {
|
||||
});
|
||||
}
|
||||
return {
|
||||
emphsMngSeCd: String(d.emphsMngSeCd ?? ""),
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
emphsMngSeCd: nullableTrimmedString(d.emphsMngSeCd),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
yearlyStats,
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
};
|
||||
});
|
||||
const requestData: SeweragePipeInputManholeStatusSubmitRequest = {
|
||||
@@ -1653,10 +1654,10 @@ const SewagePipeInp = () => {
|
||||
const userInfo = await getUserInfo();
|
||||
|
||||
const saveList = currentData.map((d) => ({
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
sggNm: String(d.sggNm ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
goalYr: String(d.goalYr ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
goalYr: nullableTrimmedString(d.goalYr),
|
||||
wholPplMtncPlanPrlg: formatNumber(d.wholPplMtncPlanPrlg, "wholPplMtncPlanPrlg"),
|
||||
wholPlanPrlg: formatNumber(d.wholPlanPrlg, "wholPlanPrlg"),
|
||||
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
|
||||
@@ -1692,7 +1693,7 @@ const SewagePipeInp = () => {
|
||||
exlnOtflCnt: formatNumber(d.exlnOtflCnt, "exlnOtflCnt"),
|
||||
sewerLdgrEdpPrlg: formatNumber(d.sewerLdgrEdpPrlg, "sewerLdgrEdpPrlg"),
|
||||
sewerLdgrEdpRt: formatNumber(d.sewerLdgrEdpRt, "sewerLdgrEdpRt"),
|
||||
rmrk: (d.rmrk as string | null) ?? null,
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
|
||||
const param: SeweragePipeInputRegionalFactStatusSaveRequest = {
|
||||
@@ -1745,12 +1746,12 @@ const SewagePipeInp = () => {
|
||||
const userInfo = await getUserInfo();
|
||||
|
||||
const saveList = currentData.map((d) => ({
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
sggNm: String(d.sggNm ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
fcltSn: String(d.fcltSn ?? ""),
|
||||
swtrmtFcltCd: String(d.swtrmtFcltCd ?? ""),
|
||||
swtrmtFcltNm: String(d.swtrmtFcltNm ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
fcltSn: nullableTrimmedString(d.fcltSn),
|
||||
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
|
||||
prcsFcltCpct: formatNumber(d.prcsFcltCpct, "prcsFcltCpct"),
|
||||
prcsZoneArea: formatNumber(d.prcsZoneArea, "prcsZoneArea"),
|
||||
cbsysPrcsZoneArea: formatNumber(d.cbsysPrcsZoneArea, "cbsysPrcsZoneArea"),
|
||||
@@ -1772,7 +1773,7 @@ const SewagePipeInp = () => {
|
||||
cbsysBrchlnPrlg: formatNumber(d.cbsysBrchlnPrlg, "cbsysBrchlnPrlg"),
|
||||
exlnBrchlnPrlg: formatNumber(d.exlnBrchlnPrlg, "exlnBrchlnPrlg"),
|
||||
drtwBrchlnPrlg: formatNumber(d.drtwBrchlnPrlg, "drtwBrchlnPrlg"),
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
|
||||
const param: SeweragePipeInputFactInstallStatusSaveRequest = {
|
||||
@@ -1847,11 +1848,11 @@ const SewagePipeInp = () => {
|
||||
});
|
||||
}
|
||||
return {
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
pipeSeCd: String(d.pipeSeCd ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
|
||||
yearlyStatList,
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
lyngPrlgWhol: formatNumber(d.lyngPrlg, "lyngPrlg"),
|
||||
dmltnPrlgWhol: formatNumber(d.dmltnPrlg, "dmltnPrlg"),
|
||||
pipeByPrstWhol: formatNumber(d.pipeByPrstWhol, "pipeByPrstWhol"),
|
||||
@@ -1907,7 +1908,7 @@ const SewagePipeInp = () => {
|
||||
};
|
||||
|
||||
const saveList = currentData.map((d) => ({
|
||||
pipeSeCd: String(d.pipeSeCd ?? ""),
|
||||
pipeSeCd: nullableTrimmedString(d.pipeSeCd),
|
||||
step1PdmtPrlg: formatNumber(d.step1PdmtPrlg, "step1PdmtPrlg"),
|
||||
step2PdmtPrlg: formatNumber(d.step2PdmtPrlg, "step2PdmtPrlg"),
|
||||
step3PdmtPrlg: formatNumber(d.step3PdmtPrlg, "step3PdmtPrlg"),
|
||||
@@ -1915,10 +1916,10 @@ const SewagePipeInp = () => {
|
||||
step5PdmtPrlg: formatNumber(d.step5PdmtPrlg, "step5PdmtPrlg"),
|
||||
sqrePdmtPrlg: formatNumber(d.sqrePdmtPrlg, "sqrePdmtPrlg"),
|
||||
etcPdmtPrlg: formatNumber(d.etcPdmtPrlg, "etcPdmtPrlg"),
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
pdmtByTsmWhol: formatNumber(d.pdmtByTsmWhol, "pdmtByTsmWhol"),
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
}));
|
||||
|
||||
const userInfo = await getUserInfo();
|
||||
@@ -1993,11 +1994,11 @@ const SewagePipeInp = () => {
|
||||
});
|
||||
}
|
||||
return {
|
||||
emphsMngSeCd: String(d.emphsMngSeCd ?? ""),
|
||||
admdstCd: String(d.admdstCd ?? ""),
|
||||
admdstNm: String(d.admdstNm ?? ""),
|
||||
emphsMngSeCd: nullableTrimmedString(d.emphsMngSeCd),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
yearlyStats,
|
||||
rmrk: String(d.rmrk ?? ""),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ import {
|
||||
patchVerificationFailedByTab,
|
||||
} from "@/components/util/input/verification-failed-flag";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
import { useStatisticsInputFocusStore } from "@/store/statistics-input-focus-store";
|
||||
import { useTabStore } from "@/store/tab-store";
|
||||
@@ -153,17 +154,6 @@ function tabRowDataExists(
|
||||
return Array.isArray(rows) && rows.length > 0;
|
||||
}
|
||||
|
||||
function normalizeGridString(value: unknown): string {
|
||||
if (value === null || value === undefined) return "";
|
||||
return typeof value === "string" ? value : String(value);
|
||||
}
|
||||
|
||||
function normalizeGridRmrk(value: unknown): string | null {
|
||||
if (value === null || value === undefined) return null;
|
||||
const s = typeof value === "string" ? value : String(value);
|
||||
return s.trim() === "" ? null : s;
|
||||
}
|
||||
|
||||
const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
|
||||
|
||||
async function waitForImrJobCompleted(
|
||||
@@ -217,9 +207,9 @@ function buildRepairRowList(
|
||||
const formatNumber = buildColumnFormatNumber(RepairStatusInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
mendngWhol: formatNumber(d.mendngWhol, "mendngWhol"),
|
||||
cbsysMendngPrlg: formatNumber(d.cbsysMendngPrlg, "cbsysMendngPrlg"),
|
||||
sprsysExlnPrlg: formatNumber(d.sprsysExlnPrlg, "sprsysExlnPrlg"),
|
||||
@@ -235,7 +225,7 @@ function buildRepairRowList(
|
||||
stofcbrCnt: formatNumber(d.stofcbrCnt, "stofcbrCnt"),
|
||||
otflCnt: formatNumber(d.otflCnt, "otflCnt"),
|
||||
cctvExmnPrlg: formatNumber(d.cctvExmnPrlg, "cctvExmnPrlg"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -245,9 +235,9 @@ function buildDredgingRowList(
|
||||
const formatNumber = buildColumnFormatNumber(PipeDredgingStatusInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
wholFcltPrlg: formatNumber(d.wholFcltPrlg, "wholFcltPrlg"),
|
||||
wholSwagePpl: formatNumber(d.wholSwagePpl, "wholSwagePpl"),
|
||||
cbsysPplPrlg: formatNumber(d.cbsysPplPrlg, "cbsysPplPrlg"),
|
||||
@@ -267,7 +257,7 @@ function buildDredgingRowList(
|
||||
oceanEmsnQnt: formatNumber(d.oceanEmsnQnt, "oceanEmsnQnt"),
|
||||
rcycQnt: formatNumber(d.rcycQnt, "rcycQnt"),
|
||||
etcQnt: formatNumber(d.etcQnt, "etcQnt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsInputSewageReservoirPumpApi } from "@/entities/statistics/api/input/statistics-input-sewage-reservoir-pump-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -264,13 +265,6 @@ function mapSewageReservoirListToGridRows(
|
||||
});
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -290,13 +284,13 @@ function toPumpDmtrExpln(value: string | number | null | undefined): number {
|
||||
function resolveSewageReservoirAdmdst(
|
||||
sggNm: string,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const trimmed = sggNm.trim();
|
||||
const matched = sggOptions.find((s) => s.gugun === trimmed);
|
||||
if (matched) {
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
return { admdstCd: "", admdstNm: trimmed };
|
||||
return { admdstCd: null, admdstNm: nullableTrimmedString(trimmed) };
|
||||
}
|
||||
|
||||
/** 그리드 행 → ST00040001 저장/삭제 API 항목 */
|
||||
@@ -308,19 +302,18 @@ function buildSewageReservoirSaveItem(
|
||||
String(row.sggNm ?? ""),
|
||||
sggOptions,
|
||||
);
|
||||
const fcltSn = String(row.fcltSn ?? "").trim();
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
// 항목 추가 직후 저장(신규) — 그리드 fcltSn 없음 → API에는 "1"
|
||||
fcltSn: fcltSn,
|
||||
fcltNm: String(row.fcltNm ?? ""),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? ""),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
|
||||
planDesignFreqCnt: toGridNumber(row.planDesignFreqCnt),
|
||||
fldngPrvtnYn: normalizeOxYnValue(row.fldngPrvtnYn),
|
||||
wqPlltnMtgtYn: normalizeOxYnValue(row.wqPlltnMtgtYn),
|
||||
rtlztnUsgYn: normalizeOxYnValue(row.rtlztnUsgYn),
|
||||
fldngPrvtnYn: nullableTrimmedString(normalizeOxYnValue(row.fldngPrvtnYn)),
|
||||
wqPlltnMtgtYn: nullableTrimmedString(normalizeOxYnValue(row.wqPlltnMtgtYn)),
|
||||
rtlztnUsgYn: nullableTrimmedString(normalizeOxYnValue(row.rtlztnUsgYn)),
|
||||
fcltStrctCn: nullableTrimmedString(row.fcltStrctCn),
|
||||
wtrStrgZoneArea: toGridNumber(row.wtrStrgZoneArea),
|
||||
impdFcltCpct: toGridNumber(row.impdFcltCpct),
|
||||
@@ -337,17 +330,17 @@ function buildSewageReservoirSaveItem(
|
||||
pumpFcltN3PerPpqty: toGridNumber(row.pumpFcltN3PerPpqty),
|
||||
pumpFcltN3PumpCnt: toGridNumber(row.pumpFcltN3PumpCnt),
|
||||
pumpFcltN3RsrvPumpCnt: toGridNumber(row.pumpFcltN3RsrvPumpCnt),
|
||||
prcsgFcltYn: String(row.prcsgFcltYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
|
||||
ddrztnEqpmYn: String(row.ddrztnEqpmYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
|
||||
oslfEtgtYn: String(row.oslfEtgtYn ? (row.prcsgFcltYn === '무' ? 'N' : 'Y') : ""),
|
||||
prcsgFcltYn: row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
ddrztnEqpmYn: row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
oslfEtgtYn: row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
mltvMthCn: nullableTrimmedString(row.mltvMthCn),
|
||||
impdMthCn: nullableTrimmedString(row.impdMthCn),
|
||||
impdPrcsMthdCn: nullableTrimmedString(row.impdPrcsMthdCn),
|
||||
dschgWtrsExpln: String(row.dschgWtrsExpln ?? ""),
|
||||
dschgWtrsExpln: nullableTrimmedString(row.dschgWtrsExpln),
|
||||
prcptnLastDspsQnt: toGridNumber(row.prcptnLastDspsQnt),
|
||||
ctmnLastDspsQnt: toGridNumber(row.ctmnLastDspsQnt),
|
||||
prcptnLastDspsMthdExpln: String(row.prcptnLastDspsMthdExpln ?? ""),
|
||||
ctmnLastDspsMthdExpln: String(row.ctmnLastDspsMthdExpln ?? ""),
|
||||
prcptnLastDspsMthdExpln: nullableTrimmedString(row.prcptnLastDspsMthdExpln),
|
||||
ctmnLastDspsMthdExpln: nullableTrimmedString(row.ctmnLastDspsMthdExpln),
|
||||
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
|
||||
grssMltvQnt: toGridNumber(row.grssMltvQnt),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
@@ -363,18 +356,17 @@ function buildRainfallPumpStationSaveItem(
|
||||
String(row.sggNm ?? ""),
|
||||
sggOptions,
|
||||
);
|
||||
const fcltSn = String(row.fcltSn ?? "").trim();
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: fcltSn,
|
||||
fcltNm: String(row.fcltNm ?? ""),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? ""),
|
||||
fcltyKndCn: String(row.fcltyKndCn ?? ""),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
fcltyKndCn: nullableTrimmedString(row.fcltyKndCn),
|
||||
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
|
||||
planDesignFreqCnt: toGridNumber(row.planDesignFreqCnt),
|
||||
wtrStrgZoneArea: toGridNumber(row.wtrStrgZoneArea),
|
||||
rsvrYn: String(row.rsvrYn ? (row.rsvrYn === "무" ? "N" : "Y") : ""),
|
||||
rsvrYn: row.rsvrYn ? (row.rsvrYn === "무" ? "N" : "Y") : null,
|
||||
rsvrImpndQnt: toGridNumber(row.rsvrImpndQnt),
|
||||
abstnRgnImpdQnt: toGridNumber(row.abstnRgnImpdQnt),
|
||||
grssPpqty: toGridNumber(row.grssPpqty),
|
||||
@@ -390,14 +382,14 @@ function buildRainfallPumpStationSaveItem(
|
||||
pumpFcltN3PerPpqty: toGridNumber(row.pumpFcltN3PerPpqty),
|
||||
pumpFcltN3PumpCnt: toGridNumber(row.pumpFcltN3PumpCnt),
|
||||
pumpFcltN3RsrvPumpCnt: toGridNumber(row.pumpFcltN3RsrvPumpCnt),
|
||||
prcsgFcltYn: String(row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
|
||||
ddrztnEqpmYn: String(row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
|
||||
oslfEtgtYn: String(row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : ""),
|
||||
dschgWtrsExpln: String(row.dschgWtrsExpln ?? ""),
|
||||
prcsgFcltYn: row.prcsgFcltYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
ddrztnEqpmYn: row.ddrztnEqpmYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
oslfEtgtYn: row.oslfEtgtYn ? (row.prcsgFcltYn === "무" ? "N" : "Y") : null,
|
||||
dschgWtrsExpln: nullableTrimmedString(row.dschgWtrsExpln),
|
||||
prcptnLastDspsQnt: toGridNumber(row.prcptnLastDspsQnt),
|
||||
ctmnLastDspsQnt: toGridNumber(row.ctmnLastDspsQnt),
|
||||
prcptnLastDspsMthdExpln: String(row.prcptnLastDspsMthdExpln ?? ""),
|
||||
ctmnLastDspsMthdExpln: String(row.ctmnLastDspsMthdExpln ?? ""),
|
||||
prcptnLastDspsMthdExpln: nullableTrimmedString(row.prcptnLastDspsMthdExpln),
|
||||
ctmnLastDspsMthdExpln: nullableTrimmedString(row.ctmnLastDspsMthdExpln),
|
||||
oprtngDayCnt: toGridNumber(row.oprtngDayCnt),
|
||||
grssMltvQnt: toGridNumber(row.grssMltvQnt),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
|
||||
@@ -67,6 +67,7 @@ import {
|
||||
patchVerificationFailedByTab,
|
||||
} from "@/components/util/input/verification-failed-flag";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
import { useTabStore } from "@/store/tab-store";
|
||||
|
||||
@@ -168,17 +169,6 @@ function mapRegionalListToGridRows<
|
||||
});
|
||||
}
|
||||
|
||||
function normalizeGridString(value: unknown): string {
|
||||
if (value === null || value === undefined) return "";
|
||||
return typeof value === "string" ? value : String(value);
|
||||
}
|
||||
|
||||
function normalizeGridRmrk(value: unknown): string | null {
|
||||
if (value === null || value === undefined) return null;
|
||||
const s = typeof value === "string" ? value : String(value);
|
||||
return s.trim() === "" ? null : s;
|
||||
}
|
||||
|
||||
function buildColumnFormatNumber(columns: { fieldName?: string; dataFormat?: string }[]) {
|
||||
const columnFormatMap = new Map<string, string>();
|
||||
columns.forEach((col) => {
|
||||
@@ -214,9 +204,9 @@ function buildSewerageFinanceSettleSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(SewerageFinanceSettleInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
cnterGovSprtAmt: formatNumber(d.cnterGovSprtAmt, "cnterGovSprtAmt"),
|
||||
mctpvLcexpAmt: formatNumber(d.mctpvLcexpAmt, "mctpvLcexpAmt"),
|
||||
wareaSggLclAmt: formatNumber(d.wareaSggLclAmt, "wareaSggLclAmt"),
|
||||
@@ -240,7 +230,7 @@ function buildSewerageFinanceSettleSaveList(
|
||||
etcAcdntCrfwAmt: formatNumber(d.etcAcdntCrfwAmt, "etcAcdntCrfwAmt"),
|
||||
etcNrcpAmt: formatNumber(d.etcNrcpAmt, "etcNrcpAmt"),
|
||||
etcAmt: formatNumber(d.etcAmt, "etcAmt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
fnnByWholPjtcoAmt: formatNumber(d.fnnByWholPjtcoAmt, "fnnByWholPjtcoAmt"),
|
||||
usgByWholPjtcoAmt: formatNumber(d.usgByWholPjtcoAmt, "usgByWholPjtcoAmt"),
|
||||
tmplntWholAmt: formatNumber(d.tmplntWholAmt, "tmplntWholAmt"),
|
||||
@@ -256,13 +246,13 @@ function buildSewerageChargeSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(SewerageChargeInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
anlLevyQnt: formatNumber(d.anlLevyQnt, "anlLevyQnt"),
|
||||
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
|
||||
grssPrmcoAmt: formatNumber(d.grssPrmcoAmt, "grssPrmcoAmt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
avgUntprcAmt: formatNumber(d.avgUntprcAmt, "avgUntprcAmt"),
|
||||
grssUnitPrmcoAmt: formatNumber(d.grssUnitPrmcoAmt, "grssUnitPrmcoAmt"),
|
||||
rlztnRt: formatNumber(d.rlztnRt, "rlztnRt"),
|
||||
@@ -275,9 +265,9 @@ function buildSewerageUsageFeeSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(SewerageUsageFeeInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
hshusLevyAmt: formatNumber(d.hshusLevyAmt, "hshusLevyAmt"),
|
||||
hshusLevyQnt: formatNumber(d.hshusLevyQnt, "hshusLevyQnt"),
|
||||
hshusUntprcAmt: formatNumber(d.hshusUntprcAmt, "hshusUntprcAmt"),
|
||||
@@ -299,7 +289,7 @@ function buildSewerageUsageFeeSaveList(
|
||||
etcLevyAmt: formatNumber(d.etcLevyAmt, "etcLevyAmt"),
|
||||
etcLevyQnt: formatNumber(d.etcLevyQnt, "etcLevyQnt"),
|
||||
etcLevyUntprcAmt: formatNumber(d.etcLevyUntprcAmt, "etcLevyUntprcAmt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
|
||||
levyQnt: formatNumber(d.levyQnt, "levyQnt"),
|
||||
}));
|
||||
@@ -311,16 +301,16 @@ function buildCauserBurdenSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(CauserBurdenInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
levyEvntcsCnt: formatNumber(d.levyEvntcsCnt, "levyEvntcsCnt"),
|
||||
levyAmt: formatNumber(d.levyAmt, "levyAmt"),
|
||||
mltvEqpmEvntcsCnt: formatNumber(d.mltvEqpmEvntcsCnt, "mltvEqpmEvntcsCnt"),
|
||||
mltvEqpmAmt: formatNumber(d.mltvEqpmAmt, "mltvEqpmAmt"),
|
||||
othrCstrnOthrActrCnt: formatNumber(d.othrCstrnOthrActrCnt, "othrCstrnOthrActrCnt"),
|
||||
othrCstrnOthrActrAmt: formatNumber(d.othrCstrnOthrActrAmt, "othrCstrnOthrActrAmt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
trgtByWholClctnAmt: formatNumber(d.trgtByWholClctnAmt, "trgtByWholClctnAmt"),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ import { SeweragePenetrationRateInpColumn } from "@/components/util/column/input
|
||||
import { getFooterSummary } from "@/components/util/grid/footerSummary";
|
||||
import { toGridRows } from "@/components/util/grid/gridFunction";
|
||||
import { toExcelExportSearchContextFromSearchForm } from "@/components/util/gridExcelExport";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { isVerificationFailedFromCommonInfo } from "@/components/util/input/verification-failed-flag";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
@@ -130,14 +131,6 @@ function getSewerageSupplyRateParams(
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeGridString(value: unknown): string | null {
|
||||
if (typeof value !== "string") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return value.trim() === "" ? null : value;
|
||||
}
|
||||
|
||||
// 하수도 통계 관리 > 01. 하수도 보급률
|
||||
const SeweragePenetrationRateInp = () => {
|
||||
const { setMessage: alert } = useAlertStore((state) => state);
|
||||
@@ -488,12 +481,12 @@ const SeweragePenetrationRateInp = () => {
|
||||
};
|
||||
|
||||
const convertedData: SewerageSupplyRateSaveItem[] = currentData.map((d) => ({
|
||||
sggNm: normalizeGridString(d.sggNm),
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
trbtrNm: normalizeGridString(d.trbtrNm),
|
||||
sggNm: nullableTrimmedString(d.sggNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
trbtrNm: nullableTrimmedString(d.trbtrNm),
|
||||
spcCtpnRgnCn:
|
||||
d.spcCtpnRgnCn === '해당없음' ? null : normalizeGridString(d.spcCtpnRgnCn),
|
||||
d.spcCtpnRgnCn === '해당없음' ? null : nullableTrimmedString(d.spcCtpnRgnCn),
|
||||
ts1SwtrmtPpltnCnt: formatNumber(d.ts1SwtrmtPpltnCnt, 'ts1SwtrmtPpltnCnt'),
|
||||
ts2SwtrmtPpltnCnt: formatNumber(d.ts2SwtrmtPpltnCnt, 'ts2SwtrmtPpltnCnt'),
|
||||
ts3SwtrmtPpltnCnt: formatNumber(d.ts3SwtrmtPpltnCnt, 'ts3SwtrmtPpltnCnt'),
|
||||
@@ -506,7 +499,7 @@ const SeweragePenetrationRateInp = () => {
|
||||
drtwPrcsPpltnCnt: formatNumber(d.drtwPrcsPpltnCnt, 'drtwPrcsPpltnCnt'),
|
||||
spctnkPpltnCnt: formatNumber(d.spctnkPpltnCnt, 'spctnkPpltnCnt'),
|
||||
staaExcpArea: formatNumber(d.staaExcpArea, 'staaExcpArea'),
|
||||
rmrk: normalizeGridString(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
wholPpltnCnt: formatNumber(d.wholPpltnCnt, 'wholPpltnCnt'),
|
||||
wholArea: formatNumber(d.wholArea, 'wholArea'),
|
||||
wholSwtrmtPpltnCnt: formatNumber(d.wholSwtrmtPpltnCnt, 'wholSwtrmtPpltnCnt'),
|
||||
@@ -671,14 +664,14 @@ const SeweragePenetrationRateInp = () => {
|
||||
|
||||
const convertedData: SewerageSupplyRateSaveItem[] = currentData.map((d) => ({
|
||||
// 행정구역
|
||||
sggNm: normalizeGridString(d.sggNm), // 시군구
|
||||
admdstCd: normalizeGridString(d.admdstCd), // 행정코드
|
||||
admdstNm: normalizeGridString(d.admdstNm), // 행정구역명
|
||||
trbtrNm: normalizeGridString(d.trbtrNm), // 지류
|
||||
sggNm: nullableTrimmedString(d.sggNm), // 시군구
|
||||
admdstCd: nullableTrimmedString(d.admdstCd), // 행정코드
|
||||
admdstNm: nullableTrimmedString(d.admdstNm), // 행정구역명
|
||||
trbtrNm: nullableTrimmedString(d.trbtrNm), // 지류
|
||||
spcCtpnRgnCn:
|
||||
d.spcCtpnRgnCn === '해당없음'
|
||||
? null
|
||||
: normalizeGridString(d.spcCtpnRgnCn), // 특별대책지역
|
||||
: nullableTrimmedString(d.spcCtpnRgnCn), // 특별대책지역
|
||||
// 공공하수처리인구(명) - 물리적/생물학적/고도처리
|
||||
ts1SwtrmtPpltnCnt: formatNumber(d.ts1SwtrmtPpltnCnt, 'ts1SwtrmtPpltnCnt'), // 물리적처리
|
||||
ts2SwtrmtPpltnCnt: formatNumber(d.ts2SwtrmtPpltnCnt, 'ts2SwtrmtPpltnCnt'), // 생물학적처리
|
||||
@@ -694,7 +687,7 @@ const SeweragePenetrationRateInp = () => {
|
||||
drtwPrcsPpltnCnt: formatNumber(d.drtwPrcsPpltnCnt, 'drtwPrcsPpltnCnt'), // 오수처리인구
|
||||
spctnkPpltnCnt: formatNumber(d.spctnkPpltnCnt, 'spctnkPpltnCnt'), // 정화조인구
|
||||
staaExcpArea: formatNumber(d.staaExcpArea, 'staaExcpArea'), // 하수처리구역 외 면적(㎢)
|
||||
rmrk: normalizeGridString(d.rmrk), // 비고
|
||||
rmrk: nullableTrimmedString(d.rmrk), // 비고
|
||||
// 합계·소계(계산필드 저장용)
|
||||
wholPpltnCnt: formatNumber(d.wholPpltnCnt, 'wholPpltnCnt'), // 총인구(명)
|
||||
wholArea: formatNumber(d.wholArea, 'wholArea'), // 총면적(㎢)
|
||||
|
||||
@@ -56,6 +56,7 @@ import {
|
||||
patchVerificationFailedByTab,
|
||||
} from "@/components/util/input/verification-failed-flag";
|
||||
import type { VerificationResultLikeMap } from "@/components/util/input/verification-result-display";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { useAdminStore } from "@/store/admin-store";
|
||||
import { useTabStore } from "@/store/tab-store";
|
||||
|
||||
@@ -172,17 +173,6 @@ function mapServiceLevelListToGridRows<
|
||||
});
|
||||
}
|
||||
|
||||
function normalizeGridString(value: unknown): string {
|
||||
if (value === null || value === undefined) return "";
|
||||
return typeof value === "string" ? value : String(value);
|
||||
}
|
||||
|
||||
function normalizeGridRmrk(value: unknown): string | null {
|
||||
if (value === null || value === undefined) return null;
|
||||
const s = typeof value === "string" ? value : String(value);
|
||||
return s.trim() === "" ? null : s;
|
||||
}
|
||||
|
||||
function buildColumnFormatNumber(
|
||||
columns: { fieldName?: string; dataFormat?: string }[],
|
||||
) {
|
||||
@@ -211,8 +201,8 @@ function buildComplaintSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(ComplaintInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
swtrmtPpltnCnt: formatNumber(d.swtrmtPpltnCnt, "swtrmtPpltnCnt"),
|
||||
dschgWqCnt: formatNumber(d.dschgWqCnt, "dschgWqCnt"),
|
||||
odorCnt: formatNumber(d.odorCnt, "odorCnt"),
|
||||
@@ -221,7 +211,7 @@ function buildComplaintSaveList(
|
||||
swagePplCnt: formatNumber(d.swagePplCnt, "swagePplCnt"),
|
||||
sewerCrgAmt: formatNumber(d.sewerCrgAmt, "sewerCrgAmt"),
|
||||
etcCnt: formatNumber(d.etcCnt, "etcCnt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
whol: formatNumber(d.whol, "whol"),
|
||||
crtrPpltnCvlcptEvntcsCnt: formatNumber(
|
||||
d.crtrPpltnCvlcptEvntcsCnt,
|
||||
@@ -236,11 +226,11 @@ function buildResidentFriendlyFactSaveList(
|
||||
const formatNumber = buildColumnFormatNumber(ResidentFriendlyFactInpColumn.columns);
|
||||
|
||||
return currentData.map((d) => ({
|
||||
admdstCd: normalizeGridString(d.admdstCd),
|
||||
admdstNm: normalizeGridString(d.admdstNm),
|
||||
swtrmtFcltCd: normalizeGridString(d.swtrmtFcltCd),
|
||||
swtrmtFcltNm: normalizeGridString(d.swtrmtFcltNm),
|
||||
fcltSn: normalizeGridString(d.fcltSn),
|
||||
admdstCd: nullableTrimmedString(d.admdstCd),
|
||||
admdstNm: nullableTrimmedString(d.admdstNm),
|
||||
swtrmtFcltCd: nullableTrimmedString(d.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(d.swtrmtFcltNm),
|
||||
fcltSn: nullableTrimmedString(d.fcltSn),
|
||||
tmplntArea: formatNumber(d.tmplntArea, "tmplntArea"),
|
||||
brkFcltArea: formatNumber(d.brkFcltArea, "brkFcltArea"),
|
||||
childFrshpSpacArea: formatNumber(d.childFrshpSpacArea, "childFrshpSpacArea"),
|
||||
@@ -250,7 +240,7 @@ function buildResidentFriendlyFactSaveList(
|
||||
eduMultiFcltArea: formatNumber(d.eduMultiFcltArea, "eduMultiFcltArea"),
|
||||
wtlndMakeArea: formatNumber(d.wtlndMakeArea, "wtlndMakeArea"),
|
||||
etcCnt: formatNumber(d.etcCnt, "etcCnt"),
|
||||
rmrk: normalizeGridRmrk(d.rmrk),
|
||||
rmrk: nullableTrimmedString(d.rmrk),
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import { useAlertStore, useGlobalProgressStore, useStatisticsInputToolbarGroupGa
|
||||
import { STATISTICS_INPUT_URL_PATH } from "@/shared/lib/stats-cd-input-navigation";
|
||||
import { useStatisticsInputPendingNavigation } from "@/shared/lib/use-statistics-input-pending-navigation";
|
||||
import { ConfirmDialog } from "@/shared/ui/confirm-dialog";
|
||||
import { nullableTrimmedString } from "@/components/util/input/nullableString";
|
||||
import { statisticsInputSewSupplyRateApi } from "@/entities/statistics/api/input/statistics-input-sew-supply-rate-service";
|
||||
import { statisticsInputWaterReuseApi } from "@/entities/statistics/api/input/statistics-input-water-reuse-service";
|
||||
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
||||
@@ -235,13 +236,6 @@ function buildSggNmColumn(
|
||||
};
|
||||
}
|
||||
|
||||
function nullableTrimmedString(
|
||||
value: string | number | null | undefined,
|
||||
): string | null {
|
||||
const s = String(value ?? "").trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
|
||||
function toGridNumber(value: string | number | null | undefined): number {
|
||||
const n = Number(value);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
@@ -250,9 +244,9 @@ function toGridNumber(value: string | number | null | undefined): number {
|
||||
function resolveArticleAdmdst(
|
||||
row: Record<string, string | number>,
|
||||
sggOptions: Sgg[],
|
||||
): { admdstCd: string; admdstNm: string } {
|
||||
const existingCd = String(row.admdstCd ?? "").trim();
|
||||
const existingNm = String(row.admdstNm ?? "").trim();
|
||||
): { admdstCd: string | null; admdstNm: string | null } {
|
||||
const existingCd = nullableTrimmedString(row.admdstCd);
|
||||
const existingNm = nullableTrimmedString(row.admdstNm);
|
||||
if (existingCd && existingNm) {
|
||||
return { admdstCd: existingCd, admdstNm: existingNm };
|
||||
}
|
||||
@@ -261,7 +255,10 @@ function resolveArticleAdmdst(
|
||||
if (matched) {
|
||||
return { admdstCd: matched.bsnmCd, admdstNm: matched.gugun };
|
||||
}
|
||||
return { admdstCd: existingCd, admdstNm: existingNm || sggNm };
|
||||
return {
|
||||
admdstCd: existingCd,
|
||||
admdstNm: existingNm ?? nullableTrimmedString(sggNm),
|
||||
};
|
||||
}
|
||||
|
||||
function getArticleRowSnField(tabKey: string): "fcltSn" | "bplcSn" | null {
|
||||
@@ -297,11 +294,11 @@ function buildRecycledWaterStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
fcltNm: String(row.fcltNm ?? "").trim(),
|
||||
bldgSeCn: String(row.bldgSeCn ?? "").trim(),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
|
||||
lglTrgtYn: String(row.lglTrgtYn ?? "").trim(),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
bldgSeCn: nullableTrimmedString(row.bldgSeCn),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
lglTrgtYn: nullableTrimmedString(row.lglTrgtYn),
|
||||
cmptnStrtYmd: toCompactYmdOrNull(row.cmptnStrtYmd),
|
||||
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
|
||||
archWholArea: toGridNumber(row.archWholArea),
|
||||
@@ -309,7 +306,7 @@ function buildRecycledWaterStatusSaveItem(
|
||||
wtrUseQnt: toGridNumber(row.wtrUseQnt),
|
||||
ruswtrUtztnQnt: toGridNumber(row.ruswtrUtztnQnt),
|
||||
sbstCntUtztnQnt: toGridNumber(row.sbstCntUtztnQnt),
|
||||
mnUsgCn: String(row.mnUsgCn ?? "").trim(),
|
||||
mnUsgCn: nullableTrimmedString(row.mnUsgCn),
|
||||
ruswtrOperAmt: toGridNumber(row.ruswtrOperAmt),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
@@ -323,18 +320,18 @@ function buildRainFallUtilFactStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
fcltNm: String(row.fcltNm ?? "").trim(),
|
||||
bdstTypCn: String(row.bdstTypCn ?? "").trim(),
|
||||
fcltPstnCn: String(row.fcltPstnCn ?? "").trim(),
|
||||
lglTrgtYn: String(row.lglTrgtYn ?? "").trim(),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
fcltNm: nullableTrimmedString(row.fcltNm),
|
||||
bdstTypCn: nullableTrimmedString(row.bdstTypCn),
|
||||
fcltPstnCn: nullableTrimmedString(row.fcltPstnCn),
|
||||
lglTrgtYn: nullableTrimmedString(row.lglTrgtYn),
|
||||
cmptYmd: toCompactYmdOrNull(row.cmptYmd),
|
||||
instlAmt: toGridNumber(row.instlAmt),
|
||||
rcptMynCn: String(row.rcptMynCn ?? "").trim(),
|
||||
filtrPrcsFcltYnExpln: String(row.filtrPrcsFcltYnExpln ?? "").trim(),
|
||||
rcptMynCn: nullableTrimmedString(row.rcptMynCn),
|
||||
filtrPrcsFcltYnExpln: nullableTrimmedString(row.filtrPrcsFcltYnExpln),
|
||||
impdCpct: toGridNumber(row.impdCpct),
|
||||
anlUseQnt: toGridNumber(row.anlUseQnt),
|
||||
exlnUtlzUsgExpln: String(row.exlnUtlzUsgExpln ?? "").trim(),
|
||||
exlnUtlzUsgExpln: nullableTrimmedString(row.exlnUtlzUsgExpln),
|
||||
anlOperAmt: toGridNumber(row.anlOperAmt),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
@@ -348,10 +345,10 @@ function buildTreatWaterReuseDesignConstStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
bplcSn: String(row.bplcSn ?? "").trim(),
|
||||
bplcNm: String(row.bplcNm ?? "").trim(),
|
||||
rprsvNm: String(row.rprsvNm ?? "").trim(),
|
||||
bplcPstnCn: String(row.bplcPstnCn ?? "").trim(),
|
||||
bplcSn: nullableTrimmedString(row.bplcSn),
|
||||
bplcNm: nullableTrimmedString(row.bplcNm),
|
||||
rprsvNm: nullableTrimmedString(row.rprsvNm),
|
||||
bplcPstnCn: nullableTrimmedString(row.bplcPstnCn),
|
||||
coRegYmd: toCompactYmdOrNull(row.coRegYmd),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
@@ -365,10 +362,10 @@ function buildTreatWaterReuseBusinessApprStatusSaveItem(
|
||||
return {
|
||||
admdstCd,
|
||||
admdstNm,
|
||||
bplcSn: String(row.bplcSn ?? "").trim(),
|
||||
bplcNm: String(row.bplcNm ?? "").trim(),
|
||||
rprsvNm: String(row.rprsvNm ?? "").trim(),
|
||||
bplcPstnCn: String(row.bplcPstnCn ?? "").trim(),
|
||||
bplcSn: nullableTrimmedString(row.bplcSn),
|
||||
bplcNm: nullableTrimmedString(row.bplcNm),
|
||||
rprsvNm: nullableTrimmedString(row.rprsvNm),
|
||||
bplcPstnCn: nullableTrimmedString(row.bplcPstnCn),
|
||||
coRegYmd: toCompactYmdOrNull(row.coRegYmd),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
};
|
||||
@@ -378,18 +375,18 @@ function buildPublicSewageTreatWaterReuseSaveItem(
|
||||
row: Record<string, string | number>,
|
||||
): PublicSewageTreatWaterReuseSaveItem {
|
||||
return {
|
||||
admdstCd: String(row.admdstCd ?? "").trim(),
|
||||
admdstNm: String(row.admdstNm ?? row.sggNm ?? "").trim(),
|
||||
fcltSn: String(row.fcltSn ?? "").trim(),
|
||||
swtrmtFcltCd: String(row.swtrmtFcltCd ?? "").trim(),
|
||||
swtrmtFcltNm: String(row.swtrmtFcltNm ?? "").trim(),
|
||||
admdstCd: nullableTrimmedString(row.admdstCd),
|
||||
admdstNm: nullableTrimmedString(row.admdstNm ?? row.sggNm),
|
||||
fcltSn: nullableTrimmedString(row.fcltSn),
|
||||
swtrmtFcltCd: nullableTrimmedString(row.swtrmtFcltCd),
|
||||
swtrmtFcltNm: nullableTrimmedString(row.swtrmtFcltNm),
|
||||
wholPrcsQnt: toGridNumber(row.wholPrcsQnt),
|
||||
lglYn: String(row.lglYn ?? "").trim(),
|
||||
instlYn: String(row.instlYn ?? "").trim(),
|
||||
lglYn: nullableTrimmedString(row.lglYn),
|
||||
instlYn: nullableTrimmedString(row.instlYn),
|
||||
oprtngStrtYmd: toCompactYmdOrNull(row.oprtngStrtYmd),
|
||||
instlAprvYmd: toCompactYmdOrNull(row.instlAprvYmd),
|
||||
rprcsFcltCpct: toGridNumber(row.rprcsFcltCpct),
|
||||
mtcnsNm: String(row.mtcnsNm ?? "").trim(),
|
||||
mtcnsNm: nullableTrimmedString(row.mtcnsNm),
|
||||
ruswtPplLen: toGridNumber(row.ruswtPplLen),
|
||||
ruswtPumpLen: toGridNumber(row.ruswtPumpLen),
|
||||
rmrk: nullableTrimmedString(row.rmrk),
|
||||
|
||||
@@ -14,12 +14,12 @@ import { CodeApi, CodeSelect } from "@/entities/code";
|
||||
import {
|
||||
type ApproveRequest,
|
||||
type RejectRequest,
|
||||
type ReportStatusResponseDto,
|
||||
statisticsApprovalApi,
|
||||
type StatisticsVerificationFilterState,
|
||||
statisticsVerificationReportColumnInfo,
|
||||
statisticsVerificationResultColumnInfo,
|
||||
type StatisticsVerificationSubFilterState,
|
||||
type StatsInputStatusList,
|
||||
useSggList,
|
||||
useSidoList,
|
||||
useStatsVrfcRptData,
|
||||
@@ -72,8 +72,8 @@ const getYearOptions = () => {
|
||||
};
|
||||
|
||||
function isSameStatsInputStatusRow(
|
||||
a: StatsInputStatusList,
|
||||
b: StatsInputStatusList,
|
||||
a: ReportStatusResponseDto,
|
||||
b: ReportStatusResponseDto,
|
||||
): boolean {
|
||||
return (
|
||||
a.ctpvNm === b.ctpvNm && a.sggNm === b.sggNm && a.statsCd === b.statsCd
|
||||
@@ -132,11 +132,12 @@ const DEFAULT_FILTERS: StatisticsVerificationFilterState = {
|
||||
statsYr: String(dayjs().year() - 1),
|
||||
sewerBzmnCd: null,
|
||||
statsCd: null,
|
||||
laeSbmsnSttsCd: "3",
|
||||
pbcpSbmsnSttsCd: "3",
|
||||
};
|
||||
|
||||
const DEFAULT_SUB_FILTERS: StatisticsVerificationSubFilterState = {
|
||||
...DEFAULT_FILTERS,
|
||||
laeSbmsnSttsCd: "3",
|
||||
prcsYnList: "1,2",
|
||||
rejectCode: "0",
|
||||
pbcpAprvYn: "N",
|
||||
@@ -153,6 +154,13 @@ const REJECT_STATUS_OPTIONS = [
|
||||
{ label: "공단반려", value: "2" },
|
||||
];
|
||||
|
||||
const PBCP_SBMSN_STTS_OPTIONS = [
|
||||
{ label: "미작성", value: "0" },
|
||||
{ label: "작성중", value: "1" },
|
||||
{ label: "승인", value: "3" },
|
||||
{ label: "반려", value: "4" },
|
||||
];
|
||||
|
||||
function StatisticsVerificationReport() {
|
||||
const queryClient = useQueryClient();
|
||||
const userInfo = useUserStore((state) => state.userInfo);
|
||||
@@ -163,7 +171,7 @@ function StatisticsVerificationReport() {
|
||||
const [subFilters, setSubFilters] =
|
||||
useState<StatisticsVerificationSubFilterState>(DEFAULT_SUB_FILTERS);
|
||||
const [selectedReportRows, setSelectedReportRows] = useState<
|
||||
StatsInputStatusList[]
|
||||
ReportStatusResponseDto[]
|
||||
>([]);
|
||||
const [selectedResultRows, setSelectedResultRows] = useState<
|
||||
VerifyResultItem[]
|
||||
@@ -227,9 +235,6 @@ function StatisticsVerificationReport() {
|
||||
const statisticsVerificationReportQuery = useStatsVrfcRptData(
|
||||
statisticsVerificationReportFilters,
|
||||
);
|
||||
const statisticsVerificationResultQuery =
|
||||
useStatsVrfcRsltData(detailParams);
|
||||
|
||||
const statisticsVerificationReportData =
|
||||
statisticsVerificationReportQuery.data ?? [];
|
||||
const statisticsVerificationReportGridRows = useMemo(
|
||||
@@ -237,6 +242,8 @@ function StatisticsVerificationReport() {
|
||||
[statisticsVerificationReportData],
|
||||
);
|
||||
|
||||
const statisticsVerificationResultQuery =
|
||||
useStatsVrfcRsltData(detailParams);
|
||||
const statisticsVerificationResultData = useMemo(
|
||||
() =>
|
||||
statisticsVerificationResultQuery.data?.pages.flatMap(
|
||||
@@ -560,7 +567,7 @@ function StatisticsVerificationReport() {
|
||||
|
||||
function handleReportRefresh() {
|
||||
queryClient.invalidateQueries({
|
||||
queryKey: [ENDPOINT.ST_SERVICE.INPUT, "statistics-input-status"],
|
||||
queryKey: [ENDPOINT.ST_SERVICE.INPUT, "validation-report"],
|
||||
});
|
||||
}
|
||||
|
||||
@@ -605,6 +612,12 @@ function StatisticsVerificationReport() {
|
||||
onChange={handleFilterChange("statsYr")}
|
||||
options={getYearOptions()}
|
||||
/>
|
||||
<FilterSelect
|
||||
label="공단진행상태"
|
||||
value={filters.pbcpSbmsnSttsCd ?? ""}
|
||||
onChange={handleFilterChange("pbcpSbmsnSttsCd")}
|
||||
options={PBCP_SBMSN_STTS_OPTIONS}
|
||||
/>
|
||||
<div className="flex items-center gap-2">
|
||||
<Label>통계지표</Label>
|
||||
<CodeSelect
|
||||
@@ -645,7 +658,7 @@ function StatisticsVerificationReport() {
|
||||
setRowData={() => {}}
|
||||
showHeaderCheckbox={true}
|
||||
gridHeight={30}
|
||||
onRowClick={(row: StatsInputStatusList) => {
|
||||
onRowClick={(row: ReportStatusResponseDto) => {
|
||||
setSubFilters((prev) => ({
|
||||
...prev,
|
||||
ctpvNm: row?.ctpvNm ?? "",
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/** 그리드/폼 문자열 → API 전송용. 빈값·공백만이면 null */
|
||||
export function nullableTrimmedString(
|
||||
value: string | number | null | undefined | unknown,
|
||||
): string | null {
|
||||
if (value === null || value === undefined) return null;
|
||||
const s = typeof value === "string" ? value.trim() : String(value).trim();
|
||||
return s === "" ? null : s;
|
||||
}
|
||||
@@ -2,6 +2,8 @@ import { stClient } from "@/shared/api";
|
||||
import { ENDPOINT } from "@/shared/config";
|
||||
|
||||
import type {
|
||||
ReportSearchRequestDto,
|
||||
ReportStatusListApiResponse,
|
||||
StatisticsInputStatusService,
|
||||
StatsInputStatusListApiResponse,
|
||||
StatsInputStatusListRequestParams,
|
||||
@@ -17,6 +19,16 @@ export class StatisticsInputStatusApiService implements StatisticsInputStatusSer
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
public async getStatsValidationReport(
|
||||
request: ReportSearchRequestDto,
|
||||
): Promise<ReportStatusListApiResponse> {
|
||||
const response = await stClient.get<ReportStatusListApiResponse>(
|
||||
`${ENDPOINT.ST_SERVICE.INPUT}/stats-input-status/validation-report`,
|
||||
{ params: request },
|
||||
);
|
||||
return response.data;
|
||||
}
|
||||
}
|
||||
|
||||
export const StatisticsInputStatusApi = new StatisticsInputStatusApiService();
|
||||
|
||||
@@ -122,18 +122,24 @@ export const useStatsVrfcRptData = (
|
||||
return useQuery({
|
||||
queryKey: [
|
||||
ENDPOINT.ST_SERVICE.INPUT,
|
||||
"statistics-input-status",
|
||||
"validation-report",
|
||||
submittedMainFilters?.statsYr ?? "",
|
||||
submittedMainFilters?.ctpvNm ?? "",
|
||||
submittedMainFilters?.sggNm ?? "",
|
||||
submittedMainFilters?.sewerBzmnCd ?? "",
|
||||
submittedMainFilters?.statsCd ?? "",
|
||||
submittedMainFilters?.pbcpSbmsnSttsCd ?? "",
|
||||
],
|
||||
queryFn: async () => {
|
||||
if (!submittedMainFilters) return [];
|
||||
const {
|
||||
ctpvSewerBzmnCd: _ctpvSewerBzmnCd,
|
||||
sggSewerBzmnCd: _sggSewerBzmnCd,
|
||||
...request
|
||||
} = submittedMainFilters;
|
||||
const response =
|
||||
await StatisticsInputStatusApi.getStatisticsInputStatusList(
|
||||
submittedMainFilters,
|
||||
await StatisticsInputStatusApi.getStatsValidationReport(
|
||||
request,
|
||||
);
|
||||
if (response.status !== "success")
|
||||
throw new Error(response.message);
|
||||
|
||||
@@ -76,7 +76,11 @@ export {
|
||||
type ImrLogResponse,
|
||||
} from "./model/imr/imr-interface";
|
||||
export { imrVerificationHistoryColumns } from "./model/imr/imr-verification-history-columns";
|
||||
export { type StatsInputStatusList } from "./model/input/statistics-input-status-interface";
|
||||
export {
|
||||
type ReportSearchRequestDto,
|
||||
type ReportStatusResponseDto,
|
||||
type StatsInputStatusList,
|
||||
} from "./model/input/statistics-input-status-interface";
|
||||
export { userListColumns } from "./model/notice-talk/notice-talk-sending-columns";
|
||||
export {
|
||||
type BusinessSendRequest,
|
||||
|
||||
+30
-1
@@ -97,10 +97,39 @@ export interface ExcretaTreatmentFacilityRequestParams {
|
||||
*/
|
||||
export type ExcretaTreatmentFacilitySaveItem = Omit<
|
||||
ExcretaTreatmentFacilityItem,
|
||||
"sggNm" | "verificationResult" | "cmptnStrtYmd" | "oprtngStrtYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "cmptnStrtYmd"
|
||||
| "oprtngStrtYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "fcltPstnCn"
|
||||
| "telNo"
|
||||
| "prcsMthdExpln"
|
||||
| "linkTmplntCn"
|
||||
| "wtsysNm"
|
||||
| "trbtrNm"
|
||||
| "msirbCn"
|
||||
| "ssirbCn"
|
||||
| "operMthdCdCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
telNo: string | null;
|
||||
cmptnStrtYmd: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
prcsMthdExpln: string | null;
|
||||
linkTmplntCn: string | null;
|
||||
wtsysNm: string | null;
|
||||
trbtrNm: string | null;
|
||||
msirbCn: string | null;
|
||||
ssirbCn: string | null;
|
||||
operMthdCdCn: string | null;
|
||||
};
|
||||
|
||||
/** 분뇨처리시설(ST00070001) 저장 API 요청 */
|
||||
|
||||
+6
-6
@@ -207,8 +207,8 @@ export interface PrivateSewageDesigStatusRequestParams {
|
||||
* `sggNm`·계산필드(`wholDrtwPrcsFcltCnt`, `wholStaaCnt`, `staaExcpWhol`)·검증결과는 제외.
|
||||
*/
|
||||
export interface SewageTreatFactStatusSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
step1StaaPrcsQnt: number;
|
||||
step2StaaPrcsQnt: number;
|
||||
step3StaaPrcsQnt: number;
|
||||
@@ -279,8 +279,8 @@ export interface SewageTreatFactStatusSubmitResponse {
|
||||
* `staaExcpWhol`, `staaExcpPrcsMthByWhol`, `staaExcpPrcsCpctByWhol`)·검증결과는 제외.
|
||||
*/
|
||||
export interface SepticTankStatusSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
staaInsdSttkNprsflCnt: number;
|
||||
step1StaaInsdSttkFrcCnt: number;
|
||||
staaInsdSprktpFltrtbCnt: number;
|
||||
@@ -364,8 +364,8 @@ export interface SepticTankStatusSubmitResponse {
|
||||
* `sggNm`·검증결과는 제외.
|
||||
*/
|
||||
export interface PrivateSewageDesigStatusSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
indvSwagePbancRgnCnt: number;
|
||||
indvSwageDsgnScpLen: number;
|
||||
spctnkGrssFcltCnt: number;
|
||||
|
||||
+14
@@ -107,7 +107,21 @@ export type PumpingStationSaveItem = Omit<
|
||||
| "drtwPumpGrssPpqty"
|
||||
| "exlnPumpGrssPpqty"
|
||||
| "oprtngStrtYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "swtrmtFcltNm"
|
||||
| "fcltNm"
|
||||
| "pumpSeNm"
|
||||
| "fcltPstnCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
fcltNm: string | null;
|
||||
pumpSeNm: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
};
|
||||
|
||||
|
||||
+38
-8
@@ -176,24 +176,54 @@ export type PrivateSewageTreatRelatedIndustryApiResponse =
|
||||
/** ST00120001·ST00120002 저장 — `saveList` / `deleteList` 항목 (`sggNm`·계산필드·검증결과 제외) */
|
||||
export type PublicInstitutionSewerIndustrySaveItem = Omit<
|
||||
PublicInstitutionSewerIndustryItem,
|
||||
"sggNm" | "verificationResult" | "empGrssCnt" | "techWholNope"
|
||||
>;
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "empGrssCnt"
|
||||
| "techWholNope"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "ognzSn"
|
||||
| "ognzNm"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
ognzSn: string | null;
|
||||
ognzNm: string | null;
|
||||
};
|
||||
|
||||
export type PublicInstitutionExcretaIndustrySaveItem = Omit<
|
||||
PublicInstitutionExcretaIndustryItem,
|
||||
"sggNm" | "verificationResult" | "empGrssCnt" | "techWholNope"
|
||||
>;
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "empGrssCnt"
|
||||
| "techWholNope"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "ognzSn"
|
||||
| "ognzNm"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
ognzSn: string | null;
|
||||
ognzNm: string | null;
|
||||
};
|
||||
|
||||
/** ST00120003·ST00120004 저장 — `saveList` 항목 (`sggNm`·계산필드·검증결과 제외) */
|
||||
export type ExcretaRelatedIndustrySaveItem = Omit<
|
||||
ExcretaRelatedIndustryItem,
|
||||
"sggNm" | "verificationResult" | "fcltSecrPrstCnt"
|
||||
>;
|
||||
"sggNm" | "verificationResult" | "fcltSecrPrstCnt" | "admdstCd" | "admdstNm"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
};
|
||||
|
||||
export type PrivateSewageTreatRelatedIndustrySaveItem = Omit<
|
||||
PrivateSewageTreatRelatedIndustryItem,
|
||||
"sggNm" | "verificationResult"
|
||||
>;
|
||||
"sggNm" | "verificationResult" | "admdstCd" | "admdstNm"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
};
|
||||
|
||||
export interface SewageExcretaRelatedSaveRequestBase {
|
||||
statsYr: string;
|
||||
|
||||
+75
-11
@@ -54,7 +54,7 @@ export interface SlurgeProcessingFacStatusItem {
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
fcltSn: string;
|
||||
swtrmtFcltNm: string;
|
||||
swtrmtFcltNm: string | null;
|
||||
swtrmtFcltCd: string;
|
||||
gnamWhol: number;
|
||||
itslfQnt: number;
|
||||
@@ -132,7 +132,30 @@ export type SlurgeProcessingFacStatusSaveItem = Omit<
|
||||
| "dryPrcsWhol"
|
||||
| "fuelPrcsWhol"
|
||||
| "otsdCnsgnWhol"
|
||||
>;
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "swtrmtFcltCd"
|
||||
| "transfTmplntNm"
|
||||
| "cmpsPrcsFcltBzentyNm"
|
||||
| "incnrPrcsFcltNm"
|
||||
| "stbznPrcsFcltNm"
|
||||
| "dryPrcsFcltNm"
|
||||
| "fuelPrcsFcltNm"
|
||||
| "otsdCnsgnFcltNm"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
transfTmplntNm: string | null;
|
||||
cmpsPrcsFcltBzentyNm: string | null;
|
||||
incnrPrcsFcltNm: string | null;
|
||||
stbznPrcsFcltNm: string | null;
|
||||
dryPrcsFcltNm: string | null;
|
||||
fuelPrcsFcltNm: string | null;
|
||||
otsdCnsgnFcltNm: string | null;
|
||||
};
|
||||
|
||||
/** ST00110001 저장 API 요청 */
|
||||
export interface SlurgeProcessingFacStatusSaveRequest {
|
||||
@@ -193,7 +216,7 @@ export interface DigestorOperatingStatusItem {
|
||||
admdstNm: string;
|
||||
fcltSn: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
swtrmtFcltNm: string | null;
|
||||
digstnEnYn: string;
|
||||
digstnCpct: number;
|
||||
actlDrvnCpct: number;
|
||||
@@ -228,8 +251,21 @@ export type DigestorOperatingStatusApiResponse =
|
||||
*/
|
||||
export type DigestorOperatingStatusSaveItem = Omit<
|
||||
DigestorOperatingStatusItem,
|
||||
"sggNm" | "verificationResult" | "digstnGasUtztnWholPrst"
|
||||
>;
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "digstnGasUtztnWholPrst"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "swtrmtFcltCd"
|
||||
| "digstnEnYn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
digstnEnYn: string | null;
|
||||
};
|
||||
|
||||
/** ST00110002 저장 API 요청 */
|
||||
export interface DigestorOperatingStatusSaveRequest {
|
||||
@@ -317,8 +353,22 @@ export type SewageSlurgeProcessingFacStatusApiResponse =
|
||||
*/
|
||||
export type SewageSlurgeProcessingFacStatusSaveItem = Omit<
|
||||
SewageSlurgeProcessingFacStatusItem,
|
||||
"sggNm" | "verificationResult" | "oprtngRt" | "fcltPstnCn"
|
||||
>;
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "oprtngRt"
|
||||
| "fcltPstnCn"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "prcsMthExpln"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
prcsMthExpln: string | null;
|
||||
};
|
||||
|
||||
/** ST00110003 저장 API 요청 */
|
||||
export interface SewageSlurgeProcessingFacStatusSaveRequest {
|
||||
@@ -390,7 +440,7 @@ export interface ExcretaSlurgeProcessingStatusItem {
|
||||
fuelQnt: number;
|
||||
etcQnt: number;
|
||||
nondspsQnt: number;
|
||||
swtrmtFcltNm: string;
|
||||
swtrmtFcltNm: string | null;
|
||||
rmrk: string | null;
|
||||
verificationResult?: SewageExcretaSlurgeVerificationResult;
|
||||
}
|
||||
@@ -412,8 +462,22 @@ export type ExcretaSlurgeProcessingStatusApiResponse =
|
||||
*/
|
||||
export type ExcretaSlurgeProcessingStatusSaveItem = Omit<
|
||||
ExcretaSlurgeProcessingStatusItem,
|
||||
"sggNm" | "verificationResult" | "gnam" | "wholDspsQnt"
|
||||
>;
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "gnam"
|
||||
| "wholDspsQnt"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "fcltPstnCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
};
|
||||
|
||||
/** ST00110004 저장 API 요청 */
|
||||
export interface ExcretaSlurgeProcessingStatusSaveRequest {
|
||||
@@ -475,7 +539,7 @@ export interface PublicSewageFacilityItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
swtrmtFcltNm: string | null;
|
||||
fcltSn: string;
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -97,9 +97,9 @@ export type SewagePipeMaintainDredgingResponse = ApiResponse<SewagePipeMaintainD
|
||||
|
||||
/** ST00030001 하수관로 유지관리 > 개보수 저장·제출 API 행 */
|
||||
export interface SewagePipeMaintainRepairSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
mendngWhol: number;
|
||||
cbsysMendngPrlg: number;
|
||||
sprsysExlnPrlg: number;
|
||||
@@ -164,9 +164,9 @@ export interface SewagePipeMaintainRepairSubmitResponse {
|
||||
|
||||
/** ST00030002 하수관로 유지관리 > 관로준설 저장·제출 API 행 */
|
||||
export interface SewagePipeMaintainDredgingSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
wholFcltPrlg: number;
|
||||
wholSwagePpl: number;
|
||||
cbsysPplPrlg: number;
|
||||
|
||||
+60
-2
@@ -172,9 +172,39 @@ export interface SewageReservoirRequestParams {
|
||||
*/
|
||||
export type SewageReservoirSaveItem = Omit<
|
||||
SewageReservoirItem,
|
||||
"sggNm" | "verificationResult" | "oprtngStrtYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "oprtngStrtYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "fcltPstnCn"
|
||||
| "fldngPrvtnYn"
|
||||
| "wqPlltnMtgtYn"
|
||||
| "rtlztnUsgYn"
|
||||
| "prcsgFcltYn"
|
||||
| "ddrztnEqpmYn"
|
||||
| "oslfEtgtYn"
|
||||
| "dschgWtrsExpln"
|
||||
| "prcptnLastDspsMthdExpln"
|
||||
| "ctmnLastDspsMthdExpln"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
fldngPrvtnYn: string | null;
|
||||
wqPlltnMtgtYn: string | null;
|
||||
rtlztnUsgYn: string | null;
|
||||
prcsgFcltYn: string | null;
|
||||
ddrztnEqpmYn: string | null;
|
||||
oslfEtgtYn: string | null;
|
||||
dschgWtrsExpln: string | null;
|
||||
prcptnLastDspsMthdExpln: string | null;
|
||||
ctmnLastDspsMthdExpln: string | null;
|
||||
};
|
||||
|
||||
/** 하수저류시설(ST00040001) 저장 API 요청 */
|
||||
@@ -231,9 +261,37 @@ export interface SewageReservoirSubmitResponse {
|
||||
*/
|
||||
export type RainfallPumpStationSaveItem = Omit<
|
||||
RainfallPumpStationItem,
|
||||
"sggNm" | "verificationResult" | "oprtngStrtYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "oprtngStrtYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "fcltPstnCn"
|
||||
| "fcltyKndCn"
|
||||
| "rsvrYn"
|
||||
| "prcsgFcltYn"
|
||||
| "ddrztnEqpmYn"
|
||||
| "oslfEtgtYn"
|
||||
| "dschgWtrsExpln"
|
||||
| "prcptnLastDspsMthdExpln"
|
||||
| "ctmnLastDspsMthdExpln"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
fcltyKndCn: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
rsvrYn: string | null;
|
||||
prcsgFcltYn: string | null;
|
||||
ddrztnEqpmYn: string | null;
|
||||
oslfEtgtYn: string | null;
|
||||
dschgWtrsExpln: string | null;
|
||||
prcptnLastDspsMthdExpln: string | null;
|
||||
ctmnLastDspsMthdExpln: string | null;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
+12
-12
@@ -91,9 +91,9 @@ export interface SewerageFinanceSettleRequestParams {
|
||||
* `SewerageFinanceSettleInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
|
||||
*/
|
||||
export interface SewerageFinanceSettleSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
cnterGovSprtAmt: number;
|
||||
mctpvLcexpAmt: number;
|
||||
wareaSggLclAmt: number;
|
||||
@@ -252,9 +252,9 @@ export interface SewerageChargeRequestParams {
|
||||
* `SewerageChargeInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
|
||||
*/
|
||||
export interface SewerageChargeSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
anlLevyQnt: number;
|
||||
levyAmt: number;
|
||||
grssPrmcoAmt: number;
|
||||
@@ -359,9 +359,9 @@ export interface SewerageUsageFeeRequestParams {
|
||||
* `SewerageUsageFeeInpColumn` fieldName과 동일 (`ctpvNm` 그리드 값은 요청 `ctpvNm` 시도명).
|
||||
*/
|
||||
export interface SewerageUsageFeeSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
hshusLevyAmt: number;
|
||||
hshusLevyQnt: number;
|
||||
hshusUntprcAmt: number;
|
||||
@@ -469,9 +469,9 @@ export interface CauserBurdenRequestParams {
|
||||
* `trgtByWholClctnEvntcsCnt`는 조회·그리드 전용이며 저장·제출 요청에는 포함하지 않음.
|
||||
*/
|
||||
export interface CauserBurdenSaveItem {
|
||||
admdstCd: string;
|
||||
sggNm: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
levyEvntcsCnt: number;
|
||||
levyAmt: number;
|
||||
mltvEqpmEvntcsCnt: number;
|
||||
|
||||
+7
-7
@@ -128,8 +128,8 @@ export interface SewerageServiceLevelResidentFriendlyFactRequestParams {
|
||||
|
||||
/** ST00130001 저장 `saveList[]` 한 행 */
|
||||
export interface SewerageServiceLevelComplaintSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
swtrmtPpltnCnt: number;
|
||||
dschgWqCnt: number;
|
||||
odorCnt: number;
|
||||
@@ -162,11 +162,11 @@ export interface SewerageServiceLevelComplaintSaveResponse {
|
||||
|
||||
/** ST00130002 저장 `saveList[]` 한 행 */
|
||||
export interface SewerageServiceLevelResidentFriendlyFactSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
fcltSn: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
fcltSn: string | null;
|
||||
tmplntArea: number;
|
||||
brkFcltArea: number;
|
||||
childFrshpSpacArea: number;
|
||||
|
||||
@@ -33,8 +33,63 @@ export type StatsInputStatusListApiResponse = ApiResponse<
|
||||
message: string;
|
||||
};
|
||||
|
||||
/** 통계 검증 리포트 RequestDto */
|
||||
export interface ReportSearchRequestDto {
|
||||
sewerBzmnCd?: string | null;
|
||||
ctpvNm?: string | null;
|
||||
sggNm?: string | null;
|
||||
statsYr: string;
|
||||
statsCd?: string | null;
|
||||
/** 공단 상태 코드 (0:미작성, 1:작성중, 2:제출, 3:승인, 4:반려, 5:검토중) */
|
||||
pbcpSbmsnSttsCd?: string | null;
|
||||
}
|
||||
|
||||
/** 통계 검증 리포트 현황 조회 ResponseDto */
|
||||
export interface ReportStatusResponseDto {
|
||||
ctpvNm?: string;
|
||||
sggNm?: string;
|
||||
sewerBzmnCd?: string;
|
||||
statsCd?: string;
|
||||
menuTabName?: string;
|
||||
laeSbmsnSttsCd?: string;
|
||||
laeSbmsnSttsNm?: string;
|
||||
laeSbmsnYmd?: string;
|
||||
statPicSbmsnSttsCd?: string;
|
||||
statPicSbmsnSttsNm?: string;
|
||||
ctpvSbmsnYmd?: string;
|
||||
pbcpSbmsnSttsCd?: string;
|
||||
pbcpSbmsnSttsNm?: string;
|
||||
pbcpCfmtnYmd?: string;
|
||||
laePicNm?: string;
|
||||
laePicTelNo?: string;
|
||||
laeKbrdrDeptNm?: string;
|
||||
laeKbrdrJbgdNm?: string;
|
||||
laeIdfrNm?: string;
|
||||
laeIdfrTelNo?: string;
|
||||
laeIdfrDeptNm?: string;
|
||||
laeIdfrJbgdNm?: string;
|
||||
mctpvIdfrNm?: string;
|
||||
mctpvIdfrTelNo?: string;
|
||||
mctpvIdfrDeptNm?: string;
|
||||
mctpvIdfrJbgdNm?: string;
|
||||
lastCfmtnPicNm?: string;
|
||||
lastCfmtnPicTelNo?: string;
|
||||
lastCfmtnPicDeptNm?: string;
|
||||
lastCfmtnPicJbgdNm?: string;
|
||||
rjctOpnnCn?: string;
|
||||
}
|
||||
|
||||
export type ReportStatusListApiResponse = ApiResponse<
|
||||
ReportStatusResponseDto[]
|
||||
> & {
|
||||
message: string;
|
||||
};
|
||||
|
||||
export interface StatisticsInputStatusService {
|
||||
getStatisticsInputStatusList(
|
||||
param: StatsInputStatusListRequestParams,
|
||||
): Promise<StatsInputStatusListApiResponse>;
|
||||
getStatsValidationReport(
|
||||
request: ReportSearchRequestDto,
|
||||
): Promise<ReportStatusListApiResponse>;
|
||||
}
|
||||
|
||||
+81
-12
@@ -105,18 +105,18 @@ export type PublicSewageTreatWaterReuseApiResponse =
|
||||
|
||||
/** ST00100001 저장 — `saveList` 항목 */
|
||||
export interface PublicSewageTreatWaterReuseSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
fcltSn: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
wholPrcsQnt: number;
|
||||
lglYn: string;
|
||||
instlYn: string;
|
||||
lglYn: string | null;
|
||||
instlYn: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
instlAprvYmd: string | null;
|
||||
rprcsFcltCpct: number;
|
||||
mtcnsNm: string;
|
||||
mtcnsNm: string | null;
|
||||
ruswtPplLen: number;
|
||||
ruswtPumpLen: number;
|
||||
rmrk: string | null;
|
||||
@@ -209,10 +209,29 @@ export type RecycledWaterStatusApiResponse = ApiResponse<RecycledWaterStatusResp
|
||||
/** ST00100002 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
|
||||
export type RecycledWaterStatusSaveItem = Omit<
|
||||
RecycledWaterStatusItem,
|
||||
"sggNm" | "verificationResult" | "cmptnStrtYmd" | "oprtngStrtYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "cmptnStrtYmd"
|
||||
| "oprtngStrtYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "bldgSeCn"
|
||||
| "fcltPstnCn"
|
||||
| "lglTrgtYn"
|
||||
| "mnUsgCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
bldgSeCn: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
lglTrgtYn: string | null;
|
||||
cmptnStrtYmd: string | null;
|
||||
oprtngStrtYmd: string | null;
|
||||
mnUsgCn: string | null;
|
||||
};
|
||||
|
||||
/** ST00100002 저장 API 요청 */
|
||||
@@ -303,9 +322,31 @@ export type RainFallUtilFactStatusApiResponse =
|
||||
/** ST00100003 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
|
||||
export type RainFallUtilFactStatusSaveItem = Omit<
|
||||
RainFallUtilFactStatusItem,
|
||||
"sggNm" | "verificationResult" | "cmptYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "cmptYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "fcltNm"
|
||||
| "bdstTypCn"
|
||||
| "fcltPstnCn"
|
||||
| "lglTrgtYn"
|
||||
| "rcptMynCn"
|
||||
| "filtrPrcsFcltYnExpln"
|
||||
| "exlnUtlzUsgExpln"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltNm: string | null;
|
||||
bdstTypCn: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
lglTrgtYn: string | null;
|
||||
cmptYmd: string | null;
|
||||
rcptMynCn: string | null;
|
||||
filtrPrcsFcltYnExpln: string | null;
|
||||
exlnUtlzUsgExpln: string | null;
|
||||
};
|
||||
|
||||
/** ST00100003 저장 API 요청 */
|
||||
@@ -388,8 +429,22 @@ export type TreatWaterReuseDesignConstStatusApiResponse =
|
||||
/** ST00100004 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
|
||||
export type TreatWaterReuseDesignConstStatusSaveItem = Omit<
|
||||
TreatWaterReuseDesignConstStatusItem,
|
||||
"sggNm" | "verificationResult" | "coRegYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "coRegYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "bplcSn"
|
||||
| "bplcNm"
|
||||
| "rprsvNm"
|
||||
| "bplcPstnCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
bplcSn: string | null;
|
||||
bplcNm: string | null;
|
||||
rprsvNm: string | null;
|
||||
bplcPstnCn: string | null;
|
||||
coRegYmd: string | null;
|
||||
};
|
||||
|
||||
@@ -474,8 +529,22 @@ export type TreatWaterReuseBusinessApprStatusApiResponse =
|
||||
/** ST00100005 저장 — `saveList` / `deleteList` 항목 (`sggNm`·검증결과 제외) */
|
||||
export type TreatWaterReuseBusinessApprStatusSaveItem = Omit<
|
||||
TreatWaterReuseBusinessApprStatusItem,
|
||||
"sggNm" | "verificationResult" | "coRegYmd"
|
||||
| "sggNm"
|
||||
| "verificationResult"
|
||||
| "coRegYmd"
|
||||
| "admdstCd"
|
||||
| "admdstNm"
|
||||
| "bplcSn"
|
||||
| "bplcNm"
|
||||
| "rprsvNm"
|
||||
| "bplcPstnCn"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
bplcSn: string | null;
|
||||
bplcNm: string | null;
|
||||
rprsvNm: string | null;
|
||||
bplcPstnCn: string | null;
|
||||
coRegYmd: string | null;
|
||||
};
|
||||
|
||||
|
||||
+11
-11
@@ -170,12 +170,12 @@ export interface PublicSewageMappingTargetsResponse {
|
||||
|
||||
/** ST00060002 중심처리시설 매핑 저장 — saveList 항목 */
|
||||
export interface PublicSewageMainFacilityMappingSaveItem {
|
||||
fcltSn: string;
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
isMainYn: string;
|
||||
fcltSn: string | null;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
isMainYn: string | null;
|
||||
}
|
||||
|
||||
/** ST00060002 중심처리시설 매핑 저장 API 요청 */
|
||||
@@ -205,11 +205,11 @@ export interface PublicSewageMainFacilityMappingSaveResponse {
|
||||
|
||||
/** ST00060001 공공하수처리시설 저장 — saveList 항목 */
|
||||
export interface PublicSewageFacilitySaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
swtrmtFcltCd: string;
|
||||
swtrmtFcltNm: string;
|
||||
fcltSn: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
fcltSn: string | null;
|
||||
fcltPstnCn: string | null;
|
||||
|
||||
inflwSwagePhysQnt: number;
|
||||
|
||||
+36
-16
@@ -96,14 +96,34 @@ export interface SeweragePipeInputRegionalResponse {
|
||||
/** 지역별 시설현황(Tab1) 저장 — saveList 행 (검증 결과 제외) */
|
||||
export type SeweragePipeInputRegionalFactStatusSaveItem = Omit<
|
||||
SeweragePipeInputRegionalFactStatusItem,
|
||||
"verificationResult"
|
||||
>;
|
||||
"verificationResult" | "admdstCd" | "sggNm" | "admdstNm" | "goalYr"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
goalYr: string | null;
|
||||
};
|
||||
|
||||
/** Tab2 저장 — saveList */
|
||||
export type SeweragePipeInputFactInstallStatusSaveItem = Omit<
|
||||
SeweragePipeInputFactInstallStatusItem,
|
||||
"verificationResult"
|
||||
>;
|
||||
| "verificationResult"
|
||||
| "admdstCd"
|
||||
| "sggNm"
|
||||
| "admdstNm"
|
||||
| "fcltSn"
|
||||
| "swtrmtFcltCd"
|
||||
| "swtrmtFcltNm"
|
||||
| "rmrk"
|
||||
> & {
|
||||
admdstCd: string | null;
|
||||
sggNm: string | null;
|
||||
admdstNm: string | null;
|
||||
fcltSn: string | null;
|
||||
swtrmtFcltCd: string | null;
|
||||
swtrmtFcltNm: string | null;
|
||||
rmrk: string | null;
|
||||
};
|
||||
|
||||
/** 지역별 시설현황 저장 API 요청 */
|
||||
export interface SeweragePipeInputRegionalFactStatusSaveRequest {
|
||||
@@ -283,11 +303,11 @@ export interface SeweragePipeInputPipeTypeResponse {
|
||||
|
||||
/** 관종별 현황 저장 — saveList 항목 */
|
||||
export interface SeweragePipeInputPipeTypeStatusSaveItem {
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
pipeSeCd: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
pipeSeCd: string | null;
|
||||
yearlyStatList: SeweragePipeInputPipeTypeYearlyStatItem[];
|
||||
rmrk: string;
|
||||
rmrk: string | null;
|
||||
lyngPrlgWhol: number;
|
||||
dmltnPrlgWhol: number;
|
||||
pipeByPrstWhol: number;
|
||||
@@ -351,7 +371,7 @@ export interface SeweragePipeInputPipeDiameterResponse {
|
||||
|
||||
/** 관경별 현황 저장 — saveList 항목 */
|
||||
export interface SeweragePipeInputPipeDiameterStatusSaveItem {
|
||||
pipeSeCd: string;
|
||||
pipeSeCd: string | null;
|
||||
step1PdmtPrlg: number;
|
||||
step2PdmtPrlg: number;
|
||||
step3PdmtPrlg: number;
|
||||
@@ -359,10 +379,10 @@ export interface SeweragePipeInputPipeDiameterStatusSaveItem {
|
||||
step5PdmtPrlg: number;
|
||||
sqrePdmtPrlg: number;
|
||||
etcPdmtPrlg: number;
|
||||
rmrk: string;
|
||||
rmrk: string | null;
|
||||
pdmtByTsmWhol: number;
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
}
|
||||
|
||||
/** 관경별 현황 저장 API 요청 */
|
||||
@@ -456,11 +476,11 @@ export interface SeweragePipeInputManholeStatusSaveYearlyStatItem {
|
||||
|
||||
/** 맨홀 현황 저장 — saveList 항목 */
|
||||
export interface SeweragePipeInputManholeStatusSaveItem {
|
||||
emphsMngSeCd: string;
|
||||
admdstCd: string;
|
||||
admdstNm: string;
|
||||
emphsMngSeCd: string | null;
|
||||
admdstCd: string | null;
|
||||
admdstNm: string | null;
|
||||
yearlyStats: SeweragePipeInputManholeStatusSaveYearlyStatItem[];
|
||||
rmrk: string;
|
||||
rmrk: string | null;
|
||||
}
|
||||
|
||||
/** 맨홀 현황 저장 API 요청 */
|
||||
|
||||
+27
-3
@@ -29,14 +29,14 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
|
||||
{
|
||||
name: "laePicNm",
|
||||
fieldName: "laePicNm",
|
||||
header: { text: "작성자" },
|
||||
header: { text: "지자체작성자" },
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
{
|
||||
name: "laePicTelNo",
|
||||
fieldName: "laePicTelNo",
|
||||
header: { text: "작성자연락처" },
|
||||
header: { text: "연락처" },
|
||||
width: 130,
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
@@ -58,7 +58,7 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
|
||||
{
|
||||
name: "laeIdfrNm",
|
||||
fieldName: "laeIdfrNm",
|
||||
header: { text: "승인자" },
|
||||
header: { text: "지자체승인자" },
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
@@ -76,6 +76,27 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
{
|
||||
name: "lastCfmtnPicNm",
|
||||
fieldName: "lastCfmtnPicNm",
|
||||
header: { text: "공단확인자" },
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
{
|
||||
name: "lastCfmtnPicDeptNm",
|
||||
fieldName: "lastCfmtnPicDeptNm",
|
||||
header: { text: "부서" },
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
{
|
||||
name: "lastCfmtnPicJbgdNm",
|
||||
fieldName: "lastCfmtnPicJbgdNm",
|
||||
header: { text: "직급" },
|
||||
styleName: READ_ONLY_STYLE,
|
||||
editable: false,
|
||||
},
|
||||
{
|
||||
name: "rjctOpnnCn",
|
||||
fieldName: "rjctOpnnCn",
|
||||
@@ -108,6 +129,9 @@ export const statisticsVerificationReportColumnInfo: ColumnInfo = {
|
||||
"laeIdfrNm",
|
||||
"laeIdfrDeptNm",
|
||||
"laeIdfrJbgdNm",
|
||||
"lastCfmtnPicNm",
|
||||
"lastCfmtnPicDeptNm",
|
||||
"lastCfmtnPicJbgdNm",
|
||||
"rjctOpnnCn",
|
||||
"sewerBzmnCd",
|
||||
"statsCd",
|
||||
|
||||
+6
-7
@@ -1,12 +1,11 @@
|
||||
import type { VerifyResultSearchRequest } from "../general-verification-interface";
|
||||
import type { StatsInputStatusListRequestParams } from "../input/statistics-input-status-interface";
|
||||
import type { ReportSearchRequestDto } from "../input/statistics-input-status-interface";
|
||||
|
||||
export type StatisticsVerificationFilterState =
|
||||
StatsInputStatusListRequestParams & {
|
||||
// 셀렉트 표시용 시도, 시군구 코드
|
||||
ctpvSewerBzmnCd?: string | null;
|
||||
sggSewerBzmnCd?: string | null;
|
||||
};
|
||||
export type StatisticsVerificationFilterState = ReportSearchRequestDto & {
|
||||
// 셀렉트 표시용 시도, 시군구 코드
|
||||
ctpvSewerBzmnCd?: string | null;
|
||||
sggSewerBzmnCd?: string | null;
|
||||
};
|
||||
|
||||
export type StatisticsVerificationSubFilterState = VerifyResultSearchRequest;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user