From 4e9a4efa2a81c6d7a15cbcbd82924608007e2b4b Mon Sep 17 00:00:00 2001 From: jangwoong Date: Tue, 27 Oct 2026 17:20:02 +0900 Subject: [PATCH] =?UTF-8?q?[as=20fr]=20=EC=9E=AC=EC=9B=90=ED=98=91?= =?UTF-8?q?=EC=9D=98,=EC=84=A4=EC=B9=98=EC=9D=B8=EA=B0=80=20=EB=B3=B4?= =?UTF-8?q?=EC=99=84=EC=99=84=EB=A3=8C=20=EC=A7=81=ED=9B=84=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=B2=B4=ED=81=AC=20=EB=A1=9C=EC=A7=81=20=EC=8B=A4?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EB=B0=98=EC=98=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/entities/fnrs-cnsltn/api/queries.ts | 13 +++-- .../as/src/entities/instl-sncn/api/queries.ts | 11 ++-- .../pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx | 4 +- .../pages/fnrs-cnsltn/ui/fnrs-edit-page.tsx | 23 +++++++- .../pages/fnrs-cnsltn/ui/fnrs-form-page.tsx | 58 ++++++++++--------- .../pages/instl-sncn/ui/instl-detail-gate.tsx | 4 +- .../pages/instl-sncn/ui/instl-edit-page.tsx | 23 +++++++- .../pages/instl-sncn/ui/instl-form-page.tsx | 34 ++++++----- 8 files changed, 112 insertions(+), 58 deletions(-) diff --git a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts index 7e29ba38b..15f1c14d3 100644 --- a/apps/as/src/entities/fnrs-cnsltn/api/queries.ts +++ b/apps/as/src/entities/fnrs-cnsltn/api/queries.ts @@ -64,8 +64,11 @@ export function useSaveApplyFnrsCnsltnMng() { const queryClient = useQueryClient(); return useMutation({ mutationFn: (body: FnrsCnsltnApplySaveRequestDto) => fnrsCnsltnMngService.saveApply(body), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); + onSuccess: (data) => { + if (data) { + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(data) }); + } + queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); }, }); } @@ -137,10 +140,8 @@ export function useSubmitSupplementFnrsCnsltnMng() { mutationFn: ({ id, body }: { id: string; body: FnrsCnsltnApplySaveRequestDto }) => fnrsCnsltnMngService.submitSupplement(id, body), onSuccess: (_data, { id }) => { - queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - queryClient.invalidateQueries({ - queryKey: fnrsCnsltnKeys.detail(id), - }); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(id) }); + queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); }, }); } diff --git a/apps/as/src/entities/instl-sncn/api/queries.ts b/apps/as/src/entities/instl-sncn/api/queries.ts index b01c0c892..dd32a5503 100644 --- a/apps/as/src/entities/instl-sncn/api/queries.ts +++ b/apps/as/src/entities/instl-sncn/api/queries.ts @@ -71,8 +71,11 @@ export function useInstlSncnSaveApply() { return useMutation({ mutationFn: (payload: InstlSncnApplySaveRequestDto) => instlSncnService.saveApply(payload), - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + onSuccess: (data) => { + if (data) { + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(data) }); + } + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); }, }); } @@ -110,8 +113,8 @@ export function useInstlSncnSubmitSupplement() { mutationFn: ({ id, payload }: { id: string; payload: InstlSncnApplySaveRequestDto }) => instlSncnService.submitSupplement(id, payload), onSuccess: (_, variables) => { - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); - queryClient.invalidateQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(variables.id) }); + queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); }, }); } diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx index efe663ab3..9f4cb329b 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-detail-gate.tsx @@ -12,7 +12,7 @@ interface FnrsDetailGateProps { function FnrsDetailGate({ id }: FnrsDetailGateProps) { const userInfo = useUserStore((state) => state.userInfo); - const { data, isLoading, isError } = useFnrsCnsltnMng(id); + const { data, isLoading, isFetching, isError } = useFnrsCnsltnMng(id); const canEdit = canEditPbadmsDoc({ docSeComCd: "FNRS", prgrsSttsComCd: data?.detDto?.prgrsSttsComCd, @@ -22,7 +22,7 @@ function FnrsDetailGate({ id }: FnrsDetailGateProps) { return ( state.userInfo); const { data, isLoading } = useFnrsCnsltnMng(id); - if (isLoading) { + const canEdit = canEditPbadmsDoc({ + docSeComCd: "FNRS", + prgrsSttsComCd: data?.detDto?.prgrsSttsComCd, + rgtr: data?.detDto?.rgtr, + loggedInUserUnqId: userInfo?.userUnqId, + }); + + useEffect(() => { + if (isLoading || !data?.detDto || !userInfo) return; + if (!canEdit) { + router.replace(withListQs(`/fnrs-cnsltn/${id}`)); + } + }, [canEdit, data?.detDto, id, isLoading, router, userInfo]); + + if (isLoading || (Boolean(data?.detDto) && !canEdit && Boolean(userInfo))) { return (
diff --git a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx index 7c0f47f5d..cde3fd4c1 100644 --- a/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx +++ b/apps/as/src/pages/fnrs-cnsltn/ui/fnrs-form-page.tsx @@ -70,7 +70,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) const [isSubmitting, setIsSubmitting] = useState(false); const [isPwrkCnsltnDocMngOpen, setIsPwrkCnsltnDocMngOpen] = useState(false); const isEditMode = mode === "edit"; - const isSplmntPrgrsStts = initialData?.detDto?.prgrsSttsComCd === "SL"; + const prgrsSttsComCd = initialData?.detDto?.prgrsSttsComCd ?? ""; + const isDraftStatus = !isEditMode || prgrsSttsComCd === "SV" || prgrsSttsComCd === ""; + const isSplmntPrgrsStts = isEditMode && prgrsSttsComCd === "SL"; const fnrsCnsltnDocNo = initialData?.detDto?.fnrsCnsltnDocNo; const { data: pwrkCnsltnData } = usePwrkCnsltnMngByUpDocNo( @@ -153,8 +155,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) if (!result) return; alert("보완 완료 처리되었습니다."); - await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - router.push(withListQs(`/fnrs-cnsltn/${docNo}`)); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(docNo) }); + await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/fnrs-cnsltn/${docNo}`)); } catch (error) { console.error("보완 완료 실패:", error); alert("보완 완료 처리 중 오류가 발생했습니다."); @@ -206,8 +209,9 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) if (!fnrsCnsltnDocNo) return; alert("신청 완료되었습니다."); - await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all }); - router.push(withListQs(`/fnrs-cnsltn/${fnrsCnsltnDocNo}`)); + queryClient.removeQueries({ queryKey: fnrsCnsltnKeys.detail(fnrsCnsltnDocNo) }); + await queryClient.invalidateQueries({ queryKey: fnrsCnsltnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/fnrs-cnsltn/${fnrsCnsltnDocNo}`)); } catch (error) { console.error("신청 실패:", error); alert("신청 중 오류가 발생했습니다."); @@ -294,7 +298,27 @@ function FnrsFormPage({ mode, initialData, createDefaults }: FnrsFormPageProps) > 목록 - {!isSplmntPrgrsStts ? ( + {isSplmntPrgrsStts ? ( + <> + {hasCompletedDraft ? ( + + ) : null} + + + ) : isDraftStatus ? ( <> - ) : null} - - - )} + ) : null}
diff --git a/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx b/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx index 321f92940..1eaab2614 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-detail-gate.tsx @@ -12,7 +12,7 @@ interface InstlSncnDetailGateProps { function InstlSncnDetailGate({ id }: InstlSncnDetailGateProps) { const userInfo = useUserStore((state) => state.userInfo); - const { data, isLoading, isError } = useInstlSncnDetail(id); + const { data, isLoading, isFetching, isError } = useInstlSncnDetail(id); const shouldRedirectToEdit = canEditPbadmsDoc({ docSeComCd: "INSTL", prgrsSttsComCd: data?.detDto.prgrsSttsComCd, @@ -22,7 +22,7 @@ function InstlSncnDetailGate({ id }: InstlSncnDetailGateProps) { return ( state.userInfo); const { data, isError, isLoading } = useInstlSncnDetail(id); - if (isLoading) { + const canEdit = canEditPbadmsDoc({ + docSeComCd: "INSTL", + prgrsSttsComCd: data?.detDto.prgrsSttsComCd, + rgtr: data?.detDto.rgtr, + loggedInUserUnqId: userInfo?.userUnqId, + }); + + useEffect(() => { + if (isLoading || !data?.detDto || !userInfo) return; + if (!canEdit) { + router.replace(withListQs(`/instl-sncn/${id}`)); + } + }, [canEdit, data?.detDto, id, isLoading, router, userInfo]); + + if (isLoading || (Boolean(data?.detDto) && !canEdit && Boolean(userInfo))) { return (
diff --git a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx index d9335c032..6cbdba382 100644 --- a/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/instl-form-page.tsx @@ -59,7 +59,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps const alert = useAlertStore((state) => state.setMessage); const [isSubmitting, setIsSubmitting] = useState(false); const isEditMode = mode === "edit"; - const isSplmntPrgrsStts = initialData?.detDto.prgrsSttsComCd === "SL"; + const prgrsSttsComCd = initialData?.detDto.prgrsSttsComCd ?? ""; + const isDraftStatus = !isEditMode || prgrsSttsComCd === "SV" || prgrsSttsComCd === ""; + const isSplmntPrgrsStts = isEditMode && prgrsSttsComCd === "SL"; const { data: essentialFiles = [] } = useEsntlAtchFileMngTree({ docSeComCd: "INSTL" }); @@ -115,8 +117,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps if (!result) return; alert("보완 완료 처리되었습니다."); - await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); - router.push(withListQs(`/instl-sncn/${docNo}`)); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(docNo) }); + await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/instl-sncn/${docNo}`)); } catch (error) { console.error("보완 완료 실패:", error); alert("보완 완료 처리 중 오류가 발생했습니다."); @@ -163,8 +166,9 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps if (!instlSncnDocNo) return; alert("신청 완료되었습니다."); - router.push(withListQs(`/instl-sncn/${instlSncnDocNo}`)); - queryClient.invalidateQueries({ queryKey: instlSncnKeys.all }); + queryClient.removeQueries({ queryKey: instlSncnKeys.detail(instlSncnDocNo) }); + await queryClient.invalidateQueries({ queryKey: instlSncnKeys.all, refetchType: "all" }); + router.replace(withListQs(`/instl-sncn/${instlSncnDocNo}`)); } catch (error) { console.error("신청 실패:", error); alert("신청 중 오류가 발생했습니다."); @@ -239,7 +243,15 @@ function InstlFormPage({ mode, initialData, createDefaults }: InstlFormPageProps > 목록 - {!isSplmntPrgrsStts ? ( + {isSplmntPrgrsStts ? ( + + ) : isDraftStatus ? ( <> - )} + ) : null}