463 lines
21 KiB
TypeScript
463 lines
21 KiB
TypeScript
import { getFetch } from "@/app/components/api";
|
|
//import CalcRainEffect from "@/app/components/common/CalcRainEffect";
|
|
import DataForm, { roundNumber } from "@/app/components/common/DataForm";
|
|
import type { TableUpperProps } from "../dashboard";
|
|
//import { fetchFacilityWaterQltyListHist } from "../facilityWaterQlty";
|
|
import { fetchFacilityRdiiDetailList } from "../facilityWaterQlty";
|
|
//import type { FlowResponse } from "../sewageOccur";
|
|
export type { TableUpperProps };
|
|
/**====================================
|
|
* Store - 타입
|
|
====================================*/
|
|
|
|
/**
|
|
* (1) 메인페이지
|
|
*/
|
|
// 시설별 강수현황
|
|
export type RdiProps = {
|
|
bscFctCd : string,
|
|
sido : string,
|
|
gugun : string,
|
|
bscFctNm : string,
|
|
lclgvrnmntNm : string,
|
|
daddr : string,
|
|
fctCpc : number,
|
|
summerMinBodValue : number | '',
|
|
inflAmnt : number | string | '',
|
|
winterAvgBodLowRainfall : number | '',
|
|
rdiiValue : number | '',
|
|
infoRnDay : number | '',
|
|
rgnNm : string,
|
|
rvbsn : string,
|
|
lgbsn : string,
|
|
mdmbsn : string,
|
|
rainEffectDay : number | '', // 강우영향일
|
|
chungchunFlow : string | number | '',
|
|
rainCalInflAmnt : string | number | '',
|
|
properYn : string,
|
|
}
|
|
|
|
export interface RdiInterface {
|
|
bscFctCd : string,
|
|
sido : string,
|
|
gugun : string,
|
|
bscFctNm : string,
|
|
lclgvrnmntNm : string,
|
|
daddr : string,
|
|
fctCpc : number,
|
|
summerMinBodValue : number,
|
|
inflAmnt : number,
|
|
winterAvgBodLowRainfall : number,
|
|
rdiiValue : number,
|
|
infoRnDay : number | string,
|
|
rgnNm : string,
|
|
rvbsn : string,
|
|
lgbsn : string,
|
|
mdmbsn : string,
|
|
rainEffectDay : number, // 강우영향일
|
|
chungchunFlow : string | number | '',
|
|
rainCalInflAmnt : string | number | '',
|
|
properYn : string,
|
|
}
|
|
|
|
// 모달
|
|
export interface RdiInputModalProps {
|
|
msrDt : string,
|
|
realSewageInput : number | '',
|
|
sewageOccur : number | '',
|
|
underWaterInput : number | '',
|
|
}
|
|
|
|
/**====================================
|
|
* Store - data
|
|
====================================*/
|
|
|
|
/**
|
|
* (1) 메인페이지
|
|
*/
|
|
// 검색단
|
|
const LabelArray:string[] = ['구분', '시도', '시군구','용량별', '시설명', '조회기간', '시설상태', '권역', '단위유역', '중권역', '환경청별'];
|
|
|
|
export interface ExcelType {
|
|
시설코드: string,
|
|
권역:string|'',
|
|
단위유역:string|'',
|
|
중권역:string|'',
|
|
환경청:string|'',
|
|
시도: string,
|
|
시군구: string,
|
|
시설명: string,
|
|
주소: string,
|
|
"시설용량(m³/일)": number,
|
|
"청천시유입하수량(m³/일)": string | number | '',
|
|
"하절기강우일최저유입BOD(mg/L)": number | '',
|
|
"하절기최저유입BOD유입유량(m³/일)": number | string | '',
|
|
"동절기청천시유입BOD(mg/L)": number | '',
|
|
"RDII추정" : number | '',
|
|
"RDII추정시일강수량(mm)": number | '',
|
|
"강우시총추정유입량(m³/일)" : string | number | '',
|
|
적정여부 : string,
|
|
}
|
|
|
|
// 리스트 헤더
|
|
const upHeadList1:TableUpperProps[] = [
|
|
{ id: "A", title: "행정구역", row:0, colSpan:2 },
|
|
{ id: "sido", title: "시도", row:1, widthPercent: 6 },
|
|
{ id: "gugun", title: "시군구", row:1, widthPercent: 6 },
|
|
{ id: "bscFctNm", title: "시설명", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "daddr", title: "주소", row:0, rowSpan:2 },
|
|
{ id: "fctCpc", title: "시설용량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "B", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 },
|
|
{ id: "summerMinBodValue", title: "3mm 이상 강우일 중\n최저 유입BOD\n(mg/L)", align:"right", row:1, widthPercent: 7 },
|
|
{ id: "inflAmnt", title: "하절기최저유입\nBOD유입유량\n(m³/일)", row:1, align:"right", widthPercent: 7 },
|
|
{ id: "C", title: "동절기 운영현황(1~2월)", row:0 },
|
|
{ id: "winterAvgBodLowRainfall", title: "청천시 유입BOD\n(mg/L)", row:1, align:"right", widthPercent: 8 },
|
|
{ id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right", widthPercent: 8 },
|
|
{ id: "infoRnDay", title: "RDII추정시\n일강수량\n(mm)", row:0, rowSpan:2, align:"right", widthPercent: 7 },
|
|
{ id: "rainCalInflAmnt", title: "강우시\n총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right", widthPercent: 6 },
|
|
{ id: "properYn", title: "적정여부", row:0, rowSpan:2, widthPercent: 6 },
|
|
];
|
|
|
|
const upHeadList2:TableUpperProps[] = [
|
|
{ id: "A", title: "유역", row:0, colSpan:3 },
|
|
{ id: "rvbsn", title: "권역", row:1, widthPercent: 5 },
|
|
{ id: "lgbsn", title: "단위유역", row:1, widthPercent: 5 },
|
|
{ id: "mdmbsn", title: "중권역", row:1, widthPercent: 5 },
|
|
{ id: "bscFctNm", title: "시설명", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "daddr", title: "주소", row:0, rowSpan:2 },
|
|
{ id: "fctCpc", title: "시설용량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 7 },
|
|
{ id: "B", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 },
|
|
{ id: "summerMinBodValue", title: "3mm 이상 강우일 중\n최저 유입BOD\n(mg/L)", align:"right", row:1, widthPercent: 7 },
|
|
{ id: "inflAmnt", title: "하절기최저유입\nBOD유입유량\n(m³/일)", row:1, align:"right", widthPercent: 7 },
|
|
{ id: "D", title: "동절기 운영현황(1~2월)", row:0 },
|
|
{ id: "winterAvgBodLowRainfall", title: "청천시 유입BOD\n(mg/L)", row:1, align:"right", widthPercent: 8 },
|
|
{ id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right", widthPercent: 7 },
|
|
{ id: "infoRnDay", title: "RDII추정시\n일강수량\n(mm)", row:0, rowSpan:2, align:"right", widthPercent: 7 },
|
|
{ id: "rainCalInflAmnt", title: "강우시\n총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right", widthPercent: 6 },
|
|
{ id: "properYn", title: "적정여부", row:0, rowSpan:2, widthPercent: 6 },
|
|
];
|
|
|
|
const upHeadList3:TableUpperProps[] = [
|
|
{ id: "A", title: "유역", row:0, colSpan:3 },
|
|
{ id: "rvbsn", title: "권역", row:1, widthPercent: 4 },
|
|
{ id: "lgbsn", title: "단위유역", row:1, widthPercent: 4 },
|
|
{ id: "mdmbsn", title: "중권역", row:1, widthPercent: 4 },
|
|
{ id: "rgnNm", title: "환경청", row:0, rowSpan:2, widthPercent: 6 },
|
|
{ id: "B", title: "행정구역", row:0, colSpan:2 },
|
|
{ id: "sido", title: "시도", upName:"upChangeRe2", upSequnce:1, row:1, widthPercent: 4 },
|
|
{ id: "gugun", title: "시군구", upName:"upChangeRe2",upSequnce:2, row:1, widthPercent: 4 },
|
|
{ id: "bscFctNm", title: "시설명", row:0, rowSpan:2, widthPercent: 6 },
|
|
{ id: "daddr", title: "주소", row:0, rowSpan:2 },
|
|
{ id: "fctCpc", title: "시설용량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 5 },
|
|
{ id: "chungchunFlow", title: "청천시 유입하수량\n(m³/일)", align:"right", row:0, rowSpan:2, widthPercent: 6 },
|
|
{ id: "C", title: "하절기 운영현황(6~8월)", row:0, colSpan:2 },
|
|
{ id: "summerMinBodValue", title: "3mm 이상 강우일 중\n최저 유입BOD\n(mg/L)", align:"right", row:1, widthPercent: 6 },
|
|
{ id: "inflAmnt", title: "하절기최저유입\nBOD유입유량\n(m³/일)", row:1, align:"right", widthPercent: 6 },
|
|
{ id: "D", title: "동절기 운영현황(1~2월)", row:0 },
|
|
{ id: "winterAvgBodLowRainfall", title: "청천시 유입BOD\n(mg/L)", row:1, align:"right", widthPercent: 8 },
|
|
{ id: "rdiiValue", title: "RDII추정", row:0, rowSpan:2, align:"right", widthPercent: 6 },
|
|
{ id: "infoRnDay", title: "RDII추정시\n일강수량\n(mm)", row:0, rowSpan:2, align:"right", widthPercent: 6 },
|
|
{ id: "rainCalInflAmnt", title: "강우시\n총 추정유입량\n(m³/일)", row:0, rowSpan:2, align:"right", widthPercent: 6 },
|
|
{ id: "properYn", title: "적정여부", row:0, rowSpan:2, widthPercent: 6 },
|
|
];
|
|
|
|
const rdiList:RdiProps[] = [
|
|
]
|
|
|
|
/**====================================
|
|
* Store - API
|
|
====================================*/
|
|
|
|
const fetchRdiList = async (pageNo: number, pageSize: number, searchYear: string, partCd?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => {
|
|
try{
|
|
const tailStr = partCd ? '/'+ partCd + '/' + nameCd + '/' + fcltCpct + '/' + operationValue + (fcltyNm && fcltyNm !== '' ? '/' + fcltyNm : '') : '';
|
|
const url = '/rdii/list/' + pageNo + '/' + pageSize + '/' + searchYear + tailStr;
|
|
const res = await getFetch('fo', url);
|
|
|
|
res.data.forEach((item: RdiProps) => {
|
|
item.fctCpc = item.fctCpc && item.fctCpc > 0 ? Number(item.fctCpc.toString().trim()) : 0;
|
|
item.summerMinBodValue = '';
|
|
item.inflAmnt = '';
|
|
item.winterAvgBodLowRainfall = '';
|
|
item.rdiiValue = '';
|
|
item.infoRnDay = '';
|
|
item.properYn = '';
|
|
// item.sido = item.lclgvrnmntNm.split(' ')[0]?.toString() || '';
|
|
// item.gugun = item.lclgvrnmntNm.split(' ')[1]?.toString() || '';
|
|
item.sido = item.sido;
|
|
item.gugun = item.gugun;
|
|
});
|
|
return { data: res.data, count: res.count }
|
|
}catch(error){
|
|
console.log(error);
|
|
return { data: rdiList, count: 0 };
|
|
}
|
|
}
|
|
|
|
/**====================================
|
|
* Store - expaort
|
|
====================================*/
|
|
export type RdiActions = {
|
|
resetExcelList: () => void;
|
|
searchRdiList: (pageNo: number, pageSize: number, searchYear: string, partCd?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => void;
|
|
}
|
|
|
|
export type RdiType = {
|
|
RdiSearch: {
|
|
isInit: boolean;
|
|
labelArray:string[];
|
|
},
|
|
|
|
Rdi : {
|
|
isInit: boolean;
|
|
upHeadList1: TableUpperProps[];
|
|
upHeadList2: TableUpperProps[];
|
|
upHeadList3: TableUpperProps[];
|
|
rdiList: RdiProps[]; // Changed from facilityAreaProps to ProcessAreaProps
|
|
rdiCount: number;
|
|
excelList: ExcelType[];
|
|
isLoading: boolean;
|
|
},
|
|
}
|
|
|
|
export const rdiInitState: RdiType = {
|
|
RdiSearch: {
|
|
isInit: false,
|
|
labelArray: LabelArray,
|
|
},
|
|
|
|
Rdi : {
|
|
isInit : false,
|
|
upHeadList1 : upHeadList1,
|
|
upHeadList2 : upHeadList2,
|
|
upHeadList3 : upHeadList3,
|
|
rdiList : rdiList,
|
|
rdiCount : 2,
|
|
excelList : [],
|
|
isLoading : true,
|
|
}
|
|
}
|
|
|
|
const dataFormSetting=(item : RdiProps)=> {
|
|
DataForm({ type: 'float0', column: 'fctCpc', item: item as unknown as Record<string, unknown> });
|
|
}
|
|
|
|
// Add type definitions for state setter function
|
|
type SetStateFunction = (state: RdiType | ((state: RdiType) => RdiType)) => void;
|
|
|
|
// 병렬 처리 제한용 헬퍼
|
|
// async function processInBatches(items, batchSize, callback) {
|
|
// const results:any = [];
|
|
// for (let i = 0; i < items.length; i += batchSize) {
|
|
// const batch = items.slice(i, i + batchSize);
|
|
// const batchResults = await Promise.all(batch.map(callback));
|
|
// results.push(...batchResults);
|
|
// }
|
|
// return results;
|
|
// }
|
|
|
|
export type RdiStore = RdiType & RdiActions;
|
|
|
|
export const rdiReducer:(set:SetStateFunction)=>RdiActions=(set: SetStateFunction) => {
|
|
return {
|
|
resetExcelList: () => {
|
|
set((state: RdiType) => ({
|
|
...state,
|
|
Rdi: {
|
|
...state.Rdi,
|
|
excelList: [],
|
|
},
|
|
}));
|
|
},
|
|
|
|
searchRdiList: async (pageNo: number, pageSize: number, searchYear: string, partCd?: string, nameCd?: string, fcltCpct?: string, operationValue?: string, fcltyNm?: string) => {
|
|
set((state: RdiType) => ({
|
|
...state,
|
|
Rdi: {
|
|
...state.Rdi,
|
|
isLoading: true,
|
|
},
|
|
}));
|
|
|
|
const res = await fetchRdiList(pageNo, pageSize, searchYear, partCd, nameCd, fcltCpct, operationValue, fcltyNm);
|
|
if(pageSize>=5000){
|
|
set((state: RdiType) => ({
|
|
...state,
|
|
Rdi: {
|
|
...state.Rdi,
|
|
excelList: [],
|
|
isLoading: true,
|
|
},
|
|
}));
|
|
}
|
|
else{
|
|
set((state: RdiType) => ({
|
|
...state,
|
|
Rdi: {
|
|
...state.Rdi,
|
|
rdiList: res.data,
|
|
excelList: [],
|
|
rdiCount: res.count,
|
|
isLoading: true,
|
|
},
|
|
}));
|
|
}
|
|
|
|
const excelDownList: ExcelType[] = [];
|
|
const rtnData = res.data.map((item: RdiProps) => {
|
|
return {
|
|
...item,
|
|
//sido: item.lclgvrnmntNm.split(' ')[0]?.toString() || '',
|
|
//gugun: item.lclgvrnmntNm.split(' ')[1]?.toString() || '',
|
|
sido: item.sido,
|
|
gugun : item.gugun,
|
|
inflAmnt: item.inflAmnt?Number(item.inflAmnt).toFixed(1): '' // 유입유량 (강우량)
|
|
}
|
|
})
|
|
|
|
const fcltCdList : string[]= [];
|
|
rtnData.forEach(item => {
|
|
fcltCdList.push(item.bscFctCd);
|
|
});
|
|
|
|
const rdiiDetailListRes : any = await fetchFacilityRdiiDetailList(searchYear, fcltCdList);
|
|
console.log(rdiiDetailListRes);
|
|
|
|
for (const item of rtnData) {
|
|
//const fcltyCd = item.bscFctCd;
|
|
//const res: any = await fetchFacilityWaterQltyListHist(searchYear, fcltyCd);
|
|
//const rdiiDetailList = res.data.wqltObjs;
|
|
const rdiiDetailList = rdiiDetailListRes?.data[item.bscFctCd];
|
|
//console.log(rdiiDetailListRes);
|
|
|
|
let rtnWinterInflBod = 0;
|
|
let rtnSummerBodInfl = 0;
|
|
let rtnSummerBod = 0;
|
|
let rtnRdiValue = 0;
|
|
let rtnRdiRain = 0;
|
|
let chungchunFlow = 0;
|
|
|
|
if (rdiiDetailList) {
|
|
|
|
let chungchunInfl = 0; // 청천시 유입
|
|
let chungchunCnt = 0;
|
|
let minSummerBod = 99999999;
|
|
let minSummerBodInfl = 99999999;
|
|
let winterCnt = 0;
|
|
let winterBodSunny = 0;
|
|
let rdiRain = 0;
|
|
const summerMonth = ['06', '07', '08'];
|
|
const winterMonth = ['01', '02'];
|
|
|
|
//const clone = (arr: any[]) => arr?.map(v => ({ ...v })) ?? [];
|
|
let rainEffectDay = 0;
|
|
rdiiDetailList.forEach(item2 => {
|
|
|
|
if (item2.infoRnDay == null) item2.infoRnDay = 0;
|
|
if(item2.infoRnDay >= 3) {
|
|
rainEffectDay = 2;
|
|
//강우시
|
|
if(summerMonth.includes(item2.msrDt.toString().replaceAll('-','').substring(4,6))){
|
|
//하절기
|
|
const inflBod = Number(item2.inflAssctBfrWqltBod);
|
|
const infl = Number(item2.inflAmnt);
|
|
const rain = Number(item2.infoRnDay);
|
|
if(inflBod < minSummerBod){
|
|
minSummerBodInfl = infl; // 강우일 하절기 최저 유입 BOD 일때의 유입유량
|
|
minSummerBod = inflBod; // 강우일 하절기 최저 유입 BOD
|
|
rdiRain = rain; // 강우일 하절기 최저 유입 BOD 일때의 강우량
|
|
}
|
|
}
|
|
}else{
|
|
rainEffectDay--;
|
|
}
|
|
if(rainEffectDay<0){
|
|
//청천시
|
|
chungchunInfl += item2.inflAmnt && item2.inflAmnt !== 'x' ? Number(item2.inflAmnt.toString().trim()) : 0;
|
|
chungchunCnt ++;
|
|
if(winterMonth.includes(item2.msrDt.toString().replaceAll('-','').substring(4,6))){
|
|
winterBodSunny += Number(item2.inflAssctBfrWqltBod); // 동절기 청천시 유입BOD 합계
|
|
winterCnt += 1;
|
|
}
|
|
}
|
|
});
|
|
|
|
minSummerBod = minSummerBod === 99999999 ? 0 : minSummerBod; // 강우일 최저 유입 BOD
|
|
minSummerBodInfl = minSummerBodInfl === 99999999 ? 0 : minSummerBodInfl; // 강우일 최저 유입 BOD일때 유입유량
|
|
|
|
const roundMinSummerBodInfl = Number(roundNumber(minSummerBodInfl, 0).toString().replaceAll(',',''));
|
|
const roundMinSummerBod = Number(roundNumber(minSummerBod, 1).toString().replaceAll(',',''));
|
|
const roundWinterBodSunny = Number(roundNumber(winterBodSunny, 1).toString().replaceAll(',',''));
|
|
|
|
const winterBodAvg = Number(roundNumber((roundWinterBodSunny / winterCnt), 1).toString().replaceAll(',',''));
|
|
// 하절기(6~8월) 중 최저 유입 BOD일때 유입유량 x ((동절기 청천시 유입BOD - 하절기(6~8월) 중 최저 유입BOD) / (동절기 청천시 유입BOD))
|
|
const winMinusSum = winterBodAvg - roundMinSummerBod;
|
|
|
|
const rdiValue = winMinusSum===0 ? 0 : roundMinSummerBodInfl * (winMinusSum / winterBodAvg ); // RDII 추정
|
|
|
|
rtnWinterInflBod = winterBodAvg; // 동절기 청천시 유입BOD
|
|
rtnSummerBodInfl = minSummerBodInfl; // 하절기(6~8월) 중 최저 유입 BOD일때 유입유량
|
|
rtnSummerBod = minSummerBod; // 하절기(6~8월) 중 최저 유입 BOD
|
|
rtnRdiValue = rdiValue; // RDII 추정
|
|
rtnRdiRain = rdiRain; // RDII 추정시 일강수량
|
|
chungchunFlow = chungchunInfl == 0? 0 : chungchunInfl / chungchunCnt; // 청천시 유입하수량
|
|
}
|
|
|
|
item.summerMinBodValue = roundNumber(rtnSummerBod,1); // 하절기강우일최저유입BOD(mg/L)
|
|
item.inflAmnt = roundNumber(rtnSummerBodInfl.toString(), 0); // 하절기최저유입BOD유입유량(m³/일)
|
|
item.winterAvgBodLowRainfall = rtnWinterInflBod?roundNumber(rtnWinterInflBod, 1):0; // 동절기청천시유입BOD(mg/L)
|
|
item.rdiiValue = rtnRdiValue?roundNumber(rtnRdiValue, 0):0; // RDII추정
|
|
item.infoRnDay = roundNumber(rtnRdiRain, 0); // RDII추정시일강수량(mm)
|
|
item.chungchunFlow = roundNumber(chungchunFlow, 0); //청천시유입하수량(m³/일)
|
|
item.rainCalInflAmnt = roundNumber(Number(item.chungchunFlow.toString().replaceAll(',',''))
|
|
+ Number(item.rdiiValue.toString().replaceAll(',','')), 0) || 0; // 강우시총추정유입량(m³/일)
|
|
item.properYn = Number(item.rainCalInflAmnt.toString().replaceAll(',','')) > Number(item.fctCpc.toString().replaceAll(',','')) ? '초과유입' : '적정';
|
|
|
|
}
|
|
|
|
rtnData.forEach((item: RdiProps) => {
|
|
dataFormSetting(item);
|
|
})
|
|
|
|
if(pageSize>=5000){
|
|
rtnData.forEach((item: RdiProps) => {
|
|
excelDownList.push({
|
|
시설코드: item.bscFctCd,
|
|
권역: item.rvbsn,
|
|
단위유역: item.lgbsn,
|
|
중권역: item.mdmbsn,
|
|
환경청: item.rgnNm,
|
|
시설명: item.bscFctNm,
|
|
시도: item.sido,
|
|
시군구: item.gugun,
|
|
주소: item.daddr,
|
|
"시설용량(m³/일)": item.fctCpc,
|
|
"청천시유입하수량(m³/일)": item.chungchunFlow,
|
|
"하절기강우일최저유입BOD(mg/L)": item.summerMinBodValue,
|
|
"하절기최저유입BOD유입유량(m³/일)": item.inflAmnt,
|
|
"동절기청천시유입BOD(mg/L)": item.winterAvgBodLowRainfall,
|
|
"RDII추정": item.rdiiValue,
|
|
"RDII추정시일강수량(mm)": item.infoRnDay,
|
|
"강우시총추정유입량(m³/일)": item.rainCalInflAmnt,
|
|
적정여부: item.properYn,
|
|
});
|
|
});
|
|
}
|
|
set((state: RdiType) => ({
|
|
...state,
|
|
Rdi: pageSize<5000?{
|
|
...state.Rdi,
|
|
rdiList: rtnData,
|
|
rdiCount: res.count,
|
|
isLoading : false,
|
|
}:{
|
|
...state.Rdi,
|
|
excelList: excelDownList,
|
|
isLoading : false,
|
|
},
|
|
}))
|
|
},
|
|
}
|
|
} |