summaryrefslogtreecommitdiff
path: root/db/seeds/seedRevisionSHI.ts
blob: 563878ce2fe5c81d2a65f210d2ae4f162bf19781 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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));