0){
+ return (
+
+ {commentArray.map((item, index) => (
+
+
+ {commentStartPoint} {item}
+
+
+
+ ))}
+
+ )
+ }
+}
+
+export default UnderComment;
\ No newline at end of file
diff --git a/apps/fo/app/intro.md b/apps/fo/app/intro.md
new file mode 100644
index 000000000..99be4afd7
--- /dev/null
+++ b/apps/fo/app/intro.md
@@ -0,0 +1,137 @@
+# 운영실태 인수인계
+## 이력
+ written by yjs
+ 2025-
+## 0. 알아두면 좋아요
+ - 화면 초기 화면 : 메인 대시보드(표로 보는 대시보드)
+
- API swagger 주소 : http://con.mind-one.co.kr:11082/swagger-ui/index.html#
+
- 단위 : 유량은 정수까지 강우량은 소수점 1자리 반올림한다, 수질은 TN, TP만 소수점 3자리, 나머지는 1자리까지 반올림한다.
+
▶︎ roundNumber(value:any, decimal:number) 컴포넌트를 활용해보세요!!
+
- 강우영향일 : 강우량이 3mm이상인 날은 강우영향일에 포함되고 하루전, 이틀전에 강우량이 3mm인 날의 경우도 강우량에 포함된다. 팝업의 강우시, 청천시 탭에서 보여주는 리스트를 만들 때 필요한 정보이니 참고한다.
+
▶︎ 예시 : 1월 13일 강우량이 5일 경우 - 강우영향일 포함됨, 1월 14일, 1월 15일 강우량에 상관없이 ___강우영향일 포함됨___, 1월 16일의 경우 14일, 15일이 3mm미만이면 ___강우영향일 미포함됨___
+
▶︎ CalcRainEffect(data:any, weather) 컴포넌트에서 측정일, 강우량이 포함된 데이터를 파라미터로 넘기면 강우영향일(rainEffectDay) 컬럼 및 0,1로 여부 value로 데이터에 추가되어 리턴한다.
+
- 운영실태는 대부분 시설의 정보를 추출해주는 화면이 대다수이며 검색은 행정별, 유역별, 환경청별로 시설을 분류하여 조회하고 엑셀, 초기화, 조회 버튼이 우측에 존재한다.
+
- 메인 대시보드의 경우에는 수질, 유량 등 조회하는 화면의 정보들을 압축해서 보여주는 화면이라고 생각하면 좋다. 그렇기 때문에 대시보드에서의 각각의 데이터와 메인 화면의 데이터가 일치하는지 검증하는 작업이 많이 필요하다.
+
- 하루 단위의 데이터를 보여주는 모달에서 연간, 하절기, 동절기, 청천시, 강우시 등의 1년치 데이터를 필터링 하여 보여주는데 탭을 누를 시 api가 재호출 되는 형식이 아니고 1년치 데이터를 필터링 하여 출력해주고 청천시탭의 경우 강우영향일은 미포함, 강우시탭의 경우 강우영향일 포함된 데이터를 보여줘야 한다.
+## 1. 표로 보기(메인 대시보드)
+### 1-1) 시설정보 및 운영현황
+ - 년도, 시설에 해당하는 시설정보 및 유량, 수질, 물사용량 등의 정보를 표로 표출해주는 화면
+
- 시설계획 : 알에스원 DC-SERVICE API에서 받은 데이터를 화면에 출력
+
▶︎ 주소 : 'https://apigateway.apps.rsonesoft.com/dc-service/api/v1/nowDmgMtncGnsvy';
+
▶︎ 파라미터 : swtrmtFcltCd - 시설코드 / ctpvNm - 시도명 / sggNm - 시군구명 / targetYear - 대상년도
+
▶︎ 리턴값(사용되는것 위주)
+
/**
+
* 증설계획
+
*/
+
기승인(당초4단계), 현재, 변경1~4
+
planSwageQntSumDt4 : number | '',
+
planSwageQntSum : number | '',
+
planSwageQntSumDc1 : number | '',
+
planSwageQntSumDc2 : number | '',
+
planSwageQntSumDc3 : number | '',
+
planSwageQntSumDc4 : number | '',
+
/**
+
* 처리인구
+
*/
+
// 기승인(당초4단계), 현재, 변경1~4
+
swtrmtPpltnCntDt4 : number | '',
+
swtrmtPpltnCnt : number | '',
+
swtrmtPpltnCntDc1 : number | '',
+
swtrmtPpltnCntDc2 : number | '',
+
swtrmtPpltnCntDc3 : number | '',
+
swtrmtPpltnCntDc4 : number | '',
+
/**
+
* 처리구역면적
+
*/
+
// 기승인(당초4단계), 현재, 변경1~4
+
swtrmtZoneAreaDt4 : number | '',
+
swtrmtZoneArea : number | '',
+
swtrmtZoneAreaDc1 : number | '',
+
swtrmtZoneAreaDc2 : number | '',
+
swtrmtZoneAreaDc3 : number | '',
+
swtrmtZoneAreaDc4 : number | '',
+
// 처리구역
+
trtDstr : string | '',
+
+
- 물사용량 : 현재 DB가 없기 때문에 해당 년도의 평균 하수유입량 * 0.65 (65%)
+
- 운영실태 표(우측 표)의 년도는 검색한 년도에 따라 값 설정
+
- 유입유량 : 순수하수유입량 + 연계처리수 + 총인설비반류수
+
+### 1-2) 메인 그래프
+ - 1년치 수질항목들의 데이터들을 표출해주는 화면
+
- lineBarChart, lineChart 컴포넌트를 사용하여 차트를 생성함
+
+### 1-3) 강우일 운영현황
+ - 1년치 시설의 강우량 데이터를 구간별로 일수와 강우량 정보를 표출해주는 화면
+
- 순수 하루단위의 강우량에 따라서 데이터를 표출하는 것이 아닌 __강우영향일__ 계산된 후 통계를 구한다.
+
▶︎ 예시 : 1월 13일 강우량이 5일 경우 - 3~10mm구간 통계포함, 1월 14일 강우량이 0일 경우 - ___3~10mm구간 통계 포함___
+
- 설계유입수질은 처음 설계 당시의 수질 데이터이기 때문에 한개의 데이터만 추출
+
- 시설용량 대비는 유입유량/시설용량 * 100 (비율)
+
- 계의 경우 일수는 합계 그 외에는 평균값을 나타낸다.
+## 2. 처리시설 현황
+### 2-1) 처리시설 시설정보
+ - 처리시설 정보들과 이력들을 조회할 수 있는 화면이다.
+
- 모달 '기본정보' 탭의 시설계획정보는 '이력관리' 탭의 이력 리스트 중 마지막 이력의 수질정보를 표출해준다.
+
- 모달 '이력관리' 탭에서는 이력정보와 해당 차수의 수질정보를 보여준다. (1대1)
+### 2-2) 처리구역정보
+ - 처리시설의 계획정보를 조회할 수 있는 화면이다.
+
- 1-1)의 시설계획을 참고하도록 한다. 해당 api로 계획정보를 가져온다.
+
- 요구사항 중 원래는 단계별로 년도를 괄호로 표시해달라는 요청사항이 있었으나 시설들마다 다르기 때문에 메인화면에 단계하단에 년도를 넣는게 불가능하다.
+
▶︎ 대시보드의 계획정보 영역의 경우에는 시설코드를 파라미터로 던져 계획정보를 가져오기 때문에 가능하여 대시보드의 계획정보는 괄호로 년도를 추출하도록 한다.
+## 3. 처리시설 연간 운영 현황
+### 3-1) 강수현황
+ - 시설별 강수현황을 조회할 수 있는 화면이다.
+
- 메인화면에서의 시설별 1년치 강우일, 강우일수, 강우량 데이터는 백엔드에서 계산되어 출력되는 형식이 아니라 하루치 데이터의 object(rainyDayObjList)를 store에서 계산하여 출력한다. swagger를 참고한다.
+
+
data": [
+
{
+
"bscFctCd": "11000SW001R",
+
"bscFctNm": "난지",
+
"sido": "서울특별시",
+
"gugun": " ",
+
"addr": "경기도 고양시 덕양구 현천동 692-2",
+
"fctCpc": 860000,
+
"stnKo": "강서",
+
"rvbsn": "한강",
+
"lgbsn": "한강본류",
+
"mdmbsn": "한강서울",
+
"rgnNm": "한강유역환경청",
+
"totalCount": 0,
+
"rainyDayObjList": [
+
{
+
"bscFctCd": "11000SW001R",
+
"rainDt": "2024-01-01",
+
"infoRnDay": 0
+
},
+
{
+
"bscFctCd": "11000SW001R",
+
"rainDt": "2024-01-02",
+
"infoRnDay": 0
+
},
+
.....
+
- 일별 데이터 object(rainyDayObjList)를 강우영향일 구하는 컴포넌트에 던져 강우영향일을 구한 후 메인화면에 출력해야한다.
+
- 모달 화면에서는 일별 데이터를 추출해 보여준다.
+### 3-2) 유량현황
+ - 시설별 년도별 유량현황을 조회할 수 있는 화면이다.
+
- 화면의 구성은 강수현황과 같이 메인화면에는 1년치 유량정보, 모달로는 하루 단위의 유량정보를 보여주지만 메인화면에서 데이터는 집계되어 추출된다.
+### 3-3) 수질현황
+ - 시설별 년도별 수질현황을 조회할 수 있는 화면이다.
+
- 2021년 이전은 COD, 21년부터는 TOC값을 표출한다. 그것을 구분하기 위해 2021년 이전의 TOC값들은 소괄호로 감싸준다.
+
- 모달에서 '수질 TMS'의 경우에는 운영실태 API가 아닌 물재이용 API에서 데이터를 얻으며 getFetch에서 'wr' 파라미터로 물재이용 데이터를 얻는다.
+
▶︎ api 주소 : http://con.mind-one.co.kr:11080/api/v1/il/getTms/{시설번호}
+## 4. 운영실태
+### 4-1) 오수발생량 추정
+ - 물사용량 : 원래는 연간 월별 물사용량을 연계받아서 사용해야하지만 현재 연계를 받지 못하여 하수유입량의 65%를 물사용량으로 잡았다.
+
- 오수전환율 : 90%로 고정
+
- 오수발생량 추정 : 물사용량 * (100/오수전환율)
+
- 연간 하수유입량과 청천시 하수유입량을 구하기 위해서 1년치 하루단위의 데이터를 가져와 계산이 필요(강우영향일 계산필요)
+
- 물 사용량은 월별로 연계를 받기 때문에 모달에서 하수유입량을 월별로 통계를 구해야 한다.
+
- 계산을 해보면 모달에서 월별 사용량의 평균과 1년치 데이터의 평균은 다르다. 직접 계산해보면 다를 수 밖에 없다. 하지만 값을 맞추기 위해서 모달에서의 평균값을 모달의 데이터가 아닌 1년치 데이터의 평균을 넣고 최대, 최소만 월별 데이터를 기반으로 구한다.
+### 4-2) 지하수유입량 추정
+ -적정여부 = 연간 지하수유입량/연평균 유입하수량*100
+
-지하수 유입량 = 하수처리장 청천시 실제유입량 - (물사용량 × 오수전환율)
+
-모달에서의 오수발생량 전체 평균을 구할 때 평균 하수유입량을 기반으로 한 물사용량이 아닌 현재 월 데이터에서의 평균을 구한것을 넣는다.
+### 4-3) RDII분석
+ -RDII 추정값 : 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD))
+
- RDII 추정시 일강수량 : 하절기 최저 유입 BOD 날짜의 강우량
+
- 적정여부 : 하절기일 때 최저유입 BOD유입유량 > 시설용량 일 경우 초과유입 아니면 적정
\ No newline at end of file
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/drainageEquipment/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/drainageEquipment/page.tsx
index 1b7249efd..fb59cfc13 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/drainageEquipment/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/drainageEquipment/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 - 배수설비 정비현황
+ *
+ * - 배수설비 현황을 조회하는 화면. 2차사업 때 예정인 화면으로 현재 사용되지 않음.
+ */
+
+"use client"
import { useFoStore } from '@/app/store';
import type { DrainageEquipmentListProps, TableUpperProps } from '@/app/store/dashboard';
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/modal/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/modal/page.tsx
index c482e8b7c..850d52528 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/modal/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/modal/page.tsx
@@ -1,4 +1,11 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 - 시설정보 및 운영현황(모달)
+ *
+ * - 유량, 수질, 총인시설의 연간, 하절기, 동절기 단위로 값을 차트로 시각화하여 보여주는 모달화면
+ * - 막대그래프로 모달을 그려준다.
+ */
+
+"use client"
import type { OperationalStatusListProps } from "@/app/store/dashboard";
import { CHART_FORM, MainChart, type ChartConfig } from "@common/business_components";
import { Button } from "@common/business_components/ui/table/lib/button";
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/page.tsx
index fa2a97d9e..dd689f2fa 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/facilityInfo/page.tsx
@@ -1,4 +1,13 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 - 시설정보 및 운영현황
+ *
+ * - 시설정보 및 운영현황 탭의 메인 페이지
+ * - 중앙상단에는 시설에 대한 요약정보가, 좌측 상단은 시설계획에 대한 정보, 좌측하단에는 물사용량에 대한 정보,
+ * 우측에는 조회년도 및 시설에 해당하는 유량 및 수질정보를 연간,하절기,동절기별 추출하여 데이터를 보여준다.
+ * - 우측 운영실태는 연간, 하절기, 동절기별로 색이 칠해져있는데 어떤항목들끼리 차트로 그려지는지 확인하기 위해서다.
+ */
+
+"use client"
import { roundNumber } from "@/app/components/common/DataForm";
import { useFoStore } from "@/app/store";
import type { TableUpperProps } from "@/app/store/processFacility";
@@ -13,7 +22,12 @@ export type facilityInfoProps = {
fcltyList?: { bscFctCd: string, bscFctNm: string, fcltyCpc: number | '', trtFrfNm: string, efflWqltStndrdNm: string }[];
};
-// 시설계획 table header 변경
+/**
+ * 시설계획 table header 변경
+ * @param upHeadList
+ * @param planYearList
+ * @returns
+ */
const headMakeColSpanPlanFclty = (upHeadList: TableUpperProps[], planYearList: string[]) => {
return ( <>
{
@@ -29,6 +43,12 @@ const headMakeColSpanPlanFclty = (upHeadList: TableUpperProps[], planYearList: s
}
// 시설계획 table header 변경
+/**
+ *
+ * @param upHeadList
+ * @param searchYear
+ * @returns
+ */
const headMakeColSpanOperationStatus = (upHeadList: TableUpperProps[], searchYear: string) => {
return ( <>
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
index 3f193e035..82eeb4d7c 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/maingraph/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 - 주요그래프
+ *
+ * - 시설의 조회년도에 해당하는 수질정보, 강우량, 유입량 등을 특정 항목별로 묶어서 차트로 시각화해주는 화면
+ */
+
+"use client"
import { useFoStore } from "@/app/store";
import type { lineChartDataProps } from "@/app/store/dashboard";
import { CHART_FORM, type ChartConfig, ContentsDiv, MainChart } from "@common/business_components";
@@ -63,7 +69,7 @@ export default function DashBoardChart({searchYear = '', fcltyList = []}: facili
color: colors[2],
},
lineVal0: {
- label: '시설용량',
+ label: '지하수유입량',
color: colors[1],
},
lineVal1: {
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx
index 2003addee..77e4168ec 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 대시보드 - 표로보기(메인)
+ *
+ * - 대시보드 - 표로보기 메인페이지로 상단영역의 제어 및 탭 전환 시 보여주는 페이지를 지정해준다.
+ */
+
+"use client"
import { useFoStore } from "@/app/store";
import { ContentsDiv, downloadExcel, downloadMultipleExcel, filePickedBlobArray, MainDiv, SelectBox, UITab, type SelectDataType } from "@common/business_components";
import { Button, TabsContent } from "@common/components/ui";
@@ -153,7 +159,7 @@ export default function DashBoard() {
const excelData1 = planFcltyList.map((item) => {
return [
item.item,
- item.provisionalApproval,
+ Number(item.provisionalApproval.toString().replaceAll(',',''))?Number(item.provisionalApproval.toString().replaceAll(',','')):item.provisionalApproval,
item.now,
item.stepOne,
item.stepTwo,
@@ -165,23 +171,24 @@ export default function DashBoard() {
// operationalStatusList를 2차원 배열로 변환
const excelData2 = operationalStatusList.map((item, index) => {
const baseData = [
- item.yearAvg,
- item.yearMax,
- item.yearMin,
- item.summerAll,
- item.summerThree,
- item.summerRain,
- item.winterAll,
- item.winterSunnyAvg,
- item.winterSunnyMax,
- item.winterSunnyMin,
- item.groundWaterAvg,
- item.groundWaterSummer,
- item.groundWaterWinter
+ Number(item.yearAvg?.replaceAll(',','')),
+ Number(item.yearMax?.replaceAll(',','')),
+ Number(item.yearMin?.replaceAll(',','')),
+ Number(item.summerAll?.replaceAll(',','')),
+ Number(item.summerThree?.replaceAll(',','')),
+ Number(item.summerRain?.replaceAll(',','')),
+ Number(item.winterAll?.replaceAll(',','')),
+ Number(item.winterSunnyAvg?.replaceAll(',','')),
+ Number(item.winterSunnyMax?.replaceAll(',','')),
+ Number(item.winterSunnyMin?.replaceAll(',','')),
+ Number(item.groundWaterAvg?.replaceAll(',','').replaceAll('%','')),
+ Number(item.groundWaterSummer?.replaceAll(',','').replaceAll('%','')),
+ Number(item.groundWaterWinter?.replaceAll(',','').replaceAll('%',''))
];
// index가 0일 때만 rdi와 rdiRain 추가
- return index === 0 ? [...baseData, item.rdi, item.rdiRain] : baseData;
+ console.log(item.rdiRain);
+ return index === 0 ? [...baseData, item.rdi&&item.rdi.toString().trim()!=''?Number(item.rdi.toString().replaceAll(',','')):'', item.rdiRain&&item.rdiRain.toString().trim()!=''?Number(item.rdiRain.toString().replaceAll(',','')):''] : baseData;
});
const sheetParameter = [
@@ -240,7 +247,7 @@ export default function DashBoard() {
const sheetParameter = [
{
- data: [['날짜', '강수량', '유입하수량', '시설용량', '유입BOD', '유입T-P','총인유입T-P', '방류T-P', '유입T-N', '방류T-N'],...yearValueData],
+ data: [['날짜', '강수량', '유입하수량', '지하수유입량', '유입BOD', '유입T-P','총인유입T-P', '방류T-P', '유입T-N', '방류T-N'],...yearValueData],
headerNum: 1,
headerRange: 'A1:J1',
sheetName: '주요그래프'
diff --git a/apps/fo/app/pages/(with-layout)/dashboard/rainManage/page.tsx b/apps/fo/app/pages/(with-layout)/dashboard/rainManage/page.tsx
index 9bceed75e..e084bf04d 100644
--- a/apps/fo/app/pages/(with-layout)/dashboard/rainManage/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboard/rainManage/page.tsx
@@ -1,4 +1,11 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 - 강우일 운영현황
+ *
+ * - 시설의 강우량 구간별(3~10mm미만..10~20mm미만 등) 강우일수 및 수질정보를 표로 보여주는 화면
+ * - 강우영향일 계산후 바뀌는 tobe강우일을 계산해야 한다.
+ */
+
+"use client"
import { useFoStore } from "@/app/store";
import { UiTable } from "@common/business_components/ui/table";
import { useEffect, useState } from "react";
@@ -46,16 +53,17 @@ export default function RainManageTab({searchYear = '', fcltyList = []}: facilit
return (
- {}}
- >
-
+ {}}
+ widthFixed={true}
+ >
+
☞ 일수에 강우영향일 포함됨
)
diff --git a/apps/fo/app/pages/(with-layout)/dashboardMain/page.tsx b/apps/fo/app/pages/(with-layout)/dashboardMain/page.tsx
index 12bf0763c..67e704570 100644
--- a/apps/fo/app/pages/(with-layout)/dashboardMain/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/dashboardMain/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 대시보드 - 표로보기 상단구역 페에지
+ *
+ * - 대시보드 - 표로보기의 3개의 탭 상단에 조회년도, 행정정보, 시설명의 구역을 컴포넌트
+ */
+
+"use client"
import { useFoStore } from "@/app/store";
import { useEffect, useState } from "react";
import SearchInput from "../../../components/common/SearchInput";
diff --git a/apps/fo/app/pages/(with-layout)/facilityPrecipitation/modal/page.tsx b/apps/fo/app/pages/(with-layout)/facilityPrecipitation/modal/page.tsx
index bb430d0ba..e90def9b6 100644
--- a/apps/fo/app/pages/(with-layout)/facilityPrecipitation/modal/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/facilityPrecipitation/modal/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 처리시설 연간 운영현황 - 강수현황(모달)
+ *
+ * - 선택한 시설을 조회한 년도의 하루단위로 강우량 및 강우영향일 정보를 보여주는 화면.
+ */
+
+"use client"
import CalcRainEffect from "@/app/components/common/CalcRainEffect";
import { roundNumber } from "@/app/components/common/DataForm";
import { useFoStore } from "@/app/store";
@@ -105,6 +111,8 @@ export default function PrecipitationModal(props: PrecipitationModalProps) {
const getTableData = () => {
const totals = calculateTotals();
+ totals.infoRnDay = roundNumber(totals.infoRnDay, 1);
+
return [
{
bscFctCd: "",
@@ -220,6 +228,7 @@ export default function PrecipitationModal(props: PrecipitationModalProps) {
cellClick={undefined}
onPageChange={() => {}}
boldArray={[0]}
+ widthFixed={true}
/>
>
diff --git a/apps/fo/app/pages/(with-layout)/facilityPrecipitation/page.tsx b/apps/fo/app/pages/(with-layout)/facilityPrecipitation/page.tsx
index 0d66de569..6c5181549 100644
--- a/apps/fo/app/pages/(with-layout)/facilityPrecipitation/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/facilityPrecipitation/page.tsx
@@ -1,4 +1,10 @@
-"use client"
+/**
+ * 처리시설 연간 운영현황 - 강수현황(메인)
+ *
+ * - 시설별 강수 현황을 조회조건대로 추출하여 표로 보여주는 화면.
+ */
+
+"use client"
import { useFoStore } from "@/app/store";
import type { TableUpperProps } from "@/app/store/common";
import { ContentsDiv, downloadExcel, MainDiv, SearchBaseForm, SearchInput, SelectBox, Title, UiModal, UiTable, type ReturnType } from "@common/business_components";
@@ -6,6 +12,7 @@ import ListDiv from "@common/business_components/ui/list_div";
import { useCallback, useEffect, useRef, useState } from "react";
import PrecipitationModal from "./modal/page";
import LoadingOverlay from "@common/business_components/ui/loadingBar";
+import UnderComment from "@/app/components/common/UnderComment";
export default function FacilityPrecipitation() {
const {Common
@@ -223,9 +230,9 @@ export default function FacilityPrecipitation() {
- index !== undefined && cellClick(index)} headName={"시설별 강수현황"} tableData={mainList} headlist={upheadList} pageSize={10} total={total} resetPageNo={resetPage} onPageChange={handlePageChange} />
+ index !== undefined && cellClick(index)} headName={"시설별 강수현황"} tableData={mainList} headlist={upheadList} pageSize={10} total={total} resetPageNo={resetPage} onPageChange={handlePageChange} widthFixed={true} />
-
☞ 강우일은 3mm 이상만 해당 / 강우영향일은 강우일 및 강우일 후 연속 2일간으로 정의
+
diff --git a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/HeadMakeColSpan.tsx b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/HeadMakeColSpan.tsx
index 61076c105..aa1e36abd 100644
--- a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/HeadMakeColSpan.tsx
+++ b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/HeadMakeColSpan.tsx
@@ -1,3 +1,9 @@
+/**
+ * 처리시설 연간 운영현황 - 수질현황
+ *
+ * - 수질현황의 헤더를 만들어주는 컴포넌트
+ */
+
import { TableHead, TableRow } from "@common/components/ui";
interface TableUpperProps {
diff --git a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx
index d7cad3367..e76778d89 100644
--- a/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx
+++ b/apps/fo/app/pages/(with-layout)/facilityWaterQlty/modal/page.tsx
@@ -1,13 +1,29 @@
-"use client"
+/**
+ * 처리시설 연간 운영현황 - 수질현황
+ *
+ * - 메인화면에서 선택한 시설의 수질정보를 하루단위로 보여주는 모달.
+ */
+
+"use client"
+import CommaToNumber from "@/app/components/common/CommaToNumber";
+import { roundNumber } from "@/app/components/common/DataForm";
+import UnderComment from "@/app/components/common/UnderComment";
import { useFoStore } from "@/app/store";
import type { FacilityWaterQltyProps, modalExcelType } from "@/app/store/facilityWaterQlty";
-import { downloadExcel, UITab, UiTable } from "@common/business_components/ui";
+import { downloadExcelFormat, UITab, UiTable } from "@common/business_components/ui";
import { Button, TabsContent } from "@common/components/ui";
import { useCallback, useEffect, useRef, useState } from "react";
import type { ReturnType } from "../../../../components/common/FacilityTermModalHeader";
import FacilityTermModalHeader from "../../../../components/common/FacilityTermModalHeader";
import { HeadMakeColSpan } from "../HeadMakeColSpan";
-import { roundNumber } from "@/app/components/common/DataForm";
+
+const commentArrayChungchun = [
+ "청천시 : 강우량이 3mm미만의 날"
+];
+
+const commentArrayRain = [
+ "강우량 3mm 이상만 날과 강우영향일(강우일+2일)의 날"
+];
type ModalProps ={
fcltyName: string;
@@ -40,9 +56,10 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
searchFacilityWaterQltyListHist,
Common
} = useFoStore((state) => state);
- const {btnClass} = Common;
+ const {btnClass, COD_YEAR} = Common;
const {
upHeadListModalYear,
+ upHeadListModalYearCod,
facilityWaterQltyYearList,
upHeadListModalTms,
tmsList,
@@ -65,12 +82,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
let maxEfflWqltTn = 0;
let maxEfflWqltTp = 0;
let maxefflWqltToc = 0;
+ let maxefflWqltCod = 0;
let maxEfflWqltSs = 0;
let maxinflAssctBfrWqltBod = 0;
let maxinflAssctBfrWqltTn = 0;
let maxInflAssctBfrWqltTp = 0;
let maxinflAssctBfrWqltToc = 0;
+ let maxinflAssctBfrWqltCod = 0;
let maxinflAssctBfrWqltSs = 0;
let maxTpInflWqltBod = 0;
@@ -84,12 +103,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
let minEfflWqltTn = filteredData.length > 0 ? parseNumber(filteredData[0]?.efflWqltTn) : 0;
let minEfflWqltTp = filteredData.length > 0 ? parseNumber(filteredData[0]?.efflWqltTp) : 0;
let minefflWqltToc = filteredData.length > 0 ? parseNumber(filteredData[0]?.efflWqltToc) : 0;
+ let minefflWqltCod = filteredData.length > 0 ? parseNumber(filteredData[0]?.efflWqltCod) : 0;
let minEfflWqltSs = filteredData.length > 0 ? parseNumber(filteredData[0]?.efflWqltSs) : 0;
let mininflAssctBfrWqltBod = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltBod) : 0;
let mininflAssctBfrWqltTn = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltTn) : 0;
let minInflAssctBfrWqltTp = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltTp) : 0;
let mininflAssctBfrWqltToc = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltToc) : 0;
+ let mininflAssctBfrWqltCod = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltCod) : 0;
let mininflAssctBfrWqltSs = filteredData.length > 0 ? parseNumber(filteredData[0]?.inflAssctBfrWqltSs) : 0;
let minTpInflWqltBod = 99999999;
@@ -101,12 +122,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
let avgEfflWqltTn = 0;
let avgEfflWqltTp = 0;
let avgefflWqltToc = 0;
+ let avgefflWqltCod = 0;
let avgEfflWqltSs = 0;
let avginflAssctBfrWqltBod = 0;
let avginflAssctBfrWqltTn = 0;
let avgInflAssctBfrWqltTp = 0;
let avginflAssctBfrWqltToc = 0;
+ let avginflAssctBfrWqltCod = 0;
let avginflAssctBfrWqltSs = 0;
let avgTpInflWqltBod = 0;
@@ -123,11 +146,13 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
const efflWqltTn = parseNumber(item.efflWqltTn);
const efflWqltTp = parseNumber(item.efflWqltTp);
const efflWqltToc = parseNumber(item.efflWqltToc);
+ const efflWqltCod = parseNumber(item.efflWqltCod?item.efflWqltCod.replaceAll("(","").replaceAll(")",""):0);
const efflWqltSs = parseNumber(item.efflWqltSs);
const inflAssctBfrWqltBod = parseNumber(item.inflAssctBfrWqltBod);
const inflAssctBfrWqltTn = parseNumber(item.inflAssctBfrWqltTn);
const inflAssctBfrWqltTp = parseNumber(item.inflAssctBfrWqltTp);
const inflAssctBfrWqltToc = parseNumber(item.inflAssctBfrWqltToc);
+ const inflAssctBfrWqltCod = parseNumber(item.inflAssctBfrWqltCod?item.inflAssctBfrWqltCod.replaceAll("(","").replaceAll(")",""):0);
const inflAssctBfrWqltSs = parseNumber(item.inflAssctBfrWqltSs);
const tpInflWqltBod = parseNumber(item.tpInflWqltBod);
@@ -145,12 +170,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
maxEfflWqltTn = Math.max(maxEfflWqltTn, efflWqltTn);
maxEfflWqltTp = Math.max(maxEfflWqltTp, efflWqltTp);
maxefflWqltToc = Math.max(maxefflWqltToc, efflWqltToc);
+ maxefflWqltCod = Math.max(maxefflWqltCod, efflWqltCod);
maxEfflWqltSs = Math.max(maxEfflWqltSs, efflWqltSs);
maxinflAssctBfrWqltBod = Math.max(maxinflAssctBfrWqltBod, inflAssctBfrWqltBod);
maxinflAssctBfrWqltTn = Math.max(maxinflAssctBfrWqltTn, inflAssctBfrWqltTn);
maxInflAssctBfrWqltTp = Math.max(maxInflAssctBfrWqltTp, inflAssctBfrWqltTp);
maxinflAssctBfrWqltToc = Math.max(maxinflAssctBfrWqltToc, inflAssctBfrWqltToc);
+ maxinflAssctBfrWqltCod = Math.max(maxinflAssctBfrWqltCod, inflAssctBfrWqltCod);
maxinflAssctBfrWqltSs = Math.max(maxinflAssctBfrWqltSs, inflAssctBfrWqltSs);
maxTpInflWqltBod = Math.max(maxTpInflWqltBod, tpInflWqltBod);
@@ -162,12 +189,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
minEfflWqltTn = Math.min(minEfflWqltTn, efflWqltTn);
minEfflWqltTp = Math.min(minEfflWqltTp, efflWqltTp);
minefflWqltToc = Math.min(minefflWqltToc, efflWqltToc);
+ minefflWqltCod = Math.min(minefflWqltCod, efflWqltCod);
minEfflWqltSs = Math.min(minEfflWqltSs, efflWqltSs);
mininflAssctBfrWqltBod = Math.min(mininflAssctBfrWqltBod, inflAssctBfrWqltBod);
mininflAssctBfrWqltTn = Math.min(mininflAssctBfrWqltTn, inflAssctBfrWqltTn);
minInflAssctBfrWqltTp = Math.min(minInflAssctBfrWqltTp, inflAssctBfrWqltTp);
mininflAssctBfrWqltToc = Math.min(mininflAssctBfrWqltToc, inflAssctBfrWqltToc);
+ mininflAssctBfrWqltCod = Math.min(mininflAssctBfrWqltToc, inflAssctBfrWqltCod);
mininflAssctBfrWqltSs = Math.min(mininflAssctBfrWqltSs, inflAssctBfrWqltSs);
if(item.tpInflWqltBod != null && item.tpInflWqltBod.trim() != '' && item.tpInflWqltBod != undefined ){
@@ -185,12 +214,14 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
avgEfflWqltTn += efflWqltTn;
avgEfflWqltTp += efflWqltTp;
avgefflWqltToc += efflWqltToc;
+ avgefflWqltCod += efflWqltCod;
avgEfflWqltSs += efflWqltSs;
avginflAssctBfrWqltBod += inflAssctBfrWqltBod;
avginflAssctBfrWqltTn += inflAssctBfrWqltTn;
avgInflAssctBfrWqltTp += inflAssctBfrWqltTp;
avginflAssctBfrWqltToc += inflAssctBfrWqltToc;
+ avginflAssctBfrWqltCod += inflAssctBfrWqltCod;
avginflAssctBfrWqltSs += inflAssctBfrWqltSs;
if(item.noProcessInflAmnt && item.noProcessInflAmnt.toString().trim() != '' && item.noProcessInflAmnt != undefined){
@@ -207,16 +238,18 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
const newFilteredData = [
{
msrDt: '평균',
- efflWqltBod: filteredData.length==0?'0.0':(Math.round(avgEfflWqltBod / filteredData.length * 10) / 10).toFixed(1),
- efflWqltToc: filteredData.length==0?'0.0':(Math.round(avgefflWqltToc / filteredData.length * 10) / 10).toFixed(1),
- efflWqltSs: filteredData.length==0?'0.0':(Math.round(avgEfflWqltSs / filteredData.length * 10) / 10).toFixed(1),
- efflWqltTn: filteredData.length==0?'0.000':(Math.round(avgEfflWqltTn / filteredData.length * 1000) / 1000).toFixed(3),
- efflWqltTp: filteredData.length==0?'0.000':(Math.round(avgEfflWqltTp / filteredData.length * 1000) / 1000).toFixed(3),
- inflAssctBfrWqltBod: filteredData.length==0?'0.0':(Math.round(avginflAssctBfrWqltBod / filteredData.length * 10) / 10).toFixed(1),
- inflAssctBfrWqltTn: filteredData.length==0?'0.000':(Math.round(avginflAssctBfrWqltTn / filteredData.length * 1000) / 1000).toFixed(3),
- inflAssctBfrWqltTp: filteredData.length==0?'0.000':(Math.round(avgInflAssctBfrWqltTp / filteredData.length * 1000) / 1000).toFixed(3),
- inflAssctBfrWqltToc: filteredData.length==0?'0.0':(Math.round(avginflAssctBfrWqltToc / filteredData.length * 10) / 10).toFixed(1),
- inflAssctBfrWqltSs: filteredData.length==0?'0.0':(Math.round(avginflAssctBfrWqltSs / filteredData.length * 10) / 10).toFixed(1),
+ efflWqltBod: filteredData.length==0 || avgEfflWqltBod===0?'0.0':roundNumber((avgEfflWqltBod / filteredData.length), 1),
+ efflWqltToc: filteredData.length==0 || avgefflWqltToc===0?'0.0':roundNumber((avgefflWqltToc / filteredData.length), 1),
+ efflWqltCod: filteredData.length==0 || avgefflWqltCod===0?"(0.0)":"("+roundNumber((avgefflWqltCod / filteredData.length), 1)+")",
+ efflWqltSs: filteredData.length==0 || avgEfflWqltSs===0?'0.0':roundNumber((avgEfflWqltSs / filteredData.length), 1),
+ efflWqltTn: filteredData.length==0 || avgEfflWqltTn ===0?'0.000':roundNumber((avgEfflWqltTn / filteredData.length), 3),
+ efflWqltTp: filteredData.length==0 || avgEfflWqltTp ===0?'0.000':roundNumber((avgEfflWqltTp / filteredData.length), 3),
+ inflAssctBfrWqltBod: filteredData.length==0 || avginflAssctBfrWqltBod===0?'0.0':roundNumber((avginflAssctBfrWqltBod / filteredData.length), 1),
+ inflAssctBfrWqltTn: filteredData.length==0 || avginflAssctBfrWqltTn===0?'0.000':roundNumber((avginflAssctBfrWqltTn / filteredData.length), 3),
+ inflAssctBfrWqltTp: filteredData.length==0 || avgInflAssctBfrWqltTp===0?'0.000':roundNumber((avgInflAssctBfrWqltTp / filteredData.length), 3),
+ inflAssctBfrWqltToc: filteredData.length==0 || avginflAssctBfrWqltToc===0?'0.0':roundNumber((avginflAssctBfrWqltToc / filteredData.length), 1),
+ inflAssctBfrWqltCod: filteredData.length==0 || avginflAssctBfrWqltCod===0?'(0.0)':"("+roundNumber((avginflAssctBfrWqltCod / filteredData.length), 1)+")",
+ inflAssctBfrWqltSs: filteredData.length==0 || avginflAssctBfrWqltSs===0?'0.0':roundNumber((avginflAssctBfrWqltSs / filteredData.length), 1),
bscFctCd: "",
bscFctNm: "",
lclgvrnmntNm: "",
@@ -225,22 +258,24 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
addr: "",
fctCpc: 0,
noProcessInflAmnt : roundNumber(avgNoProcessInflAmnt / noProcessInflAmntCnt, 0),
- infoRnDay: filteredData.length==0?'0.0':(Math.round(avgInfoRnDay / filteredData.length * 10) / 10).toFixed(1),
- tpInflWqltBod: filteredData.length==0?'0.0':(Math.round(avgTpInflWqltBod / tpInflWqltBodCnt * 10) / 10).toFixed(1),
- tpInflWqltTp: filteredData.length==0?'0.000':(Math.round(avgTpInflWqltTp / tpInflWqltTpCnt * 1000) / 1000).toFixed(3)
+ infoRnDay: filteredData.length==0 || avgInfoRnDay===0?'0.0':roundNumber(avgInfoRnDay / filteredData.length, 1),
+ tpInflWqltBod: filteredData.length==0 || avgTpInflWqltBod ===0 ?'0.0':roundNumber(avgTpInflWqltBod / tpInflWqltBodCnt, 1),
+ tpInflWqltTp: filteredData.length==0 || avgTpInflWqltTp === 0?'0.000':roundNumber(avgTpInflWqltTp / tpInflWqltTpCnt, 3)
},
{
msrDt : '최대',
- efflWqltBod : Math.round(maxEfflWqltBod * 10) / 10?(Math.round(maxEfflWqltBod * 10) / 10).toFixed(1):'0.0',
- efflWqltToc : Math.round(maxefflWqltToc * 10) / 10?(Math.round(maxefflWqltToc * 10) / 10).toFixed(1):'0.0',
- efflWqltSs : Math.round(maxEfflWqltSs * 10) / 10?(Math.round(maxEfflWqltSs * 10) / 10).toFixed(1):'0.0',
- efflWqltTn : Math.round(maxEfflWqltTn * 1000) / 1000?(Math.round(maxEfflWqltTn * 1000) / 1000).toFixed(3):'0.000',
- efflWqltTp : Math.round(maxEfflWqltTp * 1000) / 1000?(Math.round(maxEfflWqltTp * 1000) / 1000).toFixed(3):'0.000',
- inflAssctBfrWqltBod : Math.round(maxinflAssctBfrWqltBod * 10) / 10?(Math.round(maxinflAssctBfrWqltBod * 10) / 10).toFixed(1):'0.0',
- inflAssctBfrWqltTn : Math.round(maxinflAssctBfrWqltTn * 1000) / 1000?(Math.round(maxinflAssctBfrWqltTn * 1000) / 1000).toFixed(3):'0.000',
- inflAssctBfrWqltTp : Math.round(maxInflAssctBfrWqltTp * 1000) / 1000?(Math.round(maxInflAssctBfrWqltTp * 1000) / 1000).toFixed(3):'0.000',
- inflAssctBfrWqltToc : Math.round(maxinflAssctBfrWqltToc * 10) / 10?(Math.round(maxinflAssctBfrWqltToc * 10) / 10).toFixed(1):'0.0',
- inflAssctBfrWqltSs : Math.round(maxinflAssctBfrWqltSs * 10) / 10?(Math.round(maxinflAssctBfrWqltSs * 10) / 10).toFixed(1):'0.0',
+ efflWqltBod : Math.round(maxEfflWqltBod * 10) / 10?roundNumber(maxEfflWqltBod, 1):'0.0',
+ efflWqltToc : Math.round(maxefflWqltToc * 10) / 10?roundNumber(maxefflWqltToc, 1):'0.0',
+ efflWqltCod : Math.round(maxefflWqltCod * 10) / 10?"("+roundNumber(maxefflWqltCod, 1)+")":'(0.0)',
+ efflWqltSs : Math.round(maxEfflWqltSs * 10) / 10?roundNumber(maxEfflWqltSs, 1):'0.0',
+ efflWqltTn : Math.round(maxEfflWqltTn * 1000) / 1000?roundNumber(maxEfflWqltTn, 3):'0.000',
+ efflWqltTp : Math.round(maxEfflWqltTp * 1000) / 1000?roundNumber(maxEfflWqltTp, 3):'0.000',
+ inflAssctBfrWqltBod : Math.round(maxinflAssctBfrWqltBod * 10) / 10?roundNumber(maxinflAssctBfrWqltBod, 1):'0.0',
+ inflAssctBfrWqltTn : Math.round(maxinflAssctBfrWqltTn * 1000) / 1000?roundNumber(maxinflAssctBfrWqltTn, 3):'0.000',
+ inflAssctBfrWqltTp : Math.round(maxInflAssctBfrWqltTp * 1000) / 1000?roundNumber(maxInflAssctBfrWqltTp, 3):'0.000',
+ inflAssctBfrWqltToc : Math.round(maxinflAssctBfrWqltToc * 10) / 10?roundNumber(maxinflAssctBfrWqltToc, 1):'0.0',
+ inflAssctBfrWqltCod : Math.round(maxinflAssctBfrWqltCod * 10) / 10?"("+roundNumber(maxinflAssctBfrWqltCod, 1)+")":'(0.0)',
+ inflAssctBfrWqltSs : Math.round(maxinflAssctBfrWqltSs * 10) / 10?roundNumber(maxinflAssctBfrWqltSs, 1):'0.0',
bscFctCd: "",
bscFctNm: "",
lclgvrnmntNm: "",
@@ -249,22 +284,24 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
addr: "",
fctCpc: 0,
noProcessInflAmnt : roundNumber(maxNoProcessInflAmnt, 0),
- infoRnDay: Math.round(maxInfoRnDay * 10) / 10?(Math.round(maxInfoRnDay * 10) / 10).toFixed(1):'0.0',
- tpInflWqltBod: Math.round(maxTpInflWqltBod * 10) / 10?(Math.round(maxTpInflWqltBod * 10) / 10).toFixed(1):'0.0',
- tpInflWqltTp: Math.round(maxTpInflWqltTp * 1000) / 1000?(Math.round(maxTpInflWqltTp * 1000) / 1000).toFixed(3):'0.000'
+ infoRnDay: Math.round(maxInfoRnDay * 10) / 10?roundNumber(maxInfoRnDay, 1):'0.0',
+ tpInflWqltBod: Math.round(maxTpInflWqltBod * 10) / 10?roundNumber(maxTpInflWqltBod, 1):'0.0',
+ tpInflWqltTp: Math.round(maxTpInflWqltTp * 1000) / 1000?roundNumber(maxTpInflWqltTp, 3):'0.000'
},
{
msrDt : '최소',
- efflWqltBod : Math.round(minEfflWqltBod * 10) / 10?(Math.round(minEfflWqltBod * 10) / 10).toFixed(1) : '0.0',
- efflWqltToc : Math.round(minefflWqltToc * 10) / 10?(Math.round(minefflWqltToc * 10) / 10).toFixed(1) : '0.0',
- efflWqltSs : Math.round(minEfflWqltSs * 10) / 10?(Math.round(minEfflWqltSs * 10) / 10).toFixed(1) : '0.0',
- efflWqltTn : Math.round(minEfflWqltTn * 1000) / 1000?(Math.round(minEfflWqltTn * 1000) / 1000).toFixed(3) : '0.000',
- efflWqltTp : Math.round(minEfflWqltTp * 1000) / 1000?(Math.round(minEfflWqltTp * 1000) / 1000).toFixed(3) : '0.000',
- inflAssctBfrWqltBod : Math.round(mininflAssctBfrWqltBod * 10) / 10?(Math.round(mininflAssctBfrWqltBod * 10) / 10).toFixed(1) : '0.0',
- inflAssctBfrWqltTn : Math.round(mininflAssctBfrWqltTn * 1000) / 1000?(Math.round(mininflAssctBfrWqltTn * 1000) / 1000).toFixed(3) : '0.000',
- inflAssctBfrWqltTp : Math.round(minInflAssctBfrWqltTp * 1000) / 1000?(Math.round(minInflAssctBfrWqltTp * 1000) / 1000).toFixed(3) : '0.000',
- inflAssctBfrWqltToc : Math.round(mininflAssctBfrWqltToc * 10) / 10?(Math.round(mininflAssctBfrWqltToc * 10) / 10).toFixed(1) : '0.0',
- inflAssctBfrWqltSs : Math.round(mininflAssctBfrWqltSs * 10) / 10?(Math.round(mininflAssctBfrWqltSs * 10) / 10).toFixed(1) : '0.0',
+ efflWqltBod : Math.round(minEfflWqltBod * 10) / 10?roundNumber(minEfflWqltBod, 1) : '0.0',
+ efflWqltToc : Math.round(minefflWqltToc * 10) / 10?roundNumber(minefflWqltToc, 1) : '0.0',
+ efflWqltCod : Math.round(minefflWqltCod * 10) / 10?"("+roundNumber(minefflWqltCod, 1)+")" : '(0.0)',
+ efflWqltSs : Math.round(minEfflWqltSs * 10) / 10?roundNumber(minEfflWqltSs, 1) : '0.0',
+ efflWqltTn : Math.round(minEfflWqltTn * 1000) / 1000?roundNumber(minEfflWqltTn, 3) : '0.000',
+ efflWqltTp : Math.round(minEfflWqltTp * 1000) / 1000?roundNumber(minEfflWqltTp, 3) : '0.000',
+ inflAssctBfrWqltBod : Math.round(mininflAssctBfrWqltBod * 10) / 10?roundNumber(mininflAssctBfrWqltBod, 1) : '0.0',
+ inflAssctBfrWqltTn : Math.round(mininflAssctBfrWqltTn * 1000) / 1000?roundNumber(mininflAssctBfrWqltTn, 3) : '0.000',
+ inflAssctBfrWqltTp : Math.round(minInflAssctBfrWqltTp * 1000) / 1000?roundNumber(minInflAssctBfrWqltTp, 3) : '0.000',
+ inflAssctBfrWqltToc : Math.round(mininflAssctBfrWqltToc * 10) / 10?roundNumber(mininflAssctBfrWqltToc, 1) : '0.0',
+ inflAssctBfrWqltCod : Math.round(mininflAssctBfrWqltCod * 10) / 10?"("+roundNumber(mininflAssctBfrWqltCod, 1)+")" : '(0.0)',
+ inflAssctBfrWqltSs : Math.round(mininflAssctBfrWqltSs * 10) / 10?roundNumber(mininflAssctBfrWqltSs, 1) : '0.0',
bscFctCd: "",
bscFctNm: "",
lclgvrnmntNm: "",
@@ -273,9 +310,9 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
addr: "",
fctCpc: 0,
noProcessInflAmnt : roundNumber(minNoProcessInflAmnt, 0),
- infoRnDay: Math.round(minInfoRnDay * 10) / 10?'0.0':(Math.round(minInfoRnDay * 10) / 10).toFixed(1),
- tpInflWqltBod: Math.round(minTpInflWqltBod * 10) / 10 && minTpInflWqltBod != 99999999?(Math.round(minTpInflWqltBod * 10) / 10).toFixed(1):'0.0',
- tpInflWqltTp: Math.round(minTpInflWqltTp * 1000) / 1000 && minTpInflWqltTp != 99999999?(Math.round(minTpInflWqltTp * 1000) / 1000).toFixed(3):'0.000'
+ infoRnDay: Math.round(minInfoRnDay * 10) / 10?'0.0':roundNumber(minInfoRnDay, 1),
+ tpInflWqltBod: Math.round(minTpInflWqltBod * 10) / 10 && minTpInflWqltBod != 99999999?roundNumber(minTpInflWqltBod, 1):'0.0',
+ tpInflWqltTp: Math.round(minTpInflWqltTp * 1000) / 1000 && minTpInflWqltTp != 99999999?roundNumber(minTpInflWqltTp, 3):'0.000'
},
...filteredData
];
@@ -319,22 +356,29 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
copyYearList.forEach((item) => {
excelDownList.push({
날짜: item.msrDt,
- "유입BOD(mg/L)": item.inflAssctBfrWqltBod,
- "유입TOC(COD)(mg/L)": item.inflAssctBfrWqltToc,
- "유입SS(mg/L)": item.inflAssctBfrWqltSs,
- "유입TN(mg/L)": item.inflAssctBfrWqltTn,
- "유입TP(mg/L)": item.inflAssctBfrWqltTp,
- "유출BOD(mg/L)": item.efflWqltBod,
- "유출TOC(COD)(mg/L)": item.efflWqltToc,
- "유출SS(mg/L)": item.efflWqltSs,
- "유출TN(mg/L)": item.efflWqltTn,
- "유출TP(mg/L)": item.efflWqltTp,
-/* "강우량(mm/일)": item.infoRnDay?item.infoRnDay.toString():"0.0", */
+ "유입BOD(mg/L)": CommaToNumber(item.inflAssctBfrWqltBod),
+ "유입TOC(COD)(mg/L)": CommaToNumber(item.inflAssctBfrWqltToc),
+ "유입SS(mg/L)": CommaToNumber(item.inflAssctBfrWqltSs),
+ "유입TN(mg/L)": CommaToNumber(item.inflAssctBfrWqltTn),
+ "유입TP(mg/L)": CommaToNumber(item.inflAssctBfrWqltTp),
+ "유출BOD(mg/L)": CommaToNumber(item.efflWqltBod),
+ "유출TOC(COD)(mg/L)": CommaToNumber(item.efflWqltToc),
+ "유출SS(mg/L)": CommaToNumber(item.efflWqltSs),
+ "유출TN(mg/L)": CommaToNumber(item.efflWqltTn),
+ "유출TP(mg/L)": CommaToNumber(item.efflWqltTp),
+ "강우량(mm/일)": CommaToNumber(item.infoRnDay?item.infoRnDay.toString():"0.0"),
});
});
}
if (excelDownList && excelDownList.length > 0) {
- downloadExcel({ data: JSON.parse(JSON.stringify(excelDownList)), fileName: searchYear+'년 '+fcltyName + ' 수질현황', sheetNameArray: [fcltyName + ' 수질현황'], headerRange: 'A1:K1' });
+ downloadExcelFormat(
+ { data: JSON.parse(JSON.stringify(excelDownList))
+ , fileName: searchYear+'년 '+fcltyName + ' 수질현황'
+ , sheetNameArray: [fcltyName + ' 수질현황']
+ , headerRange: 'A1:L1'
+ , decimalArray1: [1,2,3,6,7,8,11]
+ , decimalArray3: [4,5,9,10]
+ });
} else if (prevExcelListRef.current && prevExcelListRef.current.length > 0) {
alert('다운받을 데이터가 없습니다.');
}
@@ -364,7 +408,7 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe
- {msrmtDate != yesterDayStr?.replaceAll('-','')?※전날 데이터 결측으로 인해 가장 최근 데이터 표출함
: ''}
+ {msrmtDate != yesterDayStr?.replaceAll('-','') ? (
+
+ ) : null}
@@ -410,7 +456,7 @@ export default function WaterQualityModal({fcltyName='', facilityCd='', searchYe