/** * seedSHIRevisions.ts * - 기존 vendor 업로더 타입 리비전 중 일부를 선택하여 * - 동일한 stage와 revision 값을 가지지만 shi 업로더 타입인 리비전을 생성 */ import db from "@/db/db" import { faker } from "@faker-js/faker" import { issueStages, revisions } from "../schema/vendorDocu" import { and, eq, ne } from "drizzle-orm" // SHI 리비전으로 변환할 vendor 리비전의 비율 (0.0 ~ 1.0) const SHI_CONVERSION_RATIO = 0.3; // 가능한 SHI 상태 목록 const SHI_STATUSES = ["official", "approved", "registered"]; // SHI 담당자 목록 const SHI_HANDLERS = [ "김영수 (삼성중공업)", "이지원 (삼성중공업)", "박민호 (삼성중공업)", "정수진 (SHI)", "윤태준 (SHI)" ]; // SHI 코멘트 목록 const SHI_COMMENTS = [ "공식 문서로 등록합니다.", "검토 완료된 문서입니다.", "SHI 표준에 맞게 수정되었습니다.", "등록 완료된 문서입니다.", "최종 승인 문서입니다." ]; async function seedSHIRevisions() { try { console.log("Seeding SHI revisions started...") // 이미 존재하는 vendor 업로더 타입의 리비전 가져오기 const vendorRevisions = await db .select({ id: revisions.id, issueStageId: revisions.issueStageId, revision: revisions.revision }) .from(revisions) .where(eq(revisions.uploaderType, "vendor")); console.log(`Found ${vendorRevisions.length} vendor revisions to potentially convert to SHI.`); if (vendorRevisions.length === 0) { console.warn("No vendor revisions found. Run seedVendorRevisions.ts first."); return; } // SHI 리비전으로 변환할 vendor 리비전 선택 const revisionsToConvert = faker.helpers.arrayElements( vendorRevisions, Math.floor(vendorRevisions.length * SHI_CONVERSION_RATIO) ); console.log(`Selected ${revisionsToConvert.length} revisions to convert to SHI.`); // 이미 SHI 리비전이 존재하는지 확인하기 위한 Set const existingSHIRevisions = new Set(); const shiRevs = await db .select({ issueStageId: revisions.issueStageId, revision: revisions.revision }) .from(revisions) .where(eq(revisions.uploaderType, "shi")); shiRevs.forEach(rev => { existingSHIRevisions.add(`${rev.issueStageId}-${rev.revision}`); }); // 배치 처리를 위한 설정 const BATCH_SIZE = 50; let shiBatch = []; let totalSHICreated = 0; // 각 vendor 리비전에 대해 SHI 리비전 생성 for (const vRev of revisionsToConvert) { // 이미 SHI 리비전이 존재하는 경우 스킵 const key = `${vRev.issueStageId}-${vRev.revision}`; if (existingSHIRevisions.has(key)) { console.log(`Skipping existing SHI revision: ${key}`); continue; } // SHI 리비전 객체 생성 shiBatch.push({ issueStageId: vRev.issueStageId, revision: vRev.revision, uploaderType: "shi", // 업로더 타입을 shi로 설정 uploaderName: faker.helpers.arrayElement(SHI_HANDLERS), comment: faker.helpers.maybe(() => faker.helpers.arrayElement(SHI_COMMENTS), { probability: 0.7 }), status: faker.helpers.arrayElement(SHI_STATUSES), approvedDate: faker.helpers.maybe(() => faker.date.recent({ days: 5 }), { probability: 0.8 }), createdAt: faker.date.recent({ days: 20 }), updatedAt: new Date(), }); // 배치 크기에 도달하면 DB에 삽입 if (shiBatch.length >= BATCH_SIZE) { try { await db.insert(revisions).values(shiBatch); totalSHICreated += shiBatch.length; console.log(`Created ${totalSHICreated} SHI revisions so far...`); shiBatch = []; // 배치 초기화 } catch (error) { console.error(`Error inserting SHI revision batch:`, error); // 유니크 제약조건 충돌 시 개별 삽입 시도 console.log("Trying to insert SHI revisions one by one..."); for (const rev of shiBatch) { try { await db.insert(revisions).values([rev]); totalSHICreated++; } catch (singleError) { console.warn(`Skipping duplicate SHI revision: Stage ${rev.issueStageId}, Rev ${rev.revision}`); } } shiBatch = []; } } } // 마지막 배치 처리 if (shiBatch.length > 0) { try { await db.insert(revisions).values(shiBatch); totalSHICreated += shiBatch.length; } catch (error) { console.error(`Error inserting final SHI revision batch:`, error); // 유니크 제약조건 충돌 시 개별 삽입 시도 console.log("Trying to insert remaining SHI revisions one by one..."); for (const rev of shiBatch) { try { await db.insert(revisions).values([rev]); totalSHICreated++; } catch (singleError) { console.warn(`Skipping duplicate SHI revision: Stage ${rev.issueStageId}, Rev ${rev.revision}`); } } } } console.log(`Seeding SHI revisions completed successfully. Total created: ${totalSHICreated}`); } catch (err) { console.error("Seeding SHI revisions error:", err); process.exit(1); } } // 스크립트 직접 실행 시 seedSHIRevisions() .then(() => process.exit(0)) .catch(() => process.exit(1));