From e0715ce177683e5a5ed512a7447863d2b0b4a433 Mon Sep 17 00:00:00 2001 From: bicochan Date: Fri, 21 Aug 2026 11:38:43 +0900 Subject: [PATCH] =?UTF-8?q?[as]=20feat:=20=EC=A6=9D=EA=B0=90=EC=95=A1,=20?= =?UTF-8?q?=EC=A6=9D=EA=B0=90=EB=A5=A0=20=EC=84=9C=EB=B2=84=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=A7=A4=ED=95=91(=EC=82=AC=EC=97=85?= =?UTF-8?q?=EA=B7=9C=EB=AA=A8,=20=EC=B4=9D=EC=82=AC=EC=97=85=EB=B9=84,=20?= =?UTF-8?q?=EC=9E=AC=EC=9B=90=EB=B6=84=EB=8B=B4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fnrs-shar-se/model/fnrs-shar-se-interface.ts | 5 ++++- .../ui/sections/business-scale-section.tsx | 12 ++++-------- .../ui/sections/business-cost-section.tsx | 16 ++++++---------- .../ui/sections/business-scale-section.tsx | 12 ++++-------- .../ui/sections/fnrs-shar-section.tsx | 10 ++++++++-- .../ui/sections/business-cost-section.tsx | 16 ++++++---------- .../ui/sections/business-scale-section.tsx | 12 ++++-------- apps/as/src/shared/model/pbadms-sprt.ts | 16 ++++++++++++---- .../src/widgets/pbadms-sprt/lib/format-utils.ts | 14 +++++++++++--- 9 files changed, 59 insertions(+), 54 deletions(-) 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); }