diff options
| author | joonhoekim <26rote@gmail.com> | 2025-03-25 15:55:45 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-03-25 15:55:45 +0900 |
| commit | 1a2241c40e10193c5ff7008a7b7b36cc1d855d96 (patch) | |
| tree | 8a5587f10ca55b162d7e3254cb088b323a34c41b /db/seeds/seedRevisionSHI.ts | |
initial commit
Diffstat (limited to 'db/seeds/seedRevisionSHI.ts')
| -rw-r--r-- | db/seeds/seedRevisionSHI.ts | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/db/seeds/seedRevisionSHI.ts b/db/seeds/seedRevisionSHI.ts new file mode 100644 index 00000000..563878ce --- /dev/null +++ b/db/seeds/seedRevisionSHI.ts @@ -0,0 +1,162 @@ +/** + * 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));
\ No newline at end of file |
