From 9a77e9c52a9ed8cc6651c97402e5b3d79b3fc4ac Mon Sep 17 00:00:00 2001 From: jangwoong Date: Mon, 19 Oct 2026 16:43:51 +0900 Subject: [PATCH] =?UTF-8?q?[as]=20=EC=9B=B9=EA=B8=B0=EC=95=88=EA=B8=B0?= =?UTF-8?q?=EC=9D=98=20=ED=99=94=EB=A9=B4=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/pwrk-cnsltn-doc-mng-dialog.tsx | 95 +++++++++++++------ .../widgets/hangulgiangi/ui/hangul-giangi.tsx | 7 +- 2 files changed, 74 insertions(+), 28 deletions(-) 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 08da7e5d4..1a393cb21 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 @@ -34,6 +34,7 @@ import { DialogHeader, DialogTitle, Skeleton, + cn, } from "@common/components"; import { PwrkCnsltnDocEvlDialog } from "./pwrk-cnsltn-doc-evl-dialog"; @@ -97,12 +98,23 @@ function resolveDefaultBranchSeCd({ supplementBranches?: Set; isFinalApproverAfterMerger?: boolean; }): string { - // 0. 병합자 후의 최종 승인자는 무조건 MAIN 탭으로 고정 - if (isForkJoin && isFinalApproverAfterMerger) { + // 0. 순차 결재(!isForkJoin)인 경우: 무조건 "MAIN" 고정 (SP, SF 부서 분기가 없으므로 단일 종합본 처리) + if (!isForkJoin) { return "MAIN"; } - // 1. 공단 사용자 등 본인 부서(branchSeCd)가 있는 경우 본인 부서 탭을 1순위로 지정 + // 1. TE, SL, RK 상태가 아닌 경우 (예: RB 등): SP, SF 부서 탭이 노출되지 않고 MAIN 탭만 노출되므로 무조건 "MAIN" 고정 + // RK 상태는 1차 결재진행상태인 TE 상태와 논리적으로 동일하게 취급되어 부서별(SP, SF) 탭 선택이 유지됨 + if (prgrsSttsComCd !== "TE" && prgrsSttsComCd !== "SL" && prgrsSttsComCd !== "RK") { + return "MAIN"; + } + + // 2. 병합자 후의 최종 승인자는 무조건 MAIN 탭으로 고정 + if (isFinalApproverAfterMerger) { + return "MAIN"; + } + + // 3. 공단 사용자 등 본인 부서(branchSeCd)가 있는 경우 본인 부서 탭을 1순위로 지정 if (branchSeCd === "TOTAL_AGG") { return "MAIN"; } @@ -110,22 +122,22 @@ function resolveDefaultBranchSeCd({ return branchSeCd; } - // 2. 지자체 사용자(ROLE_USER05) 또는 본인 부서가 없는 경우: 보완요청 부서 우선 선택 - if (isForkJoin && supplementBranches && supplementBranches.size > 0) { + // 4. 지자체 사용자(ROLE_USER05) 또는 본인 부서가 없는 경우: 보완요청 부서 우선 선택 (TE, SL 상태일 때) + if (supplementBranches && supplementBranches.size > 0) { if (supplementBranches.size > 1) { return "SP"; } if (supplementBranches.has("SP")) return "SP"; if (supplementBranches.has("SF")) return "SF"; } - if (isForkJoin && supplementDmndBranch && ["SP", "SF"].includes(supplementDmndBranch)) { + if (supplementDmndBranch && ["SP", "SF"].includes(supplementDmndBranch)) { return supplementDmndBranch; } - if (userRole === "ROLE_USER05" && (prgrsSttsComCd === "SL" || prgrsSttsComCd === "RB")) { + if (userRole === "ROLE_USER05" && prgrsSttsComCd === "SL") { return supplementDmndBranch || "SP"; } - return isForkJoin ? "SP" : "MAIN"; + return "SP"; } function PwrkCnsltnDocMngDialog({ @@ -314,13 +326,15 @@ function PwrkCnsltnDocMngDialog({ const completedDraft = findCompletedPwrkDraft(pwrkCnsltnData); const crtDmndUuid = completedDraft?.crtDmndUuid; + const targetBranchForApi = isForkJoin ? currentBranchSeCd : undefined; + const { data: documentBlob, isLoading: isDocumentLoading, isError: isDocumentError, } = useQuery({ - queryKey: ["pwrk-cnsltn-doc-crt-rslt", "open-latest", crtDmndUuid, currentBranchSeCd], - queryFn: () => pwrkCnsltnDocCrtRsltService.openWebHwpLatest(crtDmndUuid!, currentBranchSeCd), + queryKey: ["pwrk-cnsltn-doc-crt-rslt", "open-latest", crtDmndUuid, targetBranchForApi], + queryFn: () => pwrkCnsltnDocCrtRsltService.openWebHwpLatest(crtDmndUuid!, targetBranchForApi), select: (response) => response.data, enabled: open && Boolean(crtDmndUuid), }); @@ -443,7 +457,7 @@ function PwrkCnsltnDocMngDialog({ const response = await pwrkCnsltnDocCrtRsltService.downloadLatest( completedDraft.crtDmndUuid, - currentBranchSeCd, + targetBranchForApi, ); const objectUrl = window.URL.createObjectURL(response.data); const anchor = document.createElement("a"); @@ -514,9 +528,15 @@ function PwrkCnsltnDocMngDialog({ const baseCanSave = !viewOnly && (canSaveProp ?? canSaveByAtrz); const canSaveCurrentBranch = useMemo(() => { - // 1. 지자체 사용자 (ROLE_USER05): 보완요청(SL) 및 지자체회신/조치결과작성(RB) 상태에서 보완 부서만 저장 허용 + // 1. 지자체 사용자 (ROLE_USER05) if (userRole === "ROLE_USER05") { - if (prgrsSttsComCd === "SL" || prgrsSttsComCd === "RB") { + // 1-1. RB(조치결과작성) 상태: 병렬결재에서도 프로세스상 한 개의 MAIN만 남아 처리되므로 MAIN 탭 저장 허용! + if (prgrsSttsComCd === "RB") { + return currentBranchSeCd === "MAIN"; + } + + // 1-2. SL(보완요청/조치결과요청) 상태: 보완요청 부서(SP, SF) 초안만 저장 허용 + if (prgrsSttsComCd === "SL") { if (isForkJoin) { // 보완요청 부서(supplementBranches)가 존재하는 경우 해당 부서만 저장 허용 if (supplementBranches.size > 0) { @@ -572,11 +592,19 @@ function PwrkCnsltnDocMngDialog({ supplementBranches, ]); + const editorIframeHeight = isForkJoin + ? "h-[50vh] min-h-[26rem]" + : "h-[58vh] min-h-[32rem]"; + const editorContainerMinHeight = isForkJoin ? "min-h-[26rem]" : "min-h-[32rem]"; + const pjtcoTableHeight = isForkJoin + ? "h-[calc(50vh+4rem)]" + : "h-[calc(58vh+4rem)]"; + return ( <> @@ -587,7 +615,8 @@ function PwrkCnsltnDocMngDialog({
부서별 문서 탭: - {!isFinalApproverAfterMerger && ( + {!isFinalApproverAfterMerger && + (prgrsSttsComCd === "TE" || prgrsSttsComCd === "SL" || prgrsSttsComCd === "RK") && ( <>
) : null} - {isLoading ? : null} + {isLoading ? ( + + ) : null} {isError ? (

실무협의서 정보를 불러오지 못했습니다. @@ -662,13 +697,14 @@ function PwrkCnsltnDocMngDialog({

) : null} {completedDraft && documentBlob ? ( -
+
{pjtcoAjmtPage?.content?.length ? ( isPjtcoAjmtTableOpen ? ( -
+

금액검증결과

); @@ -323,6 +327,7 @@ interface HangulGiangiProps { bridgeUrl?: string; ctrlBaseUrl?: string; className?: string; + iframeClassName?: string; onReady?: () => void; }