From 5870b73785715d1585531e655c06d8c068eb64ac Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Thu, 27 Nov 2025 17:53:34 +0900
Subject: (김준회) Revert "(대표님) EDP 작업사항" 태그 가져오기 실패 등 에러로
인한 Revert 처리
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../[packageCode]/eng/[formCode]/page.tsx | 95 -------------
.../[packageCode]/im/[formCode]/page.tsx | 95 -------------
.../[projectCode]/[packageCode]/page.tsx | 37 -----
.../(partners)/vendor-data-plant/layout.tsx | 18 ++-
app/api/cron/form-tags-plant/start/route.ts | 141 -------------------
app/api/cron/form-tags-plant/status/route.ts | 46 -------
app/api/cron/tags-plant/start/route.ts | 149 ---------------------
app/api/cron/tags-plant/status/route.ts | 46 -------
8 files changed, 14 insertions(+), 613 deletions(-)
delete mode 100644 app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx
delete mode 100644 app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/im/[formCode]/page.tsx
delete mode 100644 app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/page.tsx
delete mode 100644 app/api/cron/form-tags-plant/start/route.ts
delete mode 100644 app/api/cron/form-tags-plant/status/route.ts
delete mode 100644 app/api/cron/tags-plant/start/route.ts
delete mode 100644 app/api/cron/tags-plant/status/route.ts
(limited to 'app')
diff --git a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx b/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx
deleted file mode 100644
index 351fbca3..00000000
--- a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-// app/[lng]/partners/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx
-import DynamicTable from "@/components/form-data-plant/form-data-table";
-import { getFormData, getFormId,getProjectIdByCode } from "@/lib/forms-plant/services";
-import { useTranslation } from "@/i18n";
-import { Skeleton } from "@/components/ui/skeleton";
-
-interface EngineeringFormPageProps {
- params: {
- lng: string;
- projectCode: string;
- packageCode: string;
- formCode: string;
- };
- searchParams?: {
- mode?: string;
- };
-}
-
-export default async function EngineeringFormPage({
- params,
- searchParams,
-}: EngineeringFormPageProps) {
- // 1) 구조 분해 할당
- const resolvedParams = await params;
-
- // 2) searchParams도 await 필요
- const resolvedSearchParams = await searchParams;
-
- // 3) 구조 분해 할당
- const { lng, projectCode, packageCode, formCode } = resolvedParams;
-
- // i18n 설정
- const { t } = await useTranslation(lng, 'engineering');
-
- // URL 쿼리 파라미터에서 mode 가져오기 (await 해서 사용)
- const mode = "ENG"; // 기본값은 IM
-
- // 4) DB 조회 - projectCode와 packageCode를 전달
- const { columns, data, editableFieldsMap } = await getFormData(
- formCode,
- projectCode,
- packageCode
- );
-
- // 5) formId 조회 - projectCode와 packageCode를 전달
- const { formId } = await getFormId(projectCode, packageCode, formCode, mode);
-
- const projectId = await getProjectIdByCode(projectCode)
-
- // 6) 예외 처리
- if (!columns) {
- return (
-
- {t('errors.form_meta_not_found')}
-
- );
- }
-
- // 7) 렌더링
- return (
-
-
-
-
Engineering Form
-
- Project: {projectCode} / Package: {packageCode} / Form: {formCode}
-
-
-
-
-
-
-
-
- );
-}
-
-function TableSkeleton() {
- return (
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/im/[formCode]/page.tsx b/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/im/[formCode]/page.tsx
deleted file mode 100644
index 29188061..00000000
--- a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/im/[formCode]/page.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-// app/[lng]/partners/vendor-data-plant/[projectCode]/[packageCode]/eng/[formCode]/page.tsx
-import DynamicTable from "@/components/form-data-plant/form-data-table";
-import { getFormData, getFormId, getProjectIdByCode } from "@/lib/forms-plant/services";
-import { useTranslation } from "@/i18n";
-import { Skeleton } from "@/components/ui/skeleton";
-
-interface EngineeringFormPageProps {
- params: {
- lng: string;
- projectCode: string;
- packageCode: string;
- formCode: string;
- };
- searchParams?: {
- mode?: string;
- };
-}
-
-export default async function IMFormPage({
- params,
- searchParams,
-}: EngineeringFormPageProps) {
- // 1) 구조 분해 할당
- const resolvedParams = await params;
-
- // 2) searchParams도 await 필요
- const resolvedSearchParams = await searchParams;
-
- // 3) 구조 분해 할당
- const { lng, projectCode, packageCode, formCode } = resolvedParams;
-
- // i18n 설정
- const { t } = await useTranslation(lng, 'engineering');
-
- // URL 쿼리 파라미터에서 mode 가져오기 (await 해서 사용)
- const mode = "IM"; // 기본값은 IM
-
- // 4) DB 조회 - projectCode와 packageCode를 전달
- const { columns, data, editableFieldsMap } = await getFormData(
- formCode,
- projectCode,
- packageCode
- );
-
- // 5) formId 조회 - projectCode와 packageCode를 전달
- const { formId } = await getFormId(projectCode, packageCode, formCode, mode);
-
- const projectId = await getProjectIdByCode(projectCode)
-
- // 6) 예외 처리
- if (!columns) {
- return (
-
- {t('errors.form_meta_not_found')}
-
- );
- }
-
- // 7) 렌더링
- return (
-
-
-
-
Engineering Form
-
- Project: {projectCode} / Package: {packageCode} / Form: {formCode}
-
-
-
-
-
-
-
-
- );
-}
-
-function TableSkeleton() {
- return (
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/page.tsx b/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/page.tsx
deleted file mode 100644
index 4904a8ff..00000000
--- a/app/[lng]/partners/(partners)/vendor-data-plant/[projectCode]/[packageCode]/page.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-// app/[lng]/partners/vendor-data-plant/[projectCode]/[packageCode]/page.tsx
-
-import { TagsTable } from "@/lib/tags-plant/table/tag-table"
-
-interface MasterTagListPageProps {
- params: Promise<{
- lng: string
- projectCode: string
- packageCode: string
- }>
-}
-
-export default async function MasterTagListPage({
- params,
-}: MasterTagListPageProps) {
- const { projectCode, packageCode } = await params
-
- return (
-
-
-
-
Master Tag List
-
- Project: {projectCode} / Package: {packageCode}
-
-
-
-
- {/* 완전 클라이언트 컴포넌트 */}
-
-
- )
-}
\ No newline at end of file
diff --git a/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx b/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx
index 792a3a6a..8a9c43e9 100644
--- a/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx
+++ b/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx
@@ -2,35 +2,41 @@
import * as React from "react"
import { cookies } from "next/headers"
import { Shell } from "@/components/shell"
+import { getVendorProjectsAndContracts } from "@/lib/vendor-data-plant/services"
import { VendorDataContainer } from "@/components/vendor-data-plant/vendor-data-container"
import { authOptions } from "@/app/api/auth/[...nextauth]/route"
import { getServerSession } from "next-auth"
import { InformationButton } from "@/components/information/information-button"
import { useTranslation } from "@/i18n"
-import { getVendorProjectsWithPackages } from "@/lib/vendor-data/services"
interface VendorDataLayoutProps {
children: React.ReactNode
params: { lng?: string }
}
+// Layout 컴포넌트는 서버 컴포넌트입니다
export default async function VendorDataLayout({
children,
params,
}: VendorDataLayoutProps) {
- const { lng } = await params
+ // 기본 언어는 'ko'로 설정, params.locale이 있으면 사용
+ const { lng } = await params;
const language = lng || 'en'
const { t } = await useTranslation(language, 'engineering')
const session = await getServerSession(authOptions)
const vendorId = session?.user.companyId
+ // const vendorId = "17"
const idAsNumber = Number(vendorId)
- // 프로젝트 및 패키지 데이터 가져오기
- const projects = await getVendorProjectsWithPackages(idAsNumber, "plant")
+ // 프로젝트 데이터 가져오기 (type=plant만)
+ const projects = await getVendorProjectsAndContracts(idAsNumber, "plant")
// 레이아웃 설정 쿠키 가져오기
+ // Next.js 15에서는 cookies()가 Promise를 반환하므로 await 사용
const cookieStore = await cookies()
+
+ // 이제 cookieStore.get() 메서드 사용 가능
const layout = cookieStore.get("react-resizable-panels:layout:mail")
const collapsed = cookieStore.get("react-resizable-panels:collapsed")
@@ -48,6 +54,9 @@ export default async function VendorDataLayout({
+ {/*
+ 각종 Data 입력할 수 있습니다
+
*/}
@@ -65,6 +74,7 @@ export default async function VendorDataLayout({
defaultCollapsed={defaultCollapsed}
navCollapsedSize={4}
>
+ {/* 페이지별 콘텐츠가 여기에 들어갑니다 */}
{children}
)}
diff --git a/app/api/cron/form-tags-plant/start/route.ts b/app/api/cron/form-tags-plant/start/route.ts
deleted file mode 100644
index 17eb8979..00000000
--- a/app/api/cron/form-tags-plant/start/route.ts
+++ /dev/null
@@ -1,141 +0,0 @@
-// app/api/cron/form-tags/start/route.ts
-import { NextRequest } from 'next/server';
-import { v4 as uuidv4 } from 'uuid';
-import { revalidateTag } from 'next/cache';
-
-// 동기화 작업의 상태를 저장할 Map
-// 실제 프로덕션에서는 Redis 또는 DB에 저장하는 것이 좋습니다
-const syncJobs = new Map();
-
-export async function POST(request: NextRequest) {
- try {
- // 요청 데이터 가져오기
- let projectCode: string | undefined;
- let formCode: string | undefined;
- let packageCode: string | undefined;
- let mode: string | undefined;
-
-
- const body = await request.json();
- projectCode = body.projectCode;
- formCode = body.formCode;
- packageCode = body.packageCode;
- mode = body.mode; // 모드 정보 추출
-
-
- // 고유 ID 생성
- const syncId = uuidv4();
-
- // 작업 상태 초기화
- syncJobs.set(syncId, {
- status: 'queued',
- startTime: new Date(),
- formCode,
- projectCode,
- packageCode,
- mode
-
- });
-
- // 비동기 작업 시작 (백그라운드에서 실행)
- processTagImport(syncId).catch(error => {
- console.error('Background tag import job failed:', error);
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'failed',
- endTime: new Date(),
- error: error.message || 'Unknown error occurred'
- });
- });
-
- // 즉시 응답 반환 (작업 ID 포함)
- return Response.json({
- success: true,
- message: 'Tag import job started',
- syncId
- }, { status: 200 });
-
- } catch (error: any) {
- console.error('Failed to start tag import job:', error);
- return Response.json({
- success: false,
- error: error.message || 'Failed to start tag import job'
- }, { status: 500 });
- }
-}
-
-// 백그라운드에서 실행되는 태그 가져오기 작업
-async function processTagImport(syncId: string) {
- try {
- const jobInfo = syncJobs.get(syncId)!;
- const formCode = jobInfo.formCode;
- const projectCode = jobInfo.projectCode;
- const packageCode = jobInfo.packageCode || 0;
- const mode = jobInfo.mode || 0;
-
- // 상태 업데이트: 처리 중
- syncJobs.set(syncId, {
- ...jobInfo,
- status: 'processing',
- progress: 0,
- });
-
- if (!formCode || !projectCode ) {
- throw new Error('formCode,projectCode is required');
- }
-
- // 여기서 실제 태그 가져오기 로직 import
- const { importTagsFromSEDP } = await import('@/lib/sedp/get-form-tags-plant');
-
- // 진행 상황 업데이트를 위한 콜백 함수
- const updateProgress = (progress: number) => {
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- progress
- });
- };
-
- // 실제 태그 가져오기 실행
- const result = await importTagsFromSEDP(formCode, projectCode, packageCode, updateProgress);
-
- // 명시적으로 캐시 무효화
- revalidateTag(`forms-${packageCode}-${mode}`);
-
- // 상태 업데이트: 완료
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'completed',
- endTime: new Date(),
- result,
- progress: 100,
- });
-
- return result;
- } catch (error: any) {
- // 에러 발생 시 상태 업데이트
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'failed',
- endTime: new Date(),
- error: error.message || 'Unknown error occurred',
- });
-
- throw error; // 에러 다시 던지기
- }
-}
-
-// 서버 메모리에 저장된 작업 상태 접근 함수 (다른 API에서 사용)
-export function getSyncJobStatus(id: string) {
- return syncJobs.get(id);
-}
\ No newline at end of file
diff --git a/app/api/cron/form-tags-plant/status/route.ts b/app/api/cron/form-tags-plant/status/route.ts
deleted file mode 100644
index 9d288f52..00000000
--- a/app/api/cron/form-tags-plant/status/route.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-// app/api/cron/tags/status/route.ts
-import { NextRequest } from 'next/server';
-import { getSyncJobStatus } from '../start/route';
-
-export async function GET(request: NextRequest) {
- try {
- // URL에서 작업 ID 가져오기
- const searchParams = request.nextUrl.searchParams;
- const syncId = searchParams.get('id');
-
- if (!syncId) {
- return Response.json({
- success: false,
- error: 'Missing sync ID parameter'
- }, { status: 400 });
- }
-
- // 작업 상태 조회
- const jobStatus = getSyncJobStatus(syncId);
-
- if (!jobStatus) {
- return Response.json({
- success: false,
- error: 'Sync job not found'
- }, { status: 404 });
- }
-
- // 작업 상태 반환
- return Response.json({
- success: true,
- status: jobStatus.status,
- startTime: jobStatus.startTime,
- endTime: jobStatus.endTime,
- progress: jobStatus.progress,
- result: jobStatus.result,
- error: jobStatus.error
- }, { status: 200 });
-
- } catch (error: any) {
- console.error('Error retrieving tag import status:', error);
- return Response.json({
- success: false,
- error: error.message || 'Failed to retrieve tag import status'
- }, { status: 500 });
- }
-}
\ No newline at end of file
diff --git a/app/api/cron/tags-plant/start/route.ts b/app/api/cron/tags-plant/start/route.ts
deleted file mode 100644
index 83e06935..00000000
--- a/app/api/cron/tags-plant/start/route.ts
+++ /dev/null
@@ -1,149 +0,0 @@
-// app/api/cron/tags/start/route.ts
-import { NextRequest } from 'next/server';
-import { v4 as uuidv4 } from 'uuid';
-import { revalidateTag } from 'next/cache';
-
-// 동기화 작업의 상태를 저장할 Map
-// 실제 프로덕션에서는 Redis 또는 DB에 저장하는 것이 좋습니다
-const syncJobs = new Map();
-
-export async function POST(request: NextRequest) {
- try {
- // 요청 데이터 가져오기
- let projectCode: string | undefined;
- let packageCode: string | undefined;
- let mode: string | undefined;
-
- try {
- const body = await request.json();
- projectCode = body.projectCode;
- packageCode = body.packageCode;
- mode = body.mode; // 모드 정보 추출
-
- } catch (error) {
- // 요청 본문이 없거나 JSON이 아닌 경우, URL 파라미터 확인
- const searchParams = request.nextUrl.searchParams;
- const projectCodeParam = searchParams.get('projectCode');
- const packageCodeParam = searchParams.get('packageCode');
-
- if (projectCodeParam&&packageCodeParam) {
- projectCode = projectCodeParam;
- packageCode = packageCodeParam;
- }
- mode = searchParams.get('mode') || undefined;
- }
-
- // 고유 ID 생성
- const syncId = uuidv4();
-
- // 작업 상태 초기화
- syncJobs.set(syncId, {
- status: 'queued',
- startTime: new Date(),
- projectCode,
- packageCode,
- mode
- });
-
- // 비동기 작업 시작 (백그라운드에서 실행)
- processTagImport(syncId).catch(error => {
- console.error('Background tag import job failed:', error);
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'failed',
- endTime: new Date(),
- error: error.message || 'Unknown error occurred'
- });
- });
-
- // 즉시 응답 반환 (작업 ID 포함)
- return Response.json({
- success: true,
- message: 'Tag import job started',
- syncId
- }, { status: 200 });
-
- } catch (error: any) {
- console.error('Failed to start tag import job:', error);
- return Response.json({
- success: false,
- error: error.message || 'Failed to start tag import job'
- }, { status: 500 });
- }
-}
-
-// 백그라운드에서 실행되는 태그 가져오기 작업
-async function processTagImport(syncId: string) {
- try {
- const jobInfo = syncJobs.get(syncId)!;
- const projectCode = jobInfo.projectCode;
- const packageCode = jobInfo.packageCode;
- const mode = jobInfo.mode; // 모드 정보 추출
-
-
- // 상태 업데이트: 처리 중
- syncJobs.set(syncId, {
- ...jobInfo,
- status: 'processing',
- progress: 0,
- });
-
- if (!packageCode) {
- throw new Error('Package is required');
- }
-
- // 여기서 실제 태그 가져오기 로직 import
- const { importTagsFromSEDP } = await import('@/lib/sedp/get-tags-plant');
-
- // 진행 상황 업데이트를 위한 콜백 함수
- const updateProgress = (progress: number) => {
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- progress
- });
- };
-
- // 실제 태그 가져오기 실행
- const result = await importTagsFromSEDP(projectCode, packageCode,updateProgress, mode);
-
- // 명시적으로 캐시 무효화
- revalidateTag(`tags-${packageCode}`);
- revalidateTag(`forms-${packageCode}-${mode}`);
-
- // 상태 업데이트: 완료
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'completed',
- endTime: new Date(),
- result,
- progress: 100,
- });
-
- return result;
- } catch (error: any) {
- // 에러 발생 시 상태 업데이트
- syncJobs.set(syncId, {
- ...syncJobs.get(syncId)!,
- status: 'failed',
- endTime: new Date(),
- error: error.message || 'Unknown error occurred',
- });
-
- throw error; // 에러 다시 던지기
- }
-}
-
-// 서버 메모리에 저장된 작업 상태 접근 함수 (다른 API에서 사용)
-export function getSyncJobStatus(id: string) {
- return syncJobs.get(id);
-}
\ No newline at end of file
diff --git a/app/api/cron/tags-plant/status/route.ts b/app/api/cron/tags-plant/status/route.ts
deleted file mode 100644
index 9d288f52..00000000
--- a/app/api/cron/tags-plant/status/route.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-// app/api/cron/tags/status/route.ts
-import { NextRequest } from 'next/server';
-import { getSyncJobStatus } from '../start/route';
-
-export async function GET(request: NextRequest) {
- try {
- // URL에서 작업 ID 가져오기
- const searchParams = request.nextUrl.searchParams;
- const syncId = searchParams.get('id');
-
- if (!syncId) {
- return Response.json({
- success: false,
- error: 'Missing sync ID parameter'
- }, { status: 400 });
- }
-
- // 작업 상태 조회
- const jobStatus = getSyncJobStatus(syncId);
-
- if (!jobStatus) {
- return Response.json({
- success: false,
- error: 'Sync job not found'
- }, { status: 404 });
- }
-
- // 작업 상태 반환
- return Response.json({
- success: true,
- status: jobStatus.status,
- startTime: jobStatus.startTime,
- endTime: jobStatus.endTime,
- progress: jobStatus.progress,
- result: jobStatus.result,
- error: jobStatus.error
- }, { status: 200 });
-
- } catch (error: any) {
- console.error('Error retrieving tag import status:', error);
- return Response.json({
- success: false,
- error: error.message || 'Failed to retrieve tag import status'
- }, { status: 500 });
- }
-}
\ No newline at end of file
--
cgit v1.2.3