diff --git a/apps/as/src/entities/fnrs-shar-se/model/fnrs-shar-se-interface.ts b/apps/as/src/entities/fnrs-shar-se/model/fnrs-shar-se-interface.ts
index ab60a868f..97adb34b6 100644
--- a/apps/as/src/entities/fnrs-shar-se/model/fnrs-shar-se-interface.ts
+++ b/apps/as/src/entities/fnrs-shar-se/model/fnrs-shar-se-interface.ts
@@ -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 메서드명·시그니처와 동일 */
diff --git a/apps/as/src/pages/design-cnstn/ui/sections/business-scale-section.tsx b/apps/as/src/pages/design-cnstn/ui/sections/business-scale-section.tsx
index c46fc31be..24ab52bfd 100644
--- a/apps/as/src/pages/design-cnstn/ui/sections/business-scale-section.tsx
+++ b/apps/as/src/pages/design-cnstn/ui/sections/business-scale-section.tsx
@@ -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 (
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
{node.cnstpSeCdNm}
- {fmtNumber(bscPlanQty)}
+ {fmtNumber(node.bscPlanQty)}
- {fmtNumber(budgetReflct)}
+ {fmtNumber(node.bgtRfltQty)}
- {fmtNumber(tstmDesignQty)}
+ {fmtNumber(node.tstmDesignQty)}
- {diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
+ {node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-cost-section.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-cost-section.tsx
index d880811b6..d892187f6 100644
--- a/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-cost-section.tsx
+++ b/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-cost-section.tsx
@@ -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) {
)}
- {fmtNumber(bscPlanAmt)}
+ {fmtNumber(node.bgtRfltAmt)}
- {fmtNumber(budgetReflct)}
+ {fmtNumber(node.bscPlanAmt)}
- {fmtNumber(tstmDesignAmt)}
+ {fmtNumber(node.tstmDesignAmt)}
- {diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
+ {node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
- {calcDiffPercent(diff, budgetReflct)}
+ {fmtNumber(node.chgRt)}%
);
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-scale-section.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-scale-section.tsx
index c1f5a28af..46cd6418d 100644
--- a/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-scale-section.tsx
+++ b/apps/as/src/pages/fnrs-cnsltn/ui/sections/business-scale-section.tsx
@@ -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 (
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
{node.cnstpSeCdNm}
- {fmtNumber(bscPlanQty)}
+ {fmtNumber(node.bscPlanQty)}
- {fmtNumber(budgetReflct)}
+ {fmtNumber(node.bgtRfltQty)}
- {fmtNumber(tstmDesignQty)}
+ {fmtNumber(node.tstmDesignQty)}
- {diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
+ {node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/sections/fnrs-shar-section.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/sections/fnrs-shar-section.tsx
index ad83c53e4..3d4e3aa93 100644
--- a/apps/as/src/pages/fnrs-cnsltn/ui/sections/fnrs-shar-section.tsx
+++ b/apps/as/src/pages/fnrs-cnsltn/ui/sections/fnrs-shar-section.tsx
@@ -61,8 +61,14 @@ function FnrsSharSection({ fnrsSharList }: FnrsSharSectionProps) {
{fmtNumber(node.chgRqtAmt)}
-
-
+
+
+ {node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
+
+
+
+ {fmtNumber(node.chgRt)}%
+
{node.rmrkCn ?? ""}
);
diff --git a/apps/as/src/pages/instl-sncn/ui/sections/business-cost-section.tsx b/apps/as/src/pages/instl-sncn/ui/sections/business-cost-section.tsx
index 77b7cdd2e..7de55ee64 100644
--- a/apps/as/src/pages/instl-sncn/ui/sections/business-cost-section.tsx
+++ b/apps/as/src/pages/instl-sncn/ui/sections/business-cost-section.tsx
@@ -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) {
)}
- {fmtNumber(bscPlanAmt)}
+ {fmtNumber(node.bgtRfltAmt)}
- {fmtNumber(budgetReflct)}
+ {fmtNumber(node.bscPlanAmt)}
- {fmtNumber(tstmDesignAmt)}
+ {fmtNumber(node.tstmDesignAmt)}
- {diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
+ {node.chgAmt > 0 ? `+${fmtNumber(node.chgAmt)}` : fmtNumber(node.chgAmt)}
- {calcDiffPercent(diff, budgetReflct)}
+ {fmtNumber(node.chgRt)}%
);
diff --git a/apps/as/src/pages/instl-sncn/ui/sections/business-scale-section.tsx b/apps/as/src/pages/instl-sncn/ui/sections/business-scale-section.tsx
index 82f7785f8..ca78cfec9 100644
--- a/apps/as/src/pages/instl-sncn/ui/sections/business-scale-section.tsx
+++ b/apps/as/src/pages/instl-sncn/ui/sections/business-scale-section.tsx
@@ -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 (
@@ -44,17 +40,17 @@ function BusinessScaleSection({ bizSclList }: BusinessScaleSectionProps) {
{node.cnstpSeCdNm}
- {fmtNumber(bscPlanQty)}
+ {fmtNumber(node.bscPlanQty)}
- {fmtNumber(budgetReflct)}
+ {fmtNumber(node.bgtRfltQty)}
- {fmtNumber(tstmDesignQty)}
+ {fmtNumber(node.tstmDesignQty)}
- {diff > 0 ? `+${fmtNumber(diff)}` : fmtNumber(diff)}
+ {node.chgQty > 0 ? `+${fmtNumber(node.chgQty)}` : fmtNumber(node.chgQty)}
diff --git a/apps/as/src/shared/model/pbadms-sprt.ts b/apps/as/src/shared/model/pbadms-sprt.ts
index 272e6d110..10d620b84 100644
--- a/apps/as/src/shared/model/pbadms-sprt.ts
+++ b/apps/as/src/shared/model/pbadms-sprt.ts
@@ -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 */
diff --git a/apps/as/src/widgets/pbadms-sprt/lib/format-utils.ts b/apps/as/src/widgets/pbadms-sprt/lib/format-utils.ts
index b67ad9860..8fa24d3cb 100644
--- a/apps/as/src/widgets/pbadms-sprt/lib/format-utils.ts
+++ b/apps/as/src/widgets/pbadms-sprt/lib/format-utils.ts
@@ -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);
}