@things-factory/kpi 9.1.19 → 10.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/client/pages/kpi/kpi-list-page.ts +339 -525
  2. package/client/pages/kpi/kpi-tree-page.ts +135 -207
  3. package/client/pages/kpi-metric/kpi-metric-list-page.ts +146 -226
  4. package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +187 -295
  5. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +123 -194
  6. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +57 -91
  7. package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +180 -278
  8. package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +186 -286
  9. package/client/pages/kpi-value/kpi-value-editor-page.ts +189 -292
  10. package/client/pages/kpi-value/kpi-value-list-page.ts +170 -264
  11. package/dist-client/pages/kpi/kpi-list-page.d.ts +0 -6
  12. package/dist-client/pages/kpi/kpi-list-page.js +150 -282
  13. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  14. package/dist-client/pages/kpi/kpi-tree-page.d.ts +1 -7
  15. package/dist-client/pages/kpi/kpi-tree-page.js +76 -127
  16. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -1
  17. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +0 -6
  18. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +62 -116
  19. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  20. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -7
  21. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +82 -140
  22. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  23. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +0 -6
  24. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +54 -98
  25. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  26. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +1 -7
  27. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +30 -57
  28. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
  29. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +1 -7
  30. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +91 -153
  31. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  32. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +0 -6
  33. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +81 -155
  34. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  35. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +1 -7
  36. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +80 -136
  37. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  38. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +0 -6
  39. package/dist-client/pages/kpi-value/kpi-value-list-page.js +73 -134
  40. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  41. package/dist-client/tsconfig.tsbuildinfo +1 -1
  42. package/dist-server/service/index.d.ts +1 -1
  43. package/dist-server/tsconfig.tsbuildinfo +1 -1
  44. package/package.json +18 -18
  45. package/client/tsconfig.json +0 -11
  46. package/dist-server/tsconfig.json +0 -10
  47. package/server/@types/index.d.ts +0 -11
  48. package/server/calculator/evaluator.ts +0 -45
  49. package/server/calculator/functions.ts +0 -67
  50. package/server/calculator/index.ts +0 -4
  51. package/server/calculator/parser.ts +0 -137
  52. package/server/calculator/provider.ts +0 -10
  53. package/server/controllers/index.ts +0 -2
  54. package/server/controllers/kpi-metric-value-provider.ts +0 -79
  55. package/server/controllers/kpi-value-provider.ts +0 -51
  56. package/server/index.ts +0 -6
  57. package/server/migrations/1752190849680-seed-kpi-metrics.ts +0 -124
  58. package/server/migrations/1752190849681-seed-kpi.ts +0 -356
  59. package/server/migrations/1752192090123-add-grades-to-kpi.ts +0 -67
  60. package/server/migrations/1752192090124-add-kpi-statistics.ts +0 -719
  61. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +0 -132
  62. package/server/migrations/1752192090129-seed-kpi-values.ts +0 -207
  63. package/server/migrations/grade-data/x11-performance-table.json +0 -962
  64. package/server/migrations/grade-data/x12-performance-table.json +0 -611
  65. package/server/migrations/grade-data/x14-performance-table.json +0 -42
  66. package/server/migrations/grade-data/x21-performance-table.json +0 -889
  67. package/server/migrations/grade-data/x22-performance-table.json +0 -1064
  68. package/server/migrations/grade-data/x23-performance-table.json +0 -42
  69. package/server/migrations/grade-data/x31-performance-table.json +0 -644
  70. package/server/migrations/grade-data/x32-performance-table.json +0 -993
  71. package/server/migrations/grade-data/x33-performance-table.json +0 -195
  72. package/server/migrations/grade-data/x34-performance-table.json +0 -12
  73. package/server/migrations/grade-data/x35-performance-table.json +0 -42
  74. package/server/migrations/grade-data/x41-performance-table.json +0 -825
  75. package/server/migrations/grade-data/x42-performance-table.json +0 -786
  76. package/server/migrations/grade-data/x43-performance-table.json +0 -12
  77. package/server/migrations/grade-data/x44-performance-table.json +0 -42
  78. package/server/migrations/grade-data/x51-performance-table.json +0 -924
  79. package/server/migrations/grade-data/x52-performance-table.json +0 -42
  80. package/server/migrations/grade-data/x61-performance-table.json +0 -261
  81. package/server/migrations/grade-data/x62-performance-table.json +0 -42
  82. package/server/migrations/index.ts +0 -9
  83. package/server/migrations/seed-data/kpi-metrics-seed.json +0 -454
  84. package/server/migrations/seed-data/kpi-org-scope-seed.json +0 -1676
  85. package/server/migrations/seed-data/kpi-scopes-seed.json +0 -121
  86. package/server/migrations/seed-data/kpi-values-seed.json +0 -402
  87. package/server/migrations/seed-data/kpis-seed.json +0 -488
  88. package/server/migrations/seed-data/scope-definitions-seed.json +0 -90
  89. package/server/routes.ts +0 -81
  90. package/server/service/index.ts +0 -51
  91. package/server/service/kpi/aggregate-kpi.ts +0 -103
  92. package/server/service/kpi/event-subscriber.ts +0 -29
  93. package/server/service/kpi/index.ts +0 -9
  94. package/server/service/kpi/kpi-formula.service.ts +0 -164
  95. package/server/service/kpi/kpi-grade.types.ts +0 -28
  96. package/server/service/kpi/kpi-history.ts +0 -126
  97. package/server/service/kpi/kpi-mutation.ts +0 -553
  98. package/server/service/kpi/kpi-query.ts +0 -224
  99. package/server/service/kpi/kpi-type.ts +0 -151
  100. package/server/service/kpi/kpi.ts +0 -254
  101. package/server/service/kpi-alert/index.ts +0 -3
  102. package/server/service/kpi-alert/kpi-alert-query.ts +0 -59
  103. package/server/service/kpi-alert/kpi-alert-type.ts +0 -20
  104. package/server/service/kpi-metric/aggregate-kpi-metric.ts +0 -132
  105. package/server/service/kpi-metric/index.ts +0 -7
  106. package/server/service/kpi-metric/kpi-metric-mutation.ts +0 -309
  107. package/server/service/kpi-metric/kpi-metric-query.ts +0 -70
  108. package/server/service/kpi-metric/kpi-metric-type.ts +0 -111
  109. package/server/service/kpi-metric/kpi-metric.ts +0 -134
  110. package/server/service/kpi-metric-value/index.ts +0 -7
  111. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +0 -270
  112. package/server/service/kpi-metric-value/kpi-metric-value-query.ts +0 -62
  113. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +0 -82
  114. package/server/service/kpi-metric-value/kpi-metric-value.ts +0 -93
  115. package/server/service/kpi-org-scope/index.ts +0 -6
  116. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +0 -173
  117. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +0 -127
  118. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +0 -68
  119. package/server/service/kpi-org-scope/kpi-org-scope.ts +0 -123
  120. package/server/service/kpi-scope/index.ts +0 -11
  121. package/server/service/kpi-scope/kpi-scope-mutation.ts +0 -129
  122. package/server/service/kpi-scope/kpi-scope-query.ts +0 -63
  123. package/server/service/kpi-scope/kpi-scope-type.ts +0 -96
  124. package/server/service/kpi-scope/kpi-scope.ts +0 -143
  125. package/server/service/kpi-statistic/index.ts +0 -7
  126. package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +0 -231
  127. package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +0 -410
  128. package/server/service/kpi-statistic/kpi-statistic-mutation.ts +0 -291
  129. package/server/service/kpi-statistic/kpi-statistic-query.ts +0 -146
  130. package/server/service/kpi-statistic/kpi-statistic-type.ts +0 -152
  131. package/server/service/kpi-statistic/kpi-statistic.ts +0 -199
  132. package/server/service/kpi-value/index.ts +0 -7
  133. package/server/service/kpi-value/kpi-value-mutation.ts +0 -432
  134. package/server/service/kpi-value/kpi-value-query.ts +0 -61
  135. package/server/service/kpi-value/kpi-value-score.service.ts +0 -106
  136. package/server/service/kpi-value/kpi-value-type.ts +0 -122
  137. package/server/service/kpi-value/kpi-value.ts +0 -160
  138. package/server/service/utils/value-date-util.ts +0 -119
  139. package/server/tsconfig.json +0 -10
  140. package/server/types/global.d.ts +0 -8
