@dssp/dkpi 1.0.0-alpha.24 → 1.0.0-alpha.26
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.
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/schema.graphql +1589 -216
- package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +0 -5
- package/dist-server/migrations/1752188906708-SeedKpiCategory.js +0 -53
- package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +0 -1
- package/dist-server/migrations/1752190849681-SeedKpi.d.ts +0 -5
- package/dist-server/migrations/1752190849681-SeedKpi.js +0 -255
- package/dist-server/migrations/1752190849681-SeedKpi.js.map +0 -1
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +0 -7
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +0 -51
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +0 -1
- package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +0 -5
- package/dist-server/migrations/1752192090124-add-kpi-statistics.js +0 -707
- package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +0 -1
- package/dist-server/migrations/grade-data/x11-performance-table.json +0 -962
- package/dist-server/migrations/grade-data/x12-performance-table.json +0 -611
- package/dist-server/migrations/grade-data/x14-performance-table.json +0 -42
- package/dist-server/migrations/grade-data/x21-performance-table.json +0 -889
- package/dist-server/migrations/grade-data/x22-performance-table.json +0 -1064
- package/dist-server/migrations/grade-data/x23-performance-table.json +0 -42
- package/dist-server/migrations/grade-data/x31-performance-table.json +0 -644
- package/dist-server/migrations/grade-data/x32-performance-table.json +0 -993
- package/dist-server/migrations/grade-data/x33-performance-table.json +0 -195
- package/dist-server/migrations/grade-data/x34-performance-table.json +0 -12
- package/dist-server/migrations/grade-data/x35-performance-table.json +0 -42
- package/dist-server/migrations/grade-data/x41-performance-table.json +0 -825
- package/dist-server/migrations/grade-data/x42-performance-table.json +0 -786
- package/dist-server/migrations/grade-data/x43-performance-table.json +0 -12
- package/dist-server/migrations/grade-data/x44-performance-table.json +0 -42
- package/dist-server/migrations/grade-data/x51-performance-table.json +0 -924
- package/dist-server/migrations/grade-data/x52-performance-table.json +0 -42
- package/dist-server/migrations/grade-data/x61-performance-table.json +0 -261
- package/dist-server/migrations/grade-data/x62-performance-table.json +0 -42
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SeedKpiCategory1752188906708 = void 0;
|
|
4
|
-
const shell_1 = require("@things-factory/shell");
|
|
5
|
-
const kpi_1 = require("@things-factory/kpi");
|
|
6
|
-
const SEED = [
|
|
7
|
-
{
|
|
8
|
-
name: '일정성과',
|
|
9
|
-
description: '프로젝트 일정 준수 및 일정 이탈 수준 평가'
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
name: '비용성과',
|
|
13
|
-
description: '프로젝트 비용 집행 및 비용성과 수준 평가'
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
name: '품질성과',
|
|
17
|
-
description: '품질 불합격률, 품질성과 수준 등 품질 관련 성과 평가'
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: '안전성과',
|
|
21
|
-
description: '재해율, SL-PA 등 안전 관련 성과 평가'
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: '환경성과',
|
|
25
|
-
description: '건설폐기물 등 환경 관련 성과 평가'
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
name: '생산성과',
|
|
29
|
-
description: '투입인력 생산성 등 생산성 관련 성과 평가'
|
|
30
|
-
}
|
|
31
|
-
];
|
|
32
|
-
class SeedKpiCategory1752188906708 {
|
|
33
|
-
async up(queryRunner) {
|
|
34
|
-
const repository = (0, shell_1.getRepository)(kpi_1.KpiCategory);
|
|
35
|
-
const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
|
|
36
|
-
name: 'SYSTEM'
|
|
37
|
-
});
|
|
38
|
-
return await Promise.all(SEED.map(async (kpiCategory) => {
|
|
39
|
-
await repository.save(Object.assign(Object.assign({}, kpiCategory), { domain }));
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
async down(queryRunner) {
|
|
43
|
-
const repository = (0, shell_1.getRepository)(kpi_1.KpiCategory);
|
|
44
|
-
const domain = await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({
|
|
45
|
-
name: 'SYSTEM'
|
|
46
|
-
});
|
|
47
|
-
return await Promise.all(SEED.reverse().map(async (kpiCategory) => {
|
|
48
|
-
await repository.delete({ name: kpiCategory.name, domain: { id: domain.id } });
|
|
49
|
-
}));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.SeedKpiCategory1752188906708 = SeedKpiCategory1752188906708;
|
|
53
|
-
//# sourceMappingURL=1752188906708-SeedKpiCategory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"1752188906708-SeedKpiCategory.js","sourceRoot":"","sources":["../../server/migrations/1752188906708-SeedKpiCategory.ts"],"names":[],"mappings":";;;AACA,iDAA6D;AAC7D,6CAAiD;AAEjD,MAAM,IAAI,GAAG;IACX;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,yBAAyB;KACvC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,gCAAgC;KAC9C;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,0BAA0B;KACxC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,qBAAqB;KACnC;IACD;QACE,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,yBAAyB;KACvC;CACF,CAAA;AAED,MAAa,4BAA4B;IAChC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,iBAAW,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAW,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC;YAC3D,IAAI,EAAE,QAAQ;SACf,CAAC,CAAA;QAEF,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAC,WAAW,EAAC,EAAE;YAC3B,MAAM,UAAU,CAAC,IAAI,iCAChB,WAAW,KACd,MAAM,IACN,CAAA;QACJ,CAAC,CAAC,CACH,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,iBAAW,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAW,MAAM,IAAA,qBAAa,EAAC,cAAM,CAAC,CAAC,SAAS,CAAC;YAC3D,IAAI,EAAE,QAAQ;SACf,CAAC,CAAA;QAEF,OAAO,MAAM,OAAO,CAAC,GAAG,CACtB,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAC,WAAW,EAAC,EAAE;YACrC,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,CACH,CAAA;IACH,CAAC;CACF;AA7BD,oEA6BC","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { KpiCategory } from '@things-factory/kpi'\n\nconst SEED = [\n {\n name: '일정성과',\n description: '프로젝트 일정 준수 및 일정 이탈 수준 평가'\n },\n {\n name: '비용성과',\n description: '프로젝트 비용 집행 및 비용성과 수준 평가'\n },\n {\n name: '품질성과',\n description: '품질 불합격률, 품질성과 수준 등 품질 관련 성과 평가'\n },\n {\n name: '안전성과',\n description: '재해율, SL-PA 등 안전 관련 성과 평가'\n },\n {\n name: '환경성과',\n description: '건설폐기물 등 환경 관련 성과 평가'\n },\n {\n name: '생산성과',\n description: '투입인력 생산성 등 생산성 관련 성과 평가'\n }\n]\n\nexport class SeedKpiCategory1752188906708 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<any> {\n const repository = getRepository(KpiCategory)\n const domain: Domain = await getRepository(Domain).findOneBy({\n name: 'SYSTEM'\n })\n\n return await Promise.all(\n SEED.map(async kpiCategory => {\n await repository.save({\n ...kpiCategory,\n domain\n })\n })\n )\n }\n\n public async down(queryRunner: QueryRunner): Promise<any> {\n const repository = getRepository(KpiCategory)\n const domain: Domain = await getRepository(Domain).findOneBy({\n name: 'SYSTEM'\n })\n\n return await Promise.all(\n SEED.reverse().map(async kpiCategory => {\n await repository.delete({ name: kpiCategory.name, domain: { id: domain.id } })\n })\n )\n }\n}\n"]}
|
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SeedKpi1752190849681 = void 0;
|
|
4
|
-
const shell_1 = require("@things-factory/shell");
|
|
5
|
-
const kpi_1 = require("@things-factory/kpi");
|
|
6
|
-
const SEED = [
|
|
7
|
-
// 일정성과 (Y1) - Schedule Performance
|
|
8
|
-
{
|
|
9
|
-
name: '연면적 대비 공사기간',
|
|
10
|
-
description: '연면적 대비 공사기간 평가',
|
|
11
|
-
categoryName: '일정성과',
|
|
12
|
-
formula: 'Eq. 활용',
|
|
13
|
-
scoreType: 'equation',
|
|
14
|
-
dataType: 'ratio'
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
name: '설계변경에 따른 공기 증감률',
|
|
18
|
-
description: '설계변경에 따른 공기 증감률 평가',
|
|
19
|
-
categoryName: '일정성과',
|
|
20
|
-
formula: 'Eq. 활용',
|
|
21
|
-
scoreType: 'equation',
|
|
22
|
-
dataType: 'ratio'
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
name: '일정 이탈 수준',
|
|
26
|
-
description: '프로젝트 일정 이탈 수준 평가',
|
|
27
|
-
categoryName: '일정성과',
|
|
28
|
-
formula: 'Table(DART 등) 활용(1~5점)',
|
|
29
|
-
scoreType: 'table',
|
|
30
|
-
dataType: 'score'
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: '일정성과 수준 평가',
|
|
34
|
-
description: '일정성과 종합 평가',
|
|
35
|
-
categoryName: '일정성과',
|
|
36
|
-
formula: '감리자 1~5점 척도',
|
|
37
|
-
scoreType: 'inspector',
|
|
38
|
-
dataType: 'score'
|
|
39
|
-
},
|
|
40
|
-
// 비용성과 (Y2) - Cost Performance
|
|
41
|
-
{
|
|
42
|
-
name: '연면적 대비 공사비',
|
|
43
|
-
description: '연면적 대비 공사비 평가',
|
|
44
|
-
categoryName: '비용성과',
|
|
45
|
-
formula: 'Eq. 활용',
|
|
46
|
-
scoreType: 'equation',
|
|
47
|
-
dataType: 'ratio'
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: '설계변경에 따른 공사비 증감률',
|
|
51
|
-
description: '설계변경에 따른 공사비 증감률 평가',
|
|
52
|
-
categoryName: '비용성과',
|
|
53
|
-
formula: 'Eq. 활용',
|
|
54
|
-
scoreType: 'equation',
|
|
55
|
-
dataType: 'ratio'
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
name: '비용성과 수준 평가',
|
|
59
|
-
description: '비용성과 종합 평가',
|
|
60
|
-
categoryName: '비용성과',
|
|
61
|
-
formula: '감리자 1~5점 척도',
|
|
62
|
-
scoreType: 'inspector',
|
|
63
|
-
dataType: 'score'
|
|
64
|
-
},
|
|
65
|
-
// 품질성과 (Y3) - Quality Performance
|
|
66
|
-
{
|
|
67
|
-
name: '품질시험 불합격률',
|
|
68
|
-
description: '품질시험 불합격률 평가',
|
|
69
|
-
categoryName: '품질성과',
|
|
70
|
-
formula: 'Eq. 활용',
|
|
71
|
-
scoreType: 'equation',
|
|
72
|
-
dataType: 'ratio'
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
name: '검수자재 불합격률',
|
|
76
|
-
description: '검수자재 불합격률 평가',
|
|
77
|
-
categoryName: '품질성과',
|
|
78
|
-
formula: 'Eq. 활용',
|
|
79
|
-
scoreType: 'equation',
|
|
80
|
-
dataType: 'ratio'
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
name: '검측 불합격률',
|
|
84
|
-
description: '검측 불합격률 평가',
|
|
85
|
-
categoryName: '품질성과',
|
|
86
|
-
formula: 'Table 활용',
|
|
87
|
-
scoreType: 'table',
|
|
88
|
-
dataType: 'score'
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
name: '품질 SL-PA 결과값',
|
|
92
|
-
description: '품질 SL-PA 결과',
|
|
93
|
-
categoryName: '품질성과',
|
|
94
|
-
formula: 'Python 활용(1~5점)',
|
|
95
|
-
scoreType: 'python',
|
|
96
|
-
dataType: 'score'
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
name: '품질성과 수준 평가',
|
|
100
|
-
description: '품질성과 종합 평가',
|
|
101
|
-
categoryName: '품질성과',
|
|
102
|
-
formula: '감리자 1~5점 척도',
|
|
103
|
-
scoreType: 'inspector',
|
|
104
|
-
dataType: 'score'
|
|
105
|
-
},
|
|
106
|
-
// 안전성과 (Y4) - Safety Performance
|
|
107
|
-
{
|
|
108
|
-
name: '재해율',
|
|
109
|
-
description: '재해율 평가',
|
|
110
|
-
categoryName: '안전성과',
|
|
111
|
-
formula: 'Eq. 활용',
|
|
112
|
-
scoreType: 'equation',
|
|
113
|
-
dataType: 'ratio'
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
name: '재해강도율',
|
|
117
|
-
description: '재해강도율 평가',
|
|
118
|
-
categoryName: '안전성과',
|
|
119
|
-
formula: 'Table 활용',
|
|
120
|
-
scoreType: 'table',
|
|
121
|
-
dataType: 'score'
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
name: '안전 SL-PA 결과값',
|
|
125
|
-
description: '안전 SL-PA 결과',
|
|
126
|
-
categoryName: '안전성과',
|
|
127
|
-
formula: 'Python 활용(1~5점)',
|
|
128
|
-
scoreType: 'python',
|
|
129
|
-
dataType: 'score'
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
name: '안전성과 수준 평가',
|
|
133
|
-
description: '안전성과 종합 평가',
|
|
134
|
-
categoryName: '안전성과',
|
|
135
|
-
formula: '감리자 1~5점 척도',
|
|
136
|
-
scoreType: 'inspector',
|
|
137
|
-
dataType: 'score'
|
|
138
|
-
},
|
|
139
|
-
// 환경성과 (Y5) - Environmental Performance
|
|
140
|
-
{
|
|
141
|
-
name: '건설폐기물 발생량',
|
|
142
|
-
description: '건설폐기물 발생량 평가',
|
|
143
|
-
categoryName: '환경성과',
|
|
144
|
-
formula: 'Table 활용',
|
|
145
|
-
scoreType: 'table',
|
|
146
|
-
dataType: 'score'
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
name: '환경성과 수준 평가',
|
|
150
|
-
description: '환경성과 종합 평가',
|
|
151
|
-
categoryName: '환경성과',
|
|
152
|
-
formula: '감리자 1~5점 척도',
|
|
153
|
-
scoreType: 'inspector',
|
|
154
|
-
dataType: 'score'
|
|
155
|
-
},
|
|
156
|
-
// 생산성성과 (Y6) - Productivity Performance
|
|
157
|
-
{
|
|
158
|
-
name: '투입인력 생산성',
|
|
159
|
-
description: '투입인력 생산성 평가',
|
|
160
|
-
categoryName: '생산성과',
|
|
161
|
-
formula: 'Eq. 활용',
|
|
162
|
-
scoreType: 'equation',
|
|
163
|
-
dataType: 'ratio'
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
name: '생산성성과 수준 평가',
|
|
167
|
-
description: '생산성과 종합 평가',
|
|
168
|
-
categoryName: '생산성과',
|
|
169
|
-
formula: '감리자 1~5점 척도',
|
|
170
|
-
scoreType: 'inspector',
|
|
171
|
-
dataType: 'score'
|
|
172
|
-
}
|
|
173
|
-
];
|
|
174
|
-
class SeedKpi1752190849681 {
|
|
175
|
-
async up(queryRunner) {
|
|
176
|
-
const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
|
|
177
|
-
const categoryRepository = (0, shell_1.getRepository)(kpi_1.KpiCategory);
|
|
178
|
-
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
179
|
-
// SYSTEM 도메인 확인 또는 생성
|
|
180
|
-
let domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
|
|
181
|
-
// 카테고리들 확인 또는 생성
|
|
182
|
-
const categories = ['일정성과', '비용성과', '품질성과', '안전성과', '환경성과', '생산성과'];
|
|
183
|
-
const categoryMap = new Map();
|
|
184
|
-
for (const categoryName of categories) {
|
|
185
|
-
let category = await categoryRepository.findOneBy({
|
|
186
|
-
name: categoryName,
|
|
187
|
-
domain: { id: domain.id }
|
|
188
|
-
});
|
|
189
|
-
categoryMap.set(categoryName, category);
|
|
190
|
-
}
|
|
191
|
-
// KPI 데이터 생성
|
|
192
|
-
const results = [];
|
|
193
|
-
for (const kpiData of SEED) {
|
|
194
|
-
try {
|
|
195
|
-
const category = categoryMap.get(kpiData.categoryName);
|
|
196
|
-
if (!category) {
|
|
197
|
-
console.log(`❌ Category not found for KPI: ${kpiData.name}`);
|
|
198
|
-
continue;
|
|
199
|
-
}
|
|
200
|
-
const existingKpi = await repository.findOneBy({
|
|
201
|
-
name: kpiData.name,
|
|
202
|
-
domain: { id: domain.id }
|
|
203
|
-
});
|
|
204
|
-
if (existingKpi) {
|
|
205
|
-
console.log(`⚠️ KPI already exists: ${kpiData.name}`);
|
|
206
|
-
continue;
|
|
207
|
-
}
|
|
208
|
-
const kpi = await repository.save(Object.assign(Object.assign({}, kpiData), { category,
|
|
209
|
-
domain, active: true, state: kpi_1.KpiStatus.DRAFT }));
|
|
210
|
-
console.log(`✅ Created KPI: ${kpiData.name}`);
|
|
211
|
-
results.push(kpi);
|
|
212
|
-
}
|
|
213
|
-
catch (error) {
|
|
214
|
-
console.error(`❌ Error creating KPI "${kpiData.name}":`, error);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
console.log(`🎉 Successfully created ${results.length} KPIs`);
|
|
218
|
-
return results;
|
|
219
|
-
}
|
|
220
|
-
async down(queryRunner) {
|
|
221
|
-
const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
|
|
222
|
-
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
223
|
-
const domain = await domainRepository.findOneBy({
|
|
224
|
-
name: 'SYSTEM'
|
|
225
|
-
});
|
|
226
|
-
if (!domain) {
|
|
227
|
-
console.log('⚠️ SYSTEM domain not found. Nothing to delete.');
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
const results = [];
|
|
231
|
-
for (const kpiData of SEED.reverse()) {
|
|
232
|
-
try {
|
|
233
|
-
const kpi = await repository.findOneBy({
|
|
234
|
-
name: kpiData.name,
|
|
235
|
-
domain: { id: domain.id }
|
|
236
|
-
});
|
|
237
|
-
if (kpi) {
|
|
238
|
-
await repository.delete(kpi);
|
|
239
|
-
console.log(`✅ Deleted KPI: ${kpiData.name}`);
|
|
240
|
-
results.push(kpiData.name);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
console.log(`⚠️ KPI not found: ${kpiData.name}`);
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch (error) {
|
|
247
|
-
console.error(`❌ Error deleting KPI "${kpiData.name}":`, error);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
console.log(`🎉 Successfully deleted ${results.length} KPIs`);
|
|
251
|
-
return results;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
exports.SeedKpi1752190849681 = SeedKpi1752190849681;
|
|
255
|
-
//# sourceMappingURL=1752190849681-SeedKpi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"1752190849681-SeedKpi.js","sourceRoot":"","sources":["../../server/migrations/1752190849681-SeedKpi.ts"],"names":[],"mappings":"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","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { Kpi, KpiStatus, KpiCategory } from '@things-factory/kpi'\n\nconst SEED = [\n // 일정성과 (Y1) - Schedule Performance\n {\n name: '연면적 대비 공사기간',\n description: '연면적 대비 공사기간 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공기 증감률',\n description: '설계변경에 따른 공기 증감률 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '일정 이탈 수준',\n description: '프로젝트 일정 이탈 수준 평가',\n categoryName: '일정성과',\n formula: 'Table(DART 등) 활용(1~5점)',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '일정성과 수준 평가',\n description: '일정성과 종합 평가',\n categoryName: '일정성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 비용성과 (Y2) - Cost Performance\n {\n name: '연면적 대비 공사비',\n description: '연면적 대비 공사비 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공사비 증감률',\n description: '설계변경에 따른 공사비 증감률 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '비용성과 수준 평가',\n description: '비용성과 종합 평가',\n categoryName: '비용성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 품질성과 (Y3) - Quality Performance\n {\n name: '품질시험 불합격률',\n description: '품질시험 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검수자재 불합격률',\n description: '검수자재 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검측 불합격률',\n description: '검측 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '품질 SL-PA 결과값',\n description: '품질 SL-PA 결과',\n categoryName: '품질성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '품질성과 수준 평가',\n description: '품질성과 종합 평가',\n categoryName: '품질성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 안전성과 (Y4) - Safety Performance\n {\n name: '재해율',\n description: '재해율 평가',\n categoryName: '안전성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '재해강도율',\n description: '재해강도율 평가',\n categoryName: '안전성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '안전 SL-PA 결과값',\n description: '안전 SL-PA 결과',\n categoryName: '안전성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '안전성과 수준 평가',\n description: '안전성과 종합 평가',\n categoryName: '안전성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 환경성과 (Y5) - Environmental Performance\n {\n name: '건설폐기물 발생량',\n description: '건설폐기물 발생량 평가',\n categoryName: '환경성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '환경성과 수준 평가',\n description: '환경성과 종합 평가',\n categoryName: '환경성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 생산성성과 (Y6) - Productivity Performance\n {\n name: '투입인력 생산성',\n description: '투입인력 생산성 평가',\n categoryName: '생산성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '생산성성과 수준 평가',\n description: '생산성과 종합 평가',\n categoryName: '생산성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n }\n]\n\nexport class SeedKpi1752190849681 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<any> {\n const repository = getRepository(Kpi)\n const categoryRepository = getRepository(KpiCategory)\n const domainRepository = getRepository(Domain)\n\n // SYSTEM 도메인 확인 또는 생성\n let domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n\n // 카테고리들 확인 또는 생성\n const categories = ['일정성과', '비용성과', '품질성과', '안전성과', '환경성과', '생산성과']\n const categoryMap = new Map()\n\n for (const categoryName of categories) {\n let category = await categoryRepository.findOneBy({\n name: categoryName,\n domain: { id: domain.id }\n })\n\n categoryMap.set(categoryName, category)\n }\n\n // KPI 데이터 생성\n const results = []\n for (const kpiData of SEED) {\n try {\n const category = categoryMap.get(kpiData.categoryName)\n if (!category) {\n console.log(`❌ Category not found for KPI: ${kpiData.name}`)\n continue\n }\n\n const existingKpi = await repository.findOneBy({\n name: kpiData.name,\n domain: { id: domain.id }\n })\n\n if (existingKpi) {\n console.log(`⚠️ KPI already exists: ${kpiData.name}`)\n continue\n }\n\n const kpi = await repository.save({\n ...kpiData,\n category,\n domain,\n active: true,\n state: KpiStatus.DRAFT\n })\n\n console.log(`✅ Created KPI: ${kpiData.name}`)\n results.push(kpi)\n } catch (error) {\n console.error(`❌ Error creating KPI \"${kpiData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully created ${results.length} KPIs`)\n return results\n }\n\n public async down(queryRunner: QueryRunner): Promise<any> {\n const repository = getRepository(Kpi)\n const domainRepository = getRepository(Domain)\n const domain: Domain = await domainRepository.findOneBy({\n name: 'SYSTEM'\n })\n\n if (!domain) {\n console.log('⚠️ SYSTEM domain not found. Nothing to delete.')\n return\n }\n\n const results = []\n for (const kpiData of SEED.reverse()) {\n try {\n const kpi = await repository.findOneBy({\n name: kpiData.name,\n domain: { id: domain.id }\n })\n\n if (kpi) {\n await repository.delete(kpi)\n console.log(`✅ Deleted KPI: ${kpiData.name}`)\n results.push(kpiData.name)\n } else {\n console.log(`⚠️ KPI not found: ${kpiData.name}`)\n }\n } catch (error) {\n console.error(`❌ Error deleting KPI \"${kpiData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully deleted ${results.length} KPIs`)\n return results\n }\n}\n"]}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
-
export declare class AddGradesToKpi1752192090123 implements MigrationInterface {
|
|
3
|
-
name: string;
|
|
4
|
-
up(queryRunner: QueryRunner): Promise<void>;
|
|
5
|
-
down(queryRunner: QueryRunner): Promise<void>;
|
|
6
|
-
private loadGradeDataToKpi;
|
|
7
|
-
}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AddGradesToKpi1752192090123 = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const shell_1 = require("@things-factory/shell");
|
|
6
|
-
const kpi_1 = require("@things-factory/kpi");
|
|
7
|
-
const fs = tslib_1.__importStar(require("fs"));
|
|
8
|
-
const path = tslib_1.__importStar(require("path"));
|
|
9
|
-
class AddGradesToKpi1752192090123 {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.name = 'AddGradesToKpi1752192090123';
|
|
12
|
-
}
|
|
13
|
-
async up(queryRunner) {
|
|
14
|
-
// grade-data 폴더의 JSON 파일들을 읽어서 해당 KPI의 grades 컬럼에 넣기
|
|
15
|
-
await this.loadGradeDataToKpi();
|
|
16
|
-
}
|
|
17
|
-
async down(queryRunner) { }
|
|
18
|
-
async loadGradeDataToKpi() {
|
|
19
|
-
const gradeDataPath = path.join(__dirname, 'grade-data');
|
|
20
|
-
const kpiRepository = (0, shell_1.getRepository)(kpi_1.Kpi);
|
|
21
|
-
try {
|
|
22
|
-
// grade-data 폴더의 모든 JSON 파일 읽기
|
|
23
|
-
const files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'));
|
|
24
|
-
for (const file of files) {
|
|
25
|
-
const filePath = path.join(gradeDataPath, file);
|
|
26
|
-
const fileContent = fs.readFileSync(filePath, 'utf8');
|
|
27
|
-
const gradeData = JSON.parse(fileContent);
|
|
28
|
-
// KPI 이름으로 해당 KPI 찾기
|
|
29
|
-
const kpi = await kpiRepository.findOne({
|
|
30
|
-
where: { name: gradeData.kpiName, domain: { name: 'SYSTEM' } }
|
|
31
|
-
});
|
|
32
|
-
if (kpi) {
|
|
33
|
-
// grades 데이터를 업데이트
|
|
34
|
-
kpi.grades = gradeData.grades;
|
|
35
|
-
await kpiRepository.save(kpi);
|
|
36
|
-
console.log(`✅ Loaded grades for KPI: ${gradeData.kpiName} (${gradeData.grades.length} grades)`);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
console.log(`⚠️ KPI not found: ${gradeData.kpiName}`);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
console.log(`🎉 Successfully loaded grades data for ${files.length} files`);
|
|
43
|
-
}
|
|
44
|
-
catch (error) {
|
|
45
|
-
console.error('❌ Error loading grade data:', error);
|
|
46
|
-
throw error;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
exports.AddGradesToKpi1752192090123 = AddGradesToKpi1752192090123;
|
|
51
|
-
//# sourceMappingURL=1752192090123-add-grades-to-kpi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"1752192090123-add-grades-to-kpi.js","sourceRoot":"","sources":["../../server/migrations/1752192090123-add-grades-to-kpi.ts"],"names":[],"mappings":";;;;AACA,iDAAqD;AACrD,6CAAyC;AAEzC,+CAAwB;AACxB,mDAA4B;AAgB5B,MAAa,2BAA2B;IAAxC;QACE,SAAI,GAAG,6BAA6B,CAAA;IA4CtC,CAAC;IA1CQ,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,qDAAqD;QACrD,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;IACjC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB,IAAkB,CAAC;IAErD,KAAK,CAAC,kBAAkB;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;QACxD,MAAM,aAAa,GAAG,IAAA,qBAAa,EAAC,SAAG,CAAC,CAAA;QAExC,IAAI,CAAC;YACH,+BAA+B;YAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;YAElF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;gBAC/C,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBACrD,MAAM,SAAS,GAAc,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;gBAEpD,qBAAqB;gBACrB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;oBACtC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;iBAC/D,CAAC,CAAA;gBAEF,IAAI,GAAG,EAAE,CAAC;oBACR,mBAAmB;oBACnB,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;oBAC7B,MAAM,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAE7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,CAAA;gBAClG,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAA;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAA;YACnD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CACF;AA7CD,kEA6CC","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { Kpi } from '@things-factory/kpi'\n\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface GradeData {\n kpiName: string\n version: number\n description: string\n grades: Array<{\n name: string\n minValue: number\n maxValue: number\n score?: number\n color?: string\n description?: string\n }>\n}\n\nexport class AddGradesToKpi1752192090123 implements MigrationInterface {\n name = 'AddGradesToKpi1752192090123'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n // grade-data 폴더의 JSON 파일들을 읽어서 해당 KPI의 grades 컬럼에 넣기\n await this.loadGradeDataToKpi()\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {}\n\n private async loadGradeDataToKpi(): Promise<void> {\n const gradeDataPath = path.join(__dirname, 'grade-data')\n const kpiRepository = getRepository(Kpi)\n\n try {\n // grade-data 폴더의 모든 JSON 파일 읽기\n const files = fs.readdirSync(gradeDataPath).filter(file => file.endsWith('.json'))\n\n for (const file of files) {\n const filePath = path.join(gradeDataPath, file)\n const fileContent = fs.readFileSync(filePath, 'utf8')\n const gradeData: GradeData = JSON.parse(fileContent)\n\n // KPI 이름으로 해당 KPI 찾기\n const kpi = await kpiRepository.findOne({\n where: { name: gradeData.kpiName, domain: { name: 'SYSTEM' } }\n })\n\n if (kpi) {\n // grades 데이터를 업데이트\n kpi.grades = gradeData.grades\n await kpiRepository.save(kpi)\n\n console.log(`✅ Loaded grades for KPI: ${gradeData.kpiName} (${gradeData.grades.length} grades)`)\n } else {\n console.log(`⚠️ KPI not found: ${gradeData.kpiName}`)\n }\n }\n\n console.log(`🎉 Successfully loaded grades data for ${files.length} files`)\n } catch (error) {\n console.error('❌ Error loading grade data:', error)\n throw error\n }\n }\n}\n"]}
|