summaryrefslogtreecommitdiff
path: root/db/seeds/seedRevisionSHI.ts
diff options
context:
space:
mode:
Diffstat (limited to 'db/seeds/seedRevisionSHI.ts')
-rw-r--r--db/seeds/seedRevisionSHI.ts162
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