72 lines
2.5 KiB
TypeScript
72 lines
2.5 KiB
TypeScript
/** 노후관로의 지도와 목록이 사용하는 DB 레이어 설정 계약이다. */
|
|
import { getRawJson } from "@/shared/api/sewerage-api";
|
|
import {
|
|
buildAgedPipeCqlFilters,
|
|
isAgedPipeLayerNode,
|
|
type AgedPipeFilters,
|
|
} from "@/entities/facility/lib/aged-pipe-utils";
|
|
|
|
/** DB 응답을 그대로 보존하며 최초 표출 전에 필터만 해석한다. */
|
|
export const prepareAgedPipeLayerRows = (
|
|
rows: any[],
|
|
filters: AgedPipeFilters,
|
|
): any[] =>
|
|
rows.map((row) => {
|
|
const next = { ...row };
|
|
if (isAgedPipeLayerNode(row)) {
|
|
next.agedPipeFilterTemplate = row.flterSql;
|
|
try {
|
|
validateAgedPipeLayer(row);
|
|
next.flterSql = buildAgedPipeCqlFilters(filters, row.flterSql).join(
|
|
" AND ",
|
|
);
|
|
} catch (error) {
|
|
// 노후관로 DB 미전환이 다른 시설물 레이어까지 중단시키지 않도록 이 행만 차단한다.
|
|
next.agedPipeConfigError =
|
|
error instanceof Error ? error.message : "노후관로 레이어 설정 오류";
|
|
next.actlLyrYn = "N";
|
|
next.flterSql = "EXCLUDE";
|
|
}
|
|
}
|
|
if (Array.isArray(row.children))
|
|
next.children = prepareAgedPipeLayerRows(row.children, filters);
|
|
return next;
|
|
});
|
|
|
|
/** 환경마다 달라질 수 있는 일련번호 대신 DB 업무명을 통해 설정 행을 찾는다. */
|
|
export const findAgedPipeLayer = (rows: any[]): any | undefined => {
|
|
for (const row of rows) {
|
|
if (isAgedPipeLayerNode(row)) return row;
|
|
const child = Array.isArray(row.children)
|
|
? findAgedPipeLayer(row.children)
|
|
: undefined;
|
|
if (child) return child;
|
|
}
|
|
};
|
|
|
|
/** 예전 제어용 행을 실제 WFS 레이어처럼 요청하지 않도록 전환 상태를 확인한다. */
|
|
export const validateAgedPipeLayer = (row: any) => {
|
|
if (row?.agedPipeConfigError) throw new Error(row.agedPipeConfigError);
|
|
if (
|
|
!row ||
|
|
row.actlLyrYn !== "Y" ||
|
|
row.srvcNm !== "wfs" ||
|
|
!row.lyrTyNm ||
|
|
row.lyrTyNm === "tb_old_pipe"
|
|
) {
|
|
throw new Error(
|
|
"노후관로 DB 레이어 설정을 실제 WFS 레이어와 sql_filt 템플릿으로 갱신해 주세요.",
|
|
);
|
|
}
|
|
};
|
|
|
|
/** 독립 목록 팝업도 부모창의 하드코딩 없이 동일 설정 API를 조회한다. */
|
|
export const fetchAgedPipeLayer = async () => {
|
|
const rows = await getRawJson(
|
|
"/sewerage-service/api/v1/map/lyrStngs/SN_NETWORK",
|
|
);
|
|
const row = findAgedPipeLayer(Array.isArray(rows) ? rows : []);
|
|
validateAgedPipeLayer(row);
|
|
return row;
|
|
};
|