diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx
index d0b045db8..daafa0ed0 100644
--- a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx
+++ b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-mng-dialog.tsx
@@ -18,6 +18,7 @@ import {
} from "@/entities/pwrk-cnsltn-doc-crt-rslt";
import { usePwrkCnsltnDocPjtcoAjmtMngPage } from "@/entities/pwrk-cnsltn-doc-pjtco-ajmt-mng";
import { useElaprBranchesByDocNo, useElaprDocPrgrsByDocNo } from "@/entities/elapr";
+import { useAiAutoPrcsLatest, AI_AUTO_SE } from "@/entities/ai-auto-prcs-mng";
import {
findCompletedPwrkDraft,
pwrkCnsltnMngKeys,
@@ -397,14 +398,43 @@ function PwrkCnsltnDocMngDialog({
const documentFileName = `실무협의서${branchLabel}${verSuffix}_${pwrkCnsltnData?.pwrkCnsltnDocNo ?? crtDmndUuid}.hwpx`;
const isLoading = isPwrkCnsltnLoading || isDocumentLoading;
const isError = isPwrkCnsltnError || isDocumentError;
+ // AI 자동화 이력 조회 (COST_VRFC 완료 여부 확인)
+ const { data: aiAutoLatestList } = useAiAutoPrcsLatest(fnrsCnsltnDocNo, {
+ enabled: open && Boolean(fnrsCnsltnDocNo),
+ atmtnSeComCd: AI_AUTO_SE.COST_VRFC,
+ });
+
+ const costVrfcRecord = useMemo(() => {
+ return aiAutoLatestList?.find((row) => row.atmtnSeComCd === AI_AUTO_SE.COST_VRFC);
+ }, [aiAutoLatestList]);
+
+ // COST_VRFC 완료 여부 (SUCCESS, COMPLETED, PASS 등)
+ const hasCostVrfcSuccess = useMemo(() => {
+ if (!costVrfcRecord) return false;
+ return (
+ costVrfcRecord.atmtnPrcsSttsComCd === "SUCCESS" ||
+ costVrfcRecord.atmtnPrcsSttsComCd === "COMPLETED" ||
+ costVrfcRecord.rplyRsltComCd === "PASS" ||
+ Boolean(costVrfcRecord.rplyDt)
+ );
+ }, [costVrfcRecord]);
+
+ // AI 금액검증(AV) 이후 진행되는 상태 (EV: 조치결과검토의뢰, RK: 2차검토, TE: 2차검토완료, SL: 2차보완 등)
+ const isPostCostVerifyStatus = useMemo(() => {
+ return Boolean(prgrsSttsComCd && ["EV", "RK", "TE", "SL", "AP"].includes(prgrsSttsComCd));
+ }, [prgrsSttsComCd]);
+
+ const effectivePwrkDocNo =
+ pwrkCnsltnData?.pwrkCnsltnDocNo ?? costVrfcRecord?.pwrkCnsltnDocNo;
+
const pjtcoAjmtSearchParams = useMemo(
() => ({
- pwrkCnsltnDocNo: pwrkCnsltnData?.pwrkCnsltnDocNo,
+ pwrkCnsltnDocNo: effectivePwrkDocNo,
page: 0,
size: 1000,
sort: "rvwOpnnSn,asc",
}),
- [pwrkCnsltnData?.pwrkCnsltnDocNo],
+ [effectivePwrkDocNo],
);
const {
data: pjtcoAjmtPage,
@@ -412,6 +442,17 @@ function PwrkCnsltnDocMngDialog({
isError: isPjtcoAjmtError,
} = usePwrkCnsltnDocPjtcoAjmtMngPage(pjtcoAjmtSearchParams, open);
+ // 금액검증 슬라이드 노출 조건:
+ // 1) 실제 금액조정 내역이 1건 이상 있거나
+ // 2) AI 금액검증이 완료된 상태(EV 또는 RK 등)이거나
+ // 3) tb_as_atmtn_prcs_mng에 COST_VRFC 완료 이력이 있는 경우
+ const shouldShowCostVerifySlide = useMemo(() => {
+ if (Boolean(pjtcoAjmtPage?.content?.length)) return true;
+ if (isPostCostVerifyStatus) return true;
+ if (hasCostVrfcSuccess) return true;
+ return false;
+ }, [pjtcoAjmtPage?.content?.length, isPostCostVerifyStatus, hasCostVrfcSuccess]);
+
const { uploadFileAsync, isUploading, uploads } = useTus({
onSuccess: (atflCd, atflId, _file, fileKey) => {
if (!atflCd || !atflId) return;
@@ -1029,7 +1070,7 @@ function PwrkCnsltnDocMngDialog({
rightSlot={versionHistorySelect}
/>
- {pjtcoAjmtPage?.content?.length ? (
+ {shouldShowCostVerifySlide ? (
isPjtcoAjmtTableOpen ? (
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-pjtco-ajmt-table.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-pjtco-ajmt-table.tsx
index c388bd6bf..a4e13b302 100644
--- a/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-pjtco-ajmt-table.tsx
+++ b/apps/as/src/pages/fnrs-cnsltn/ui/components/pwrk-cnsltn-doc-pjtco-ajmt-table.tsx
@@ -16,12 +16,14 @@ interface PwrkCnsltnDocPjtcoAjmtTableProps {
rows: PwrkCnsltnDocPjtcoAjmtMngResponseDto[];
isLoading: boolean;
isError: boolean;
+ emptyMessage?: string;
}
function PwrkCnsltnDocPjtcoAjmtTable({
rows,
isLoading,
isError,
+ emptyMessage = "금액조정 검토의견이 0건(변동 없음)입니다.",
}: PwrkCnsltnDocPjtcoAjmtTableProps) {
if (isLoading) {
return (
@@ -64,7 +66,7 @@ function PwrkCnsltnDocPjtcoAjmtTable({
{rows.length === 0 ? (
- 조회된 사업비조정 항목이 없습니다.
+ {emptyMessage}
) : (