diff options
| -rw-r--r-- | components/form-data/delete-form-data-dialog.tsx | 28 | ||||
| -rw-r--r-- | components/form-data/form-data-table.tsx | 1 | ||||
| -rw-r--r-- | lib/forms/services.ts | 110 |
3 files changed, 128 insertions, 11 deletions
diff --git a/components/form-data/delete-form-data-dialog.tsx b/components/form-data/delete-form-data-dialog.tsx index 9298b43b..045d0291 100644 --- a/components/form-data/delete-form-data-dialog.tsx +++ b/components/form-data/delete-form-data-dialog.tsx @@ -41,6 +41,7 @@ interface DeleteFormDataDialogProps formData: GenericData[] formCode: string contractItemId: number + projectId?: number showTrigger?: boolean onSuccess?: () => void triggerVariant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" @@ -50,6 +51,7 @@ export function DeleteFormDataDialog({ formData, formCode, contractItemId, + projectId, showTrigger = true, onSuccess, triggerVariant = "outline", @@ -77,6 +79,7 @@ export function DeleteFormDataDialog({ formCode, contractItemId, tagIdxs, + projectId, }) if (result.error) { @@ -90,6 +93,14 @@ export function DeleteFormDataDialog({ const deletedCount = result.deletedCount || 0 const deletedTagsCount = result.deletedTagsCount || 0 + // SEDP 삭제 결과도 포함 + if (result.sedpDeleteSuccess) { + console.log("SEDP에서도 성공적으로 삭제되었습니다.") + } else if (result.sedpDeleteError) { + console.warn("SEDP 삭제 실패:", result.sedpDeleteError) + toast.warning(`로컬 삭제는 성공했으나 SEDP 삭제 실패: ${result.sedpDeleteError}`) + } + if (deletedCount !== deletedTagsCount) { // 데이터 불일치 경고 console.warn(`Data inconsistency: FormEntries deleted: ${deletedCount}, Tags deleted: ${deletedTagsCount}`) @@ -98,12 +109,17 @@ export function DeleteFormDataDialog({ ) } else { // 정상적인 삭제 완료 - toast.success( - t("delete.successMessage", { - count: deletedCount, - items: deletedCount === 1 ? t("delete.item") : t("delete.items") - }) - ) + const successMessage = result.sedpDeleteSuccess + ? t("delete.successMessage", { + count: deletedCount, + items: deletedCount === 1 ? t("delete.item") : t("delete.items") + }) + " (SEDP 포함)" + : t("delete.successMessage", { + count: deletedCount, + items: deletedCount === 1 ? t("delete.item") : t("delete.items") + }) + + toast.success(successMessage) } onSuccess?.() diff --git a/components/form-data/form-data-table.tsx b/components/form-data/form-data-table.tsx index 98cc7b46..465cb9a1 100644 --- a/components/form-data/form-data-table.tsx +++ b/components/form-data/form-data-table.tsx @@ -1128,6 +1128,7 @@ export default function DynamicTable({ formData={deleteTarget} formCode={formCode} contractItemId={contractItemId} + projectId={projectId} open={deleteDialogOpen} onOpenChange={(open) => { if (!open) { diff --git a/lib/forms/services.ts b/lib/forms/services.ts index 57b7f000..a6ae2d83 100644 --- a/lib/forms/services.ts +++ b/lib/forms/services.ts @@ -1658,6 +1658,57 @@ export async function sendDataToSEDP( } /** + * Delete tag data from SEDP + */ +export async function deleteTagFromSEDP( + projectCode: string, + packageCode: string +): Promise<any> { + try { + // Get the token + const apiKey = await getSEDPToken(); + + // Define the API base URL + const SEDP_API_BASE_URL = process.env.SEDP_API_BASE_URL || 'http://sedpwebapi.ship.samsung.co.kr/api'; + + const deletePayload = { + ProjectNo: projectCode, + ToolID: "eVCP", + Scope: packageCode, + RevNo: "00" + }; + + console.log("Deleting tag from SEDP:", JSON.stringify(deletePayload, null, 2)); + + // Make the API call + const response = await fetch( + `${SEDP_API_BASE_URL}/AdapterData/Delete`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'accept': '*/*', + 'ApiKey': apiKey, + 'ProjectNo': projectCode + }, + body: JSON.stringify(deletePayload) + } + ); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`SEDP Delete API request failed: ${response.status} ${response.statusText} - ${errorText}`); + } + + const data = await response.json(); + return data; + } catch (error: any) { + console.error('Error calling SEDP Delete API:', error); + throw new Error(`Failed to delete tag from SEDP API: ${error.message || 'Unknown error'}`); + } +} + +/** * Server action to send form data to SEDP */ export async function sendFormDataToSEDP( @@ -1793,15 +1844,19 @@ export async function deleteFormDataByTags({ formCode, contractItemId, tagIdxs, + projectId, }: { formCode: string contractItemId: number tagIdxs: string[] + projectId?: number }): Promise<{ error?: string success?: boolean deletedCount?: number deletedTagsCount?: number + sedpDeleteSuccess?: boolean + sedpDeleteError?: string }> { try { // 입력 검증 @@ -1811,7 +1866,7 @@ export async function deleteFormDataByTags({ } } - console.log(`[DELETE ACTION] Deleting tags for formCode: ${formCode}, contractItemId: ${contractItemId}, tagNos:`, tagIdxs) + console.log(`[DELETE ACTION] Deleting tags for formCode: ${formCode}, contractItemId: ${contractItemId}, tagIdxs:`, tagIdxs) // 트랜잭션으로 안전하게 처리 const result = await db.transaction(async (tx) => { @@ -1833,13 +1888,13 @@ export async function deleteFormDataByTags({ } const currentEntry = currentEntryResult[0] - let currentData = Array.isArray(currentEntry.data) ? currentEntry.data : [] + const currentData = Array.isArray(currentEntry.data) ? currentEntry.data : [] console.log(`[DELETE ACTION] Current data count: ${currentData.length}`) // 2. 삭제할 항목들 필터링 (formEntries에서) - const updatedData = currentData.filter((item: any) => - !tagIdxs.includes(item.TAG_IDX) + const updatedData = currentData.filter((item: Record<string, unknown>) => + !tagIdxs.includes(item.TAG_IDX as string) ) const deletedFromFormEntries = currentData.length - updatedData.length @@ -1888,7 +1943,49 @@ export async function deleteFormDataByTags({ } }) - // 5. 캐시 무효화 + // 5. SEDP에서도 삭제 (projectId가 제공된 경우) + let sedpDeleteSuccess = false + let sedpDeleteError: string | undefined + + if (projectId) { + try { + console.log(`[DELETE ACTION] Attempting to delete from SEDP for projectId: ${projectId}`) + + // Get packageCode from contractItem + const contractItem = await db.query.contractItems.findFirst({ + where: eq(contractItems.id, contractItemId), + }) + + if (contractItem) { + const item = await db.query.items.findFirst({ + where: eq(items.id, contractItem.itemId), + }) + + if (item?.packageCode) { + // Get project code + const projectCode = await getProjectCodeById(projectId) + + // Call SEDP delete API + await deleteTagFromSEDP(projectCode, item.packageCode) + + sedpDeleteSuccess = true + console.log(`[DELETE ACTION] Successfully deleted from SEDP for packageCode: ${item.packageCode}`) + } else { + sedpDeleteError = "Package code not found" + console.warn(`[DELETE ACTION] Package code not found for contractItemId: ${contractItemId}`) + } + } else { + sedpDeleteError = "Contract item not found" + console.warn(`[DELETE ACTION] Contract item not found for contractItemId: ${contractItemId}`) + } + } catch (sedpError) { + sedpDeleteError = sedpError instanceof Error ? sedpError.message : "SEDP delete failed" + console.error(`[DELETE ACTION] SEDP delete error:`, sedpError) + // SEDP 삭제 실패는 경고로만 처리 (로컬 삭제는 성공했으므로) + } + } + + // 6. 캐시 무효화 const cacheKey = `form-data-${formCode}-${contractItemId}` revalidateTag(cacheKey) revalidateTag(`tags-${contractItemId}`) @@ -1898,11 +1995,14 @@ export async function deleteFormDataByTags({ console.log(`[DELETE ACTION] Transaction completed successfully`) console.log(`[DELETE ACTION] FormEntries deleted: ${result.deletedFromFormEntries}`) console.log(`[DELETE ACTION] Tags deleted: ${result.deletedTagsCount}`) + console.log(`[DELETE ACTION] SEDP delete success: ${sedpDeleteSuccess}`) return { success: true, deletedCount: result.deletedFromFormEntries, deletedTagsCount: result.deletedTagsCount, + sedpDeleteSuccess, + sedpDeleteError, } } catch (error) { |
