From b43b1d92ef3d7e57b5df5cd72f75dc3a1c3f1c7a Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Thu, 27 Nov 2025 13:48:44 +0900 Subject: (김준회) swp 파일 개수 컬럼 삭제 (API에서 주지 않는 데이터), dolce rebuild 에서 상태값 수정, bulk upload MatchBatchFileDwg API 사용해 Edit 으로 보내도록 수정 (Category, status 하드코딩 값 넣어주도록 처리), 상세도면, 파일 추가시 확인 다이얼로그 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dolce-upload-v2/dolce-upload-page-v2.tsx | 21 +- .../partners/(partners)/dolce-upload-v2/page.tsx | 9 +- i18n/locales/en/dolce.json | 14 +- i18n/locales/ko/dolce.json | 14 +- .../add-and-modify-detail-drawing-dialog.tsx | 415 ++++++++++++--------- lib/dolce/dialogs/b4-bulk-upload-dialog-v3.tsx | 25 +- .../dialogs/upload-files-to-detail-dialog.tsx | 252 ++++++++----- lib/dolce/table/detail-drawing-columns.tsx | 2 +- lib/dolce/table/drawing-list-table-v2.tsx | 4 +- lib/swp/document-service.ts | 46 +-- lib/swp/table/swp-table-columns.tsx | 20 +- lib/swp/vendor-actions.ts | 6 +- 12 files changed, 467 insertions(+), 361 deletions(-) diff --git a/app/[lng]/partners/(partners)/dolce-upload-v2/dolce-upload-page-v2.tsx b/app/[lng]/partners/(partners)/dolce-upload-v2/dolce-upload-page-v2.tsx index f5337c1c..29b41136 100644 --- a/app/[lng]/partners/(partners)/dolce-upload-v2/dolce-upload-page-v2.tsx +++ b/app/[lng]/partners/(partners)/dolce-upload-v2/dolce-upload-page-v2.tsx @@ -33,8 +33,8 @@ import { drawingListColumns } from "@/lib/dolce/table/drawing-list-columns"; import { createGttDrawingListColumns, DocumentType } from "@/lib/dolce/table/gtt-drawing-list-columns"; import { createDetailDrawingColumns } from "@/lib/dolce/table/detail-drawing-columns"; import { createFileListColumns } from "@/lib/dolce/table/file-list-columns"; -// V2: MatchBatchFileDwg API를 사용하지 않는 새로운 일괄 업로드 (DetailDwgReceiptMgmtEdit 사용) -import { B4BulkUploadDialogV2 } from "@/lib/dolce/dialogs/b4-bulk-upload-dialog-v2"; +// V3: Sync 기능 없이 일괄 업로드 (MatchBatchFileDwg / Edit 사용) +import { B4BulkUploadDialogV3 } from "@/lib/dolce/dialogs/b4-bulk-upload-dialog-v3"; // V1로 되돌리려면: 위 줄을 주석 처리하고 아래 줄의 주석을 해제하세요 // import { B4BulkUploadDialog } from "@/lib/dolce/dialogs/b4-bulk-upload-dialog"; import { AddAndModifyDetailDrawingDialog } from "@/lib/dolce/dialogs/add-and-modify-detail-drawing-dialog"; @@ -520,14 +520,14 @@ export default function DolceUploadPageV2({ searchParams }: DolceUploadPageV2Pro {/* 도면 리스트 테이블 - 항상 렌더링 */} - + {t("drawingList.title")} {filteredDrawings.length > 0 && ` ${t("drawingList.count", { count: filteredDrawings.length })}`} - + {!projNo || !vendorInfo ? (
@@ -550,7 +550,8 @@ export default function DolceUploadPageV2({ searchParams }: DolceUploadPageV2Pro onRowClick={handleDrawingClick} selectedRow={selectedDrawing || undefined} getRowId={getDrawingId} - maxHeight="calc(100vh - 600px)" + selectedRow={selectedDrawing || undefined} + getRowId={getDrawingId} minHeight="400px" defaultPageSize={10} /> @@ -612,7 +613,6 @@ export default function DolceUploadPageV2({ searchParams }: DolceUploadPageV2Pro onRowClick={setSelectedDetail} selectedRow={selectedDetail || undefined} getRowId={getDetailDrawingId} - maxHeight="calc(100vh - 600px)" minHeight="400px" defaultPageSize={10} /> @@ -658,7 +658,6 @@ export default function DolceUploadPageV2({ searchParams }: DolceUploadPageV2Pro @@ -667,10 +666,10 @@ export default function DolceUploadPageV2({ searchParams }: DolceUploadPageV2Pro
- {/* B4 일괄 업로드 다이얼로그 (V2) */} - {/* V2: MatchBatchFileDwg API를 사용하지 않는 새로운 방식 */} + {/* B4 일괄 업로드 다이얼로그 (V3) */} + {/* V3: Sync 기능 없이 일괄 업로드 (MatchBatchFileDwg / Edit 사용) */} {vendorInfo && vendorInfo.drawingKind === "B4" && projNo && ( - )} - {/* V1로 되돌리려면: 위의 B4BulkUploadDialogV2를 B4BulkUploadDialog로 변경하세요 */} + {/* V1로 되돌리려면: 위의 B4BulkUploadDialogV3를 B4BulkUploadDialog로 변경하세요 */} {/* 상세도면 추가 다이얼로그 */} {vendorInfo && selectedDrawing && ( diff --git a/app/[lng]/partners/(partners)/dolce-upload-v2/page.tsx b/app/[lng]/partners/(partners)/dolce-upload-v2/page.tsx index 6655606f..9ce7c6c6 100644 --- a/app/[lng]/partners/(partners)/dolce-upload-v2/page.tsx +++ b/app/[lng]/partners/(partners)/dolce-upload-v2/page.tsx @@ -53,14 +53,9 @@ export default async function DolceUploadPageWrapper({

{lng === "ko" - ? "DOLCE 도면 업로드 V2" - : "DOLCE Drawing Upload V2"} + ? "조선 도면 업로드" + : "Shipbuilding Drawing Upload"}

-

- {lng === "ko" - ? "설계문서를 조회하고 업로드할 수 있습니다 (분할 레이아웃)" - : "View and upload design documents (Split Layout)"} -

diff --git a/i18n/locales/en/dolce.json b/i18n/locales/en/dolce.json index 66d98f8a..adb35efe 100644 --- a/i18n/locales/en/dolce.json +++ b/i18n/locales/en/dolce.json @@ -144,7 +144,12 @@ "selectFilesError": "Please select files", "uploadSuccess": "{{count}} file(s) uploaded successfully", "uploadError": "Upload failed", - "uploadErrorMessage": "An error occurred during upload" + "uploadErrorMessage": "An error occurred during upload", + "confirmTitle": "Confirm File Upload", + "confirmMessage": "Do you want to upload the selected files?", + "backButton": "Back", + "confirmUpload": "Upload", + "nextButton": "Next" }, "addDetailDialog": { "title": "Add Detail Drawing", @@ -180,7 +185,12 @@ "addSuccessPartialUpload": "Detail drawing added but file upload failed: {{error}}", "addSuccess": "Detail drawing added successfully", "addError": "Failed to add detail drawing", - "addErrorMessage": "An error occurred while adding detail drawing" + "addErrorMessage": "An error occurred while adding detail drawing", + "confirmTitle": "Confirmation", + "confirmMessage": "Do you want to submit with the following details?", + "backButton": "Back", + "confirmSubmit": "Submit", + "nextButton": "Next" }, "editDetailDialog": { "title": "Edit Detail Drawing", diff --git a/i18n/locales/ko/dolce.json b/i18n/locales/ko/dolce.json index 94c61d26..e9f7f862 100644 --- a/i18n/locales/ko/dolce.json +++ b/i18n/locales/ko/dolce.json @@ -144,7 +144,12 @@ "selectFilesError": "파일을 선택해주세요", "uploadSuccess": "{{count}}개 파일 업로드 완료", "uploadError": "업로드 실패", - "uploadErrorMessage": "업로드 중 오류가 발생했습니다" + "uploadErrorMessage": "업로드 중 오류가 발생했습니다", + "confirmTitle": "파일 업로드 확인", + "confirmMessage": "선택한 파일을 업로드하시겠습니까?", + "backButton": "뒤로", + "confirmUpload": "업로드", + "nextButton": "다음" }, "addDetailDialog": { "title": "상세도면 추가", @@ -180,7 +185,12 @@ "addSuccessPartialUpload": "상세도면은 추가되었으나 파일 업로드 실패: {{error}}", "addSuccess": "상세도면이 추가되었습니다", "addError": "상세도면 추가에 실패했습니다", - "addErrorMessage": "상세도면 추가 중 오류가 발생했습니다" + "addErrorMessage": "상세도면 추가 중 오류가 발생했습니다", + "confirmTitle": "확인", + "confirmMessage": "아래 내용으로 제출하시겠습니까?", + "backButton": "뒤로", + "confirmSubmit": "제출", + "nextButton": "다음" }, "editDetailDialog": { "title": "상세도면 수정", diff --git a/lib/dolce/dialogs/add-and-modify-detail-drawing-dialog.tsx b/lib/dolce/dialogs/add-and-modify-detail-drawing-dialog.tsx index 673d48d6..0253228b 100644 --- a/lib/dolce/dialogs/add-and-modify-detail-drawing-dialog.tsx +++ b/lib/dolce/dialogs/add-and-modify-detail-drawing-dialog.tsx @@ -72,6 +72,8 @@ export function AddAndModifyDetailDrawingDialog({ const [comment, setComment] = useState(""); const [isSubmitting, setIsSubmitting] = useState(false); + const [showConfirmation, setShowConfirmation] = useState(false); + // Edit 모드일 때 초기값 설정 useEffect(() => { if (mode === "edit" && detailDrawing && open) { @@ -155,9 +157,10 @@ export function AddAndModifyDetailDrawingDialog({ setRevisionError(""); setComment(""); clearFiles(); + setShowConfirmation(false); }; - // 제출 + // 제출 (확인 단계 포함) const handleSubmit = async () => { // 유효성 검사 if (!registerKind) { @@ -200,6 +203,12 @@ export function AddAndModifyDetailDrawingDialog({ return; } + // 확인 단계가 아니면 확인 단계로 이동 + if (!showConfirmation) { + setShowConfirmation(true); + return; + } + try { setIsSubmitting(true); @@ -212,7 +221,7 @@ export function AddAndModifyDetailDrawingDialog({ dwgList: [ { Mode: "ADD", - Status: "Submitted", + Status: "Standby", RegisterId: 0, ProjectNo: drawing.ProjectNo, Discipline: drawing.Discipline, @@ -329,8 +338,12 @@ export function AddAndModifyDetailDrawingDialog({ }; const handleCancel = () => { - resetForm(); - onOpenChange(false); + if (showConfirmation) { + setShowConfirmation(false); + } else { + resetForm(); + onOpenChange(false); + } }; // DrawingUsage가 변경되면 RegisterKind 초기화 @@ -355,219 +368,279 @@ export function AddAndModifyDetailDrawingDialog({ return ( - + - {mode === "edit" ? t("editDetailDialog.title") : t("addDetailDialog.title")} + {showConfirmation + ? t("addDetailDialog.confirmTitle", "확인") + : (mode === "edit" ? t("editDetailDialog.title") : t("addDetailDialog.title")) + } -
- {/* 도면 정보 표시 */} - {mode === "add" && drawing && ( + {showConfirmation ? ( +
-
{drawing.DrawingNo}
-
{drawing.DrawingName}
+ {t("addDetailDialog.confirmMessage", "아래 내용으로 제출하시겠습니까?")}
- )} - {mode === "edit" && detailDrawing && ( - - - -
{detailDrawing.DrawingNo} - Rev. {detailDrawing.DrawingRevNo}
-
{detailDrawing.DrawingName}
-
-
- )} +
+
+ +

+ {drawingUsageOptions.find(opt => opt.value === drawingUsage)?.label || drawingUsage} +

+
+
+ +

+ {registerKindOptions.find(opt => opt.value === registerKind)?.label || registerKind} +

+
+ {drawingUsage !== "CMT" && ( +
+ +

{revision}

+
+ )} +
+ +

{comment || "-"}

+
+
+ + {files.length > 0 && ( +
+ +
+ {isSubmitting ? ( + + ) : ( + files.map((file, index) => ( +
+ + {file.name} + + {(file.size / 1024 / 1024).toFixed(2)} MB + +
+ )) + )} +
+
+ )} +
+ ) : ( +
+ {/* 도면 정보 표시 */} + {mode === "add" && drawing && ( + + + +
{drawing.DrawingNo}
+
{drawing.DrawingName}
+
+
+ )} + + {mode === "edit" && detailDrawing && ( + + + +
{detailDrawing.DrawingNo} - Rev. {detailDrawing.DrawingRevNo}
+
{detailDrawing.DrawingName}
+
+
+ )} - {/* 도면용도 선택 (Add 모드에서만 표시) */} - {mode === "add" && ( + {/* 도면용도 선택 (Add 모드에서만 표시) */} + {mode === "add" && ( +
+ + +
+ )} + + {/* 등록종류 선택 */}
- - - + - {drawingUsageOptions.map((option) => ( + {registerKindOptions.map((option) => ( {option.label} ))} + {revisionRule && ( +

+ {t("addDetailDialog.revisionFormatPrefix")}{revisionRule} +

+ )}
- )} - - {/* 등록종류 선택 */} -
- - - {revisionRule && ( -

- {t("addDetailDialog.revisionFormatPrefix")}{revisionRule} -

+ + {/* Revision 입력 */} + {drawingUsage !== "CMT" && ( +
+ + handleRevisionChange(e.target.value)} + placeholder={t("addDetailDialog.revisionPlaceholder")} + disabled={!registerKind} + className={revisionError ? "border-red-500 focus-visible:ring-red-500" : ""} + /> + {revisionError && ( +

+ {revisionError} +

+ )} + {!revisionError && revision && ( +

+ {t("addDetailDialog.revisionValid")} +

+ )} +
)} -
- {/* Revision 입력 */} - {drawingUsage !== "CMT" && ( + {/* Comment 입력 */}
- - handleRevisionChange(e.target.value)} - placeholder={t("addDetailDialog.revisionPlaceholder")} - disabled={!registerKind} - className={revisionError ? "border-red-500 focus-visible:ring-red-500" : ""} + +