diff --git a/apps/as/src/entities/elapr/api/elapr-dmnd-service.ts b/apps/as/src/entities/elapr/api/elapr-dmnd-service.ts new file mode 100644 index 000000000..8b2e67fa2 --- /dev/null +++ b/apps/as/src/entities/elapr/api/elapr-dmnd-service.ts @@ -0,0 +1,17 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; + +import type { + ElaprDmndResponse, + ElaprDmndSaveRequest, + ElaprDmndService, +} from "../model/elapr-dmnd-interface"; + +async function create(body: ElaprDmndSaveRequest): Promise { + const response = await client.post(ENDPOINT.AS_ELAPR_SERVICE.ELAPR_DMND, body); + return response.data; +} + +export const ElaprDmndApi: ElaprDmndService = { + create, +}; diff --git a/apps/as/src/entities/elapr/api/elapr-prgrs-service.ts b/apps/as/src/entities/elapr/api/elapr-prgrs-service.ts new file mode 100644 index 000000000..97f925113 --- /dev/null +++ b/apps/as/src/entities/elapr/api/elapr-prgrs-service.ts @@ -0,0 +1,7 @@ +import { client } from "@/shared/api"; + +export async function processElaprPrgrs(elaprPrgrsId: string, atrzPrgrsSttsComCd = "ATRZ_STTS_003"): Promise { + await client.put(`/as-elapr-service/api/v1/elapr-prgrs-stts/${elaprPrgrsId}/process`, { + atrzPrgrsSttsComCd, + }); +} diff --git a/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts new file mode 100644 index 000000000..249d98bf9 --- /dev/null +++ b/apps/as/src/entities/elapr/model/elapr-dmnd-interface.ts @@ -0,0 +1,22 @@ +export interface ElaprDmndSaveRequest { + elaprDocNo: string; + elaprTmpltId: string; + dmndTtl: string; + dmndCn: string; +} + +export interface ElaprDmndResponse { + elaprDmndId: string; + elaprDocNo: string; + elaprTmpltId: string; + dmndTtl: string; + dmndCn: string; + atrzSttsComCd: string; + rqstrUuid: string; + regDt: string; + updtDt: string; +} + +export interface ElaprDmndService { + create(body: ElaprDmndSaveRequest): Promise; +} diff --git a/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx b/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx index 6ef71fd74..76aeb1d15 100644 --- a/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx +++ b/apps/as/src/pages/instl-sncn/ui/cnfm-view-page.tsx @@ -11,8 +11,11 @@ import { useRouter } from "next/navigation"; import { PROXY_HOST } from "@/shared/config"; import { formatFileSize } from "@/shared/lib/file-utils"; import axios from "axios"; +import { processElaprPrgrs } from "@/entities/elapr/api/elapr-prgrs-service"; +import { ElaprDmndApi } from "@/entities/elapr/api/elapr-dmnd-service"; import { dayjs, useUserStore, useAlertStore } from "@/shared/lib"; import { InstlSncnApi, type InstlSncnApplySaveRequestDto } from "@/entities/instl-sncn"; +import { client } from "@/shared/api"; import "./cnfm-page.css"; @@ -171,10 +174,8 @@ function CnfmViewPage({ id }: { id: string }) { alert("결재 정보가 올바르지 않습니다."); return; } - const url = `${PROXY_HOST}/as-elapr-service/api/v1/elapr-prgrs-stts/${elaprPrgrsId}/process`; - const body = { atrzPrgrsSttsComCd: "ATRZ_STTS_003" }; // 승인 처리 try { - await axios.put(url, body); + await processElaprPrgrs(String(elaprPrgrsId), "ATRZ_PRGRS_003"); //진행상태를 승인으로 업데이트 alert("결재가 완료되었습니다."); try { await query.refetch(); @@ -188,6 +189,29 @@ function CnfmViewPage({ id }: { id: string }) { } }; + const handleAssignApproverClick = async (elaprTmpltId: string) => { + try { + const payload = { + elaprDocNo: det.instlSncnDocNo, + elaprTmpltId: elaprTmpltId, /* 팝업에서 선택된 전자결제 템플릿 */ + dmndTtl: det.bizNm, /* "구례 하수도 처리시설 2026", */ + dmndCn: det.bizCn /*"구례 발주 하수도 처리시설 사업 2026년도 진행분 결제 요청 입니다."*/ + }; + // ElaprDmndApi 서비스를 통해 백엔드 연동 + await ElaprDmndApi.create(payload); + alert("결재자 지정(결재요청 등록)이 완료되었습니다."); + try { + await query.refetch(); + } catch (e) { + /* ignore refetch errors */ + } + } catch (err: any) { + console.error("결재자 지정 실패", err); + const msg = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : "결재자 지정 중 오류가 발생했습니다."; + alert(msg); + } + }; + const renderApproverRow = (row: any) => { if (!row) return
-
; const status = row.atrzPrgrsSttsComCd ?? ""; @@ -374,48 +398,57 @@ function CnfmViewPage({ id }: { id: string }) { return (
- {/* orderedApprovers.length > 0 && ( */ } -
-

결재 정보

-
- - - - {orderedApprovers.length === 0 ? ( - <> - - - - - - ) : ( - orderedApprovers.map((r: any) => ( - - )) - )} - - - - - {orderedApprovers.length === 0 ? ( - <> - - - - - - ) : ( - orderedApprovers.map((r: any) => ( - - )) - )} - - -
접수자검토자승인자최종승인자 - {r.atrzSeComNm ?? r.atrzSeComCd} -
{renderApproverCell("ATRZ01")}{renderApproverCell("ATRZ02")}{renderApproverCell("ATRZ03")}{renderApproverCell("ATRZ99")}{renderApproverRow(r)}
+ {/* orderedApprovers.length > 0 && ( */} +
+

결재 정보

+
+ + + + {orderedApprovers.length === 0 ? ( + <> + + + + + + ) : ( + orderedApprovers.map((r: any) => ( + + )) + )} + + + + + {orderedApprovers.length === 0 ? ( + <> + + + + + + ) : ( + orderedApprovers.map((r: any) => ( + + )) + )} + + +
접수자검토자승인자최종승인자 + {r.atrzSeComNm ?? r.atrzSeComCd} +
{renderApproverCell("ATRZ01")}{renderApproverCell("ATRZ02")}{renderApproverCell("ATRZ03")}{renderApproverCell("ATRZ99")}{renderApproverRow(r)}
+ {/** 결제자 지정 버튼 */} +
+
+
{/* )} */}

설치인가 상세보기

@@ -429,8 +462,8 @@ function CnfmViewPage({ id }: { id: string }) { 사업명 {det.bizNm || "-"} - 사업기간 - {(det.bizBgngYr || "-") + " ~ " + (det.bizEndYr || "-")} + 사업기간 + {(det.bizBgngYr || "-") + " ~ " + (det.bizEndYr || "-")} 사업내용 @@ -448,11 +481,11 @@ function CnfmViewPage({ id }: { id: string }) { 진행상태 - {det.prgrsSttsCdNm || det.prgrsSttsComCd || "-"} + {det.prgrsSttsCdNm || det.prgrsSttsComCd || "-"} 예산사업코드 {det.bgtBizCd || "-"} - +
@@ -573,7 +606,7 @@ function CnfmViewPage({ id }: { id: string }) { {bizCstList.map((node: any) => { - + const pl = indentPx(node.indAcntgSeCdNm); const bscPlanAmt = Number(node.bscPlanAmt) || 0; const budgetReflct = Number(node.bgtRfltAmt) || 0; @@ -588,8 +621,8 @@ function CnfmViewPage({ id }: { id: string }) { node.treeLevel === 1 ? "bg-blue-50 font-bold" : node.treeLevel === 2 - ? "bg-gray-100 font-semibold" - : "" + ? "bg-gray-100 font-semibold" + : "" } > {node.treeLevel <= 2 ? ( @@ -631,31 +664,30 @@ function CnfmViewPage({ id }: { id: string }) {
{/* 체크리스트 */} -
-
-

체크리스트

-
-
- {Array.from(new Set(taskCodes)).map((code) => { - const name = TASK_CODE_LABELS[code] ?? code; - const active = selectedTaskCode === code; - return ( - - ); - })} -
-
{`(${cklstStats.completed}/${cklstStats.total})`}
+ onClick={() => setSelectedTaskCode(code)} + > + {name} + + ); + })}
+
{`(${cklstStats.completed}/${cklstStats.total})`}
+
{visibleReviewStepCodes.length === 0 ? ( @@ -666,11 +698,10 @@ function CnfmViewPage({ id }: { id: string }) { -