diff options
| author | joonhoekim <26rote@gmail.com> | 2025-10-21 12:17:30 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-10-21 12:17:30 +0900 |
| commit | df8c7db59b463aea2b464552e207e4ae63ea4077 (patch) | |
| tree | c15cfb7f44a433996c8a46f4511d43550bd4c50d /lib/knox-api | |
| parent | 52b0f03803a94689ccc08578b5538405c88be1f2 (diff) | |
(김준회) 결재 조회 구조 변경, 권한없을 떄 권한 변경시 실패사유 안내하도록 error.message 토스트에 추가
Diffstat (limited to 'lib/knox-api')
| -rw-r--r-- | lib/knox-api/approval/approval.ts | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/lib/knox-api/approval/approval.ts b/lib/knox-api/approval/approval.ts index fba7ef04..c7803653 100644 --- a/lib/knox-api/approval/approval.ts +++ b/lib/knox-api/approval/approval.ts @@ -1004,13 +1004,13 @@ export async function getApprovalLogsAction(): Promise<{ }>; }> { "use server"; - + try { const db = (await import('@/db/db')).default; const { approvalLogs } = await import('@/db/schema/knox/approvals'); const { eq, desc } = await import('drizzle-orm'); - - // 데이터베이스에서 결재 로그 조회 (삭제되지 않은 것만) + + // 1. 데이터베이스에서 결재 로그 조회 (삭제되지 않은 것만) const logs = await db .select({ apInfId: approvalLogs.apInfId, @@ -1036,7 +1036,50 @@ export async function getApprovalLogsAction(): Promise<{ .where(eq(approvalLogs.isDeleted, false)) .orderBy(desc(approvalLogs.createdAt)); - // ApprovalList 컴포넌트에서 기대하는 형식으로 데이터 변환 + // 2. 상태가 변동될 수 있는 항목들 필터링 (암호화중(-2), 보류(0), 진행중(1)) + const pendingApprovals = logs.filter(log => + ['-2', '0', '1'].includes(log.status) + ); + + // 3. 상태 동기화가 필요한 경우 Knox API 호출 + let statusSyncMessage = ''; + if (pendingApprovals.length > 0) { + try { + const apinfids = pendingApprovals.map(approval => ({ + apinfid: approval.apInfId + })); + + const statusResponse = await getApprovalStatus({ + apinfids + }); + + if (statusResponse.result === 'success' && statusResponse.data) { + let updatedCount = 0; + + // 4. 상태 변경된 항목들 업데이트 + for (const statusData of statusResponse.data) { + const currentLog = logs.find(log => log.apInfId === statusData.apInfId); + if (currentLog && currentLog.status !== statusData.status) { + try { + await upsertApprovalStatus(statusData.apInfId, statusData.status); + // 메모리상의 데이터도 업데이트 + currentLog.status = statusData.status; + updatedCount++; + } catch (updateError) { + console.error(`결재상태 업데이트 실패 (${statusData.apInfId}):`, updateError); + } + } + } + + statusSyncMessage = updatedCount > 0 ? ` (${updatedCount}건 상태 동기화)` : ''; + } + } catch (syncError) { + console.error('결재 상태 동기화 중 오류:', syncError); + // 상태 동기화 실패는 전체 조회 실패로 처리하지 않음 + } + } + + // 5. ApprovalList 컴포넌트에서 기대하는 형식으로 데이터 변환 const formattedData = logs.map(log => ({ apInfId: log.apInfId, subject: log.subject, @@ -1058,7 +1101,7 @@ export async function getApprovalLogsAction(): Promise<{ return { success: true, - message: `${formattedData.length}건의 결재 로그를 조회했습니다.`, + message: `${formattedData.length}건의 결재 로그를 조회했습니다.${statusSyncMessage}`, data: formattedData, }; |
