Merge branch 'iipbs/st/dev' of https://www.onasys.co.kr:3000/ONAANDALL/frontend into iipbs/st/dev

This commit is contained in:
2026-07-08 18:05:51 +09:00
3 changed files with 51 additions and 6 deletions
@@ -25,6 +25,7 @@ import {
emptyLogHistoryDetailColumnInfo,
LOG_DETAIL_DETAILS_FIELD,
LOG_DETAIL_DETAILS_RAW_FIELD,
normalizeLogDetailList,
type LogDetailVerificationItem,
prepareLogDetailRowsForGrid,
} from "@/components/util/column/management/LogHistoryDetailColumn";
@@ -113,9 +114,7 @@ export function LogHistoryDetailDialog({
return;
}
const list = Array.isArray(response.data)
? response.data
: [];
const list = normalizeLogDetailList(response.data);
const nextColumnInfo = buildLogHistoryDetailColumnInfo(list);
const nextRows = alignLogDetailRowsToColumns(
prepareLogDetailRowsForGrid(list),
@@ -32,9 +32,46 @@ const FIELD_HEADER: Record<string, string> = {
sggNm: "시군구",
admdstCd: "행정구역코드",
admdstNm: "행정구역명",
vrfcSn: "검증순번",
vrfcNm: "검증명",
trgtStatsCd: "대상통계코드",
trgtStatsNm: "대상통계명",
vrfcClsfCd: "검증분류코드",
vrfcClsfNm: "검증분류명",
dcptDigtCnt: "소수점자릿수",
dcptPrcsMthCd: "소수점처리방법코드",
dcptPrcsMthNm: "소수점처리방법명",
useYn: "사용여부",
regDt: "등록일시",
mdfcnDt: "수정일시",
[LOG_DETAIL_DETAILS_FIELD]: "상세",
};
/** 검증 규칙 로그 상세(vrfcSn 등) 컬럼 표시 순서 */
const VERIFICATION_FIELD_ORDER = [
"vrfcSn",
"vrfcNm",
"trgtStatsCd",
"trgtStatsNm",
"vrfcClsfCd",
"vrfcClsfNm",
"dcptDigtCnt",
"dcptPrcsMthCd",
"dcptPrcsMthNm",
"useYn",
"regDt",
"mdfcnDt",
] as const;
/** API `data`가 배열 또는 단일 객체일 때 그리드 행 배열로 정규화 */
export function normalizeLogDetailList(
data: StatisticsLogDetailRow[] | StatisticsLogDetailRow | null | undefined,
): StatisticsLogDetailRow[] {
if (Array.isArray(data)) return data;
if (data != null && typeof data === "object") return [data];
return [];
}
function parseLogDetailsValue(
value: unknown,
): LogDetailVerificationItem[] | null {
@@ -104,11 +141,20 @@ function collectFieldNames(rows: StatisticsLogDetailRow[]): string[] {
keys.add(key);
}
}
const verification = VERIFICATION_FIELD_ORDER.filter((k) => keys.has(k));
const common = COMMON_FIELD_ORDER.filter((k) => keys.has(k));
const ordered = new Set<string>([
...verification,
...common,
LOG_DETAIL_DETAILS_FIELD,
]);
const rest = [...keys]
.filter((k) => !COMMON_FIELD_ORDER.includes(k as (typeof COMMON_FIELD_ORDER)[number]))
.filter((k) => !ordered.has(k) && k !== LOG_DETAIL_DETAILS_RAW_FIELD)
.sort((a, b) => a.localeCompare(b, "ko"));
return [...common, ...rest];
const details = keys.has(LOG_DETAIL_DETAILS_FIELD)
? [LOG_DETAIL_DETAILS_FIELD]
: [];
return [...verification, ...common, ...rest, ...details];
}
function isNumericField(rows: StatisticsLogDetailRow[], fieldName: string): boolean {
@@ -310,7 +310,7 @@ export interface StatisticsLogDetailRow {
export interface StatisticsLogDetailResponse {
status: string;
message?: string;
data?: StatisticsLogDetailRow[];
data?: StatisticsLogDetailRow[] | StatisticsLogDetailRow;
}
export interface getReviewOpinionDetailRequest {