@@ -1,356 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
- import { Domain, getRepository } from '@things-factory/shell'
3
- import { Kpi, KpiStatus, KpiPeriodType, KpiVizType } from '../service/kpi/kpi'
4
- import * as fs from 'fs'
5
- import * as path from 'path'
6
-
7
- const SEED = [
8
- // 일정성과 (Y1) - Schedule Performance
9
- {
10
- name: '연면적 대비 공사기간',
11
- description: '연면적 대비 공사기간 평가',
12
- categoryName: '일정성과',
13
- formula: 'Eq. 활용',
14
- scoreType: 'equation',
15
- dataType: 'ratio'
16
- },
17
- {
18
- name: '설계변경에 따른 공기 증감률',
19
- description: '설계변경에 따른 공기 증감률 평가',
20
- categoryName: '일정성과',
21
- formula: 'Eq. 활용',
22
- scoreType: 'equation',
23
- dataType: 'ratio'
24
- },
25
- {
26
- name: '일정 이탈 수준',
27
- description: '프로젝트 일정 이탈 수준 평가',
28
- categoryName: '일정성과',
29
- formula: 'Table(DART 등) 활용(1~5점)',
30
- scoreType: 'table',
31
- dataType: 'score'
32
- },
33
- {
34
- name: '일정성과 수준 평가',
35
- description: '일정성과 종합 평가',
36
- categoryName: '일정성과',
37
- formula: '감리자 1~5점 척도',
38
- scoreType: 'inspector',
39
- dataType: 'score'
40
- },
41
-
42
- // 비용성과 (Y2) - Cost Performance
43
- {
44
- name: '연면적 대비 공사비',
45
- description: '연면적 대비 공사비 평가',
46
- categoryName: '비용성과',
47
- formula: 'Eq. 활용',
48
- scoreType: 'equation',
49
- dataType: 'ratio'
50
- },
51
- {
52
- name: '설계변경에 따른 공사비 증감률',
53
- description: '설계변경에 따른 공사비 증감률 평가',
54
- categoryName: '비용성과',
55
- formula: 'Eq. 활용',
56
- scoreType: 'equation',
57
- dataType: 'ratio'
58
- },
59
- {
60
- name: '비용성과 수준 평가',
61
- description: '비용성과 종합 평가',
62
- categoryName: '비용성과',
63
- formula: '감리자 1~5점 척도',
64
- scoreType: 'inspector',
65
- dataType: 'score'
66
- },
67
-
68
- // 품질성과 (Y3) - Quality Performance
69
- {
70
- name: '품질시험 불합격률',
71
- description: '품질시험 불합격률 평가',
72
- categoryName: '품질성과',
73
- formula: 'Eq. 활용',
74
- scoreType: 'equation',
75
- dataType: 'ratio'
76
- },
77
- {
78
- name: '검수자재 불합격률',
79
- description: '검수자재 불합격률 평가',
80
- categoryName: '품질성과',
81
- formula: 'Eq. 활용',
82
- scoreType: 'equation',
83
- dataType: 'ratio'
84
- },
85
- {
86
- name: '검측 불합격률',
87
- description: '검측 불합격률 평가',
88
- categoryName: '품질성과',
89
- formula: 'Table 활용',
90
- scoreType: 'table',
91
- dataType: 'score'
92
- },
93
- {
94
- name: '품질 SL-PA 결과값',
95
- description: '품질 SL-PA 결과',
96
- categoryName: '품질성과',
97
- formula: 'Python 활용(1~5점)',
98
- scoreType: 'python',
99
- dataType: 'score'
100
- },
101
- {
102
- name: '품질성과 수준 평가',
103
- description: '품질성과 종합 평가',
104
- categoryName: '품질성과',
105
- formula: '감리자 1~5점 척도',
106
- scoreType: 'inspector',
107
- dataType: 'score'
108
- },
109
-
110
- // 안전성과 (Y4) - Safety Performance
111
- {
112
- name: '재해율',
113
- description: '재해율 평가',
114
- categoryName: '안전성과',
115
- formula: 'Eq. 활용',
116
- scoreType: 'equation',
117
- dataType: 'ratio'
118
- },
119
- {
120
- name: '재해강도율',
121
- description: '재해강도율 평가',
122
- categoryName: '안전성과',
123
- formula: 'Table 활용',
124
- scoreType: 'table',
125
- dataType: 'score'
126
- },
127
- {
128
- name: '안전 SL-PA 결과값',
129
- description: '안전 SL-PA 결과',
130
- categoryName: '안전성과',
131
- formula: 'Python 활용(1~5점)',
132
- scoreType: 'python',
133
- dataType: 'score'
134
- },
135
- {
136
- name: '안전성과 수준 평가',
137
- description: '안전성과 종합 평가',
138
- categoryName: '안전성과',
139
- formula: '감리자 1~5점 척도',
140
- scoreType: 'inspector',
141
- dataType: 'score'
142
- },
143
-
144
- // 환경성과 (Y5) - Environmental Performance
145
- {
146
- name: '건설폐기물 발생량',
147
- description: '건설폐기물 발생량 평가',
148
- categoryName: '환경성과',
149
- formula: 'Table 활용',
150
- scoreType: 'table',
151
- dataType: 'score'
152
- },
153
- {
154
- name: '환경성과 수준 평가',
155
- description: '환경성과 종합 평가',
156
- categoryName: '환경성과',
157
- formula: '감리자 1~5점 척도',
158
- scoreType: 'inspector',
159
- dataType: 'score'
160
- },
161
-
162
- // 생산성성과 (Y6) - Productivity Performance
163
- {
164
- name: '투입인력 생산성',
165
- description: '투입인력 생산성 평가',
166
- categoryName: '생산성과',
167
- formula: 'Eq. 활용',
168
- scoreType: 'equation',
169
- dataType: 'ratio'
170
- },
171
- {
172
- name: '생산성성과 수준 평가',
173
- description: '생산성과 종합 평가',
174
- categoryName: '생산성과',
175
- formula: '감리자 1~5점 척도',
176
- scoreType: 'inspector',
177
- dataType: 'score'
178
- }
179
- ]
180
-
181
- interface KpiSeedData {
182
- name: string
183
- description: string
184
- formula?: string | null
185
- active: boolean
186
- state?: string | null
187
- viz_type?: string | null
188
- viz_meta?: any | null
189
- schedule?: string | null
190
- schedule_id?: string | null
191
- timezone?: string | null
192
- grades?: any | null
193
- period_type: string
194
- weight: number
195
- score_formula?: string | null
196
- is_leaf: boolean
197
- parent_name?: string | null
198
- }
199
-
200
- export class SeedKpi1752190849681 implements MigrationInterface {
201
- public async up(queryRunner: QueryRunner): Promise<any> {
202
- try {
203
- const repository = getRepository(Kpi)
204
- const domainRepository = getRepository(Domain)
205
-
206
- // SYSTEM 도메인 확인
207
- const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })
208
- if (!domain) {
209
- console.log('❌ SYSTEM domain not found')
210
- return
211
- }
212
-
213
- // JSON 파일 읽기
214
- const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')
215
- const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))
216
-
217
- // 이름으로 KPI를 찾을 수 있는 맵 생성
218
- const kpiNameMap = new Map<string, Kpi>()
219
-
220
- // 1단계: parent_name이 null인 루트 KPI들 먼저 생성
221
- const rootKpis = seedData.filter(kpi => kpi.parent_name === null)
222
-
223
- for (const kpiData of rootKpis) {
224
- const existingKpi = await repository.findOne({
225
- where: { name: kpiData.name, domain: { id: domain.id } }
226
- })
227
-
228
- if (existingKpi) {
229
- console.log(`⚠️ KPI already exists: ${kpiData.name}`)
230
- kpiNameMap.set(kpiData.name, existingKpi)
231
- continue
232
- }
233
-
234
- const kpi = await repository.save({
235
- name: kpiData.name,
236
- description: kpiData.description,
237
- formula: kpiData.formula,
238
- active: kpiData.active,
239
- state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,
240
- vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,
241
- vizMeta: kpiData.viz_meta,
242
- schedule: kpiData.schedule,
243
- scheduleId: kpiData.schedule_id,
244
- timezone: kpiData.timezone,
245
- grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
246
- periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],
247
- weight: kpiData.weight,
248
- scoreFormula: kpiData.score_formula,
249
- isLeaf: kpiData.is_leaf,
250
- parent: null,
251
- domain
252
- })
253
-
254
- kpiNameMap.set(kpi.name, kpi)
255
- console.log(`✅ Created root KPI: ${kpi.name}`)
256
- }
257
-
258
- // 2단계: 자식 KPI들 생성 (parent_name이 있는 KPI들)
259
- const childKpis = seedData.filter(kpi => kpi.parent_name !== null)
260
-
261
- for (const kpiData of childKpis) {
262
- const existingKpi = await repository.findOne({
263
- where: { name: kpiData.name, domain: { id: domain.id } }
264
- })
265
-
266
- if (existingKpi) {
267
- console.log(`⚠️ KPI already exists: ${kpiData.name}`)
268
- continue
269
- }
270
-
271
- // 부모 KPI 찾기
272
- const parentKpi = kpiNameMap.get(kpiData.parent_name!)
273
- if (!parentKpi) {
274
- console.log(`❌ Parent KPI not found: ${kpiData.parent_name} for ${kpiData.name}`)
275
- continue
276
- }
277
-
278
- const kpi = await repository.save({
279
- name: kpiData.name,
280
- description: kpiData.description,
281
- formula: kpiData.formula,
282
- active: kpiData.active,
283
- state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,
284
- vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,
285
- vizMeta: kpiData.viz_meta,
286
- schedule: kpiData.schedule,
287
- scheduleId: kpiData.schedule_id,
288
- timezone: kpiData.timezone,
289
- grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
290
- periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],
291
- weight: kpiData.weight,
292
- scoreFormula: kpiData.score_formula,
293
- isLeaf: kpiData.is_leaf,
294
- parent: parentKpi,
295
- domain
296
- })
297
-
298
- kpiNameMap.set(kpi.name, kpi)
299
- console.log(`✅ Created child KPI: ${kpi.name} (parent: ${parentKpi.name})`)
300
- }
301
-
302
- console.log(`🎉 Successfully processed ${seedData.length} KPIs from JSON seed`)
303
- } catch (error) {
304
- console.error('❌ Error seeding KPIs from JSON:', error)
305
- throw error
306
- }
307
- }
308
-
309
- public async down(queryRunner: QueryRunner): Promise<any> {
310
- try {
311
- const repository = getRepository(Kpi)
312
- const domainRepository = getRepository(Domain)
313
-
314
- const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })
315
- if (!domain) {
316
- console.log('⚠️ SYSTEM domain not found. Nothing to delete.')
317
- return
318
- }
319
-
320
- // JSON 파일 읽기
321
- const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')
322
- const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))
323
-
324
- // 자식부터 삭제 (역순으로)
325
- const childKpis = seedData.filter(kpi => kpi.parent_name !== null).reverse()
326
- const rootKpis = seedData.filter(kpi => kpi.parent_name === null).reverse()
327
-
328
- // 자식 KPI들 먼저 삭제
329
- for (const kpiData of childKpis) {
330
- const kpi = await repository.findOne({
331
- where: { name: kpiData.name, domain: { id: domain.id } }
332
- })
333
- if (kpi) {
334
- await repository.delete(kpi.id)
335
- console.log(`✅ Deleted child KPI: ${kpiData.name}`)
336
- }
337
- }
338
-
339
- // 루트 KPI들 삭제
340
- for (const kpiData of rootKpis) {
341
- const kpi = await repository.findOne({
342
- where: { name: kpiData.name, domain: { id: domain.id } }
343
- })
344
- if (kpi) {
345
- await repository.delete(kpi.id)
346
- console.log(`✅ Deleted root KPI: ${kpiData.name}`)
347
- }
348
- }
349
-
350
- console.log(`🎉 Successfully cleaned up KPIs from JSON seed`)
351
- } catch (error) {
352
- console.error('❌ Error cleaning up KPIs:', error)
353
- throw error
354
- }
355
- }
356
- }
@@ -1,67 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
- import { getRepository } from '@things-factory/shell'
3
- import { Kpi } from '../service/kpi/kpi'
4
-
5
- import * as fs from 'fs'
6
- import * as path from 'path'
7
-
8
- interface GradeData {
9
- kpiName: string
10
- version: number
11
- description: string
12
- grades: Array<{
13
- name: string
14
- minValue: number
15
- maxValue: number
16
- score?: number
17
- color?: string
18
- description?: string
19
- }>
20
- }
21
-
22
- export class AddGradesToKpi1752192090123 implements MigrationInterface {
23
- name = 'AddGradesToKpi1752192090123'
24
-
25
- public async up(queryRunner: QueryRunner): Promise<void> {
26
- // grade-data 폴더의 JSON 파일들을 읽어서 해당 KPI의 grades 컬럼에 넣기
27
- await this.loadGradeDataToKpi()
28
- }
29
-
30
- public async down(queryRunner: QueryRunner): Promise<void> {}
31
-
32
- private async loadGradeDataToKpi(): Promise<void> {
33
- const gradeDataPath = path.join(__dirname, 'grade-data')
34
- const kpiRepository = getRepository(Kpi)
35
-
36
- try {
37
- // grade-data 폴더의 모든 JSON 파일 읽기
38
- const files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'))
39
-
40
- for (const file of files) {
41
- const filePath = path.join(gradeDataPath, file)
42
- const fileContent = fs.readFileSync(filePath, 'utf8')
43
- const gradeData: GradeData = JSON.parse(fileContent)
44
-
45
- // KPI 이름으로 해당 KPI 찾기
46
- const kpi = await kpiRepository.findOne({
47
- where: { name: gradeData.kpiName, domain: { name: 'SYSTEM' } }
48
- })
49
-
50
- if (kpi) {
51
- // grades 데이터를 업데이트
52
- kpi.grades = gradeData.grades
53
- await kpiRepository.save(kpi)
54
-
55
- console.log(`✅ Loaded grades for KPI: ${gradeData.kpiName} (${gradeData.grades.length} grades)`)
56
- } else {
57
- console.log(`⚠️ KPI not found: ${gradeData.kpiName}`)
58
- }
59
- }
60
-
61
- console.log(`🎉 Successfully loaded grades data for ${files.length} files`)
62
- } catch (error) {
63
- console.error('❌ Error loading grade data:', error)
64
- throw error
65
- }
66
- }
67
- }