summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-10-31 15:37:54 +0900
committerjoonhoekim <26rote@gmail.com>2025-10-31 15:37:54 +0900
commit79f35bcd4974d54d548488562a6da57ad70bc2e8 (patch)
tree0b14957a8e0149c9b3bee6e444152373d79e3fd2
parent6a7648d175522b705d1b5c1ccaef01bfaab8cd1e (diff)
(김준회) EDP 태그 삭제시, 삭제 API도 함께 호출하도록 변경 (스마트엑셀 000154)
-rw-r--r--components/form-data/delete-form-data-dialog.tsx28
-rw-r--r--components/form-data/form-data-table.tsx1
-rw-r--r--lib/forms/services.ts110
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) {