@things-factory/kpi 9.0.22 → 9.0.24
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/client/pages/kpi/kpi-list-page.ts +180 -22
- package/client/pages/kpi/kpi-viz-editor.ts +1 -1
- package/client/pages/kpi-category/kpi-category-list-page.ts +76 -3
- package/client/pages/kpi-category/kpi-category-value-calculator.ts +233 -0
- package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +404 -0
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +13 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +763 -0
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +55 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +3 -13
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +13 -1
- package/client/pages/kpi-value/kpi-value-editor-page.ts +774 -0
- package/client/pages/kpi-value/kpi-value-list-page.ts +58 -1
- package/client/route.ts +16 -0
- package/dist-client/pages/kpi/kpi-list-page.d.ts +2 -1
- package/dist-client/pages/kpi/kpi-list-page.js +180 -22
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi/kpi-viz-editor.d.ts +0 -1
- package/dist-client/pages/kpi/kpi-viz-editor.js +1 -1
- package/dist-client/pages/kpi/kpi-viz-editor.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +3 -0
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +71 -3
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +13 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +256 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +1 -0
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +63 -0
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +393 -0
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +1 -0
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +13 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +58 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +736 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +50 -2
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +3 -13
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +13 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +55 -0
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js +748 -0
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +10 -2
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +57 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +12 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/calculator/evaluator.d.ts +8 -0
- package/dist-server/calculator/evaluator.js +42 -0
- package/dist-server/calculator/evaluator.js.map +1 -0
- package/dist-server/calculator/functions.d.ts +3 -0
- package/dist-server/calculator/functions.js +62 -0
- package/dist-server/calculator/functions.js.map +1 -0
- package/dist-server/calculator/index.d.ts +4 -0
- package/dist-server/calculator/index.js +8 -0
- package/dist-server/calculator/index.js.map +1 -0
- package/dist-server/calculator/parser.d.ts +21 -0
- package/dist-server/calculator/parser.js +121 -0
- package/dist-server/calculator/parser.js.map +1 -0
- package/dist-server/calculator/provider.d.ts +8 -0
- package/dist-server/calculator/provider.js +13 -0
- package/dist-server/calculator/provider.js.map +1 -0
- package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-metric-value-provider.js +63 -0
- package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
- package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-value-provider.js +46 -0
- package/dist-server/controllers/kpi-value-provider.js.map +1 -0
- package/dist-server/service/index.d.ts +4 -2
- package/dist-server/service/index.js +5 -0
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/kpi/aggregate-kpi.js +4 -4
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
- package/dist-server/service/kpi/kpi-grade.types.d.ts +11 -10
- package/dist-server/service/kpi/kpi-grade.types.js.map +1 -1
- package/dist-server/service/kpi/kpi-history.d.ts +2 -2
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
- package/dist-server/service/kpi/kpi-mutation.js +126 -4
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +8 -5
- package/dist-server/service/kpi/kpi-type.js +22 -8
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +6 -3
- package/dist-server/service/kpi/kpi.js +29 -9
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +3 -4
- package/dist-server/service/kpi-category/kpi-category-mutation.js +151 -80
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-query.d.ts +5 -0
- package/dist-server/service/kpi-category/kpi-category-query.js +19 -1
- package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -0
- package/dist-server/service/kpi-category/kpi-category-type.js +16 -1
- package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +2 -0
- package/dist-server/service/kpi-category/kpi-category.js +10 -1
- package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
- package/dist-server/service/kpi-category-value/index.d.ts +6 -0
- package/dist-server/service/kpi-category-value/index.js +10 -0
- package/dist-server/service/kpi-category-value/index.js.map +1 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +8 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +102 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +1 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +13 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-query.js +91 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +1 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +19 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-type.js +73 -0
- package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +1 -0
- package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +19 -0
- package/dist-server/service/kpi-category-value/kpi-category-value.js +91 -0
- package/dist-server/service/kpi-category-value/kpi-category-value.js.map +1 -0
- package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric.d.ts +2 -8
- package/dist-server/service/kpi-metric/kpi-metric.js +3 -14
- package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +87 -45
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -2
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +3 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +174 -6
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -2
- package/dist-server/service/kpi-value/kpi-value-query.js +0 -12
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +26 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js +97 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +2 -0
- package/dist-server/service/kpi-value/kpi-value-type.js +14 -0
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +1 -0
- package/dist-server/service/kpi-value/kpi-value.js +9 -1
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/service/utils/value-date-util.d.ts +3 -0
- package/dist-server/service/utils/value-date-util.js +76 -0
- package/dist-server/service/utils/value-date-util.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/server/calculator/evaluator.ts +45 -0
- package/server/calculator/functions.ts +67 -0
- package/server/calculator/index.ts +4 -0
- package/server/calculator/parser.ts +128 -0
- package/server/calculator/provider.ts +10 -0
- package/server/controllers/kpi-metric-value-provider.ts +66 -0
- package/server/controllers/kpi-value-provider.ts +51 -0
- package/server/service/index.ts +5 -0
- package/server/service/kpi/aggregate-kpi.ts +4 -4
- package/server/service/kpi/kpi-grade.types.ts +11 -10
- package/server/service/kpi/kpi-history.ts +2 -2
- package/server/service/kpi/kpi-mutation.ts +128 -4
- package/server/service/kpi/kpi-type.ts +21 -9
- package/server/service/kpi/kpi.ts +32 -10
- package/server/service/kpi-category/kpi-category-mutation.ts +155 -82
- package/server/service/kpi-category/kpi-category-query.ts +21 -1
- package/server/service/kpi-category/kpi-category-type.ts +17 -6
- package/server/service/kpi-category/kpi-category.ts +10 -1
- package/server/service/kpi-category-value/index.ts +7 -0
- package/server/service/kpi-category-value/kpi-category-value-mutation.ts +88 -0
- package/server/service/kpi-category-value/kpi-category-value-query.ts +62 -0
- package/server/service/kpi-category-value/kpi-category-value-type.ts +48 -0
- package/server/service/kpi-category-value/kpi-category-value.ts +79 -0
- package/server/service/kpi-metric/kpi-metric-type.ts +7 -5
- package/server/service/kpi-metric/kpi-metric.ts +3 -15
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +95 -47
- package/server/service/kpi-metric-value/kpi-metric-value.ts +4 -2
- package/server/service/kpi-value/kpi-value-mutation.ts +176 -6
- package/server/service/kpi-value/kpi-value-query.ts +2 -8
- package/server/service/kpi-value/kpi-value-score.service.ts +112 -0
- package/server/service/kpi-value/kpi-value-type.ts +12 -0
- package/server/service/kpi-value/kpi-value.ts +8 -1
- package/server/service/utils/value-date-util.ts +72 -0
- package/things-factory.config.js +3 -0
- package/translations/en.json +3 -0
- package/translations/ja.json +3 -0
- package/translations/ko.json +3 -0
- package/translations/ms.json +3 -0
- package/translations/zh.json +3 -0
- package/dist-server/service/kpi-value/kpi-value-grade.service.d.ts +0 -34
- package/dist-server/service/kpi-value/kpi-value-grade.service.js +0 -117
- package/dist-server/service/kpi-value/kpi-value-grade.service.js.map +0 -1
- package/server/service/kpi-value/kpi-value-grade.service.ts +0 -127
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.KpiValueGradeService = exports.GradeInfo = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const shell_1 = require("@things-factory/shell");
|
|
6
|
-
const type_graphql_1 = require("type-graphql");
|
|
7
|
-
const kpi_1 = require("../kpi/kpi");
|
|
8
|
-
const kpi_value_1 = require("./kpi-value");
|
|
9
|
-
let GradeInfo = class GradeInfo {
|
|
10
|
-
};
|
|
11
|
-
exports.GradeInfo = GradeInfo;
|
|
12
|
-
tslib_1.__decorate([
|
|
13
|
-
(0, type_graphql_1.Field)({ description: 'Grade name (e.g., A, B, C, 우수, 양호)' }),
|
|
14
|
-
tslib_1.__metadata("design:type", String)
|
|
15
|
-
], GradeInfo.prototype, "name", void 0);
|
|
16
|
-
tslib_1.__decorate([
|
|
17
|
-
(0, type_graphql_1.Field)({ nullable: true, description: 'Grade score or performance value' }),
|
|
18
|
-
tslib_1.__metadata("design:type", Number)
|
|
19
|
-
], GradeInfo.prototype, "score", void 0);
|
|
20
|
-
tslib_1.__decorate([
|
|
21
|
-
(0, type_graphql_1.Field)({ nullable: true, description: 'Color code for visualization' }),
|
|
22
|
-
tslib_1.__metadata("design:type", String)
|
|
23
|
-
], GradeInfo.prototype, "color", void 0);
|
|
24
|
-
tslib_1.__decorate([
|
|
25
|
-
(0, type_graphql_1.Field)({ nullable: true, description: 'Grade description' }),
|
|
26
|
-
tslib_1.__metadata("design:type", String)
|
|
27
|
-
], GradeInfo.prototype, "description", void 0);
|
|
28
|
-
exports.GradeInfo = GradeInfo = tslib_1.__decorate([
|
|
29
|
-
(0, type_graphql_1.ObjectType)({ description: 'Grade information for KPI value' })
|
|
30
|
-
], GradeInfo);
|
|
31
|
-
class KpiValueGradeService {
|
|
32
|
-
/**
|
|
33
|
-
* KPI의 grades 정보를 이용하여 KpiValue의 등급 계산
|
|
34
|
-
*/
|
|
35
|
-
calculateGradeFromKpiGrades(kpi, value) {
|
|
36
|
-
if (!kpi.grades || kpi.grades.length === 0) {
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
// grades 배열에서 해당 값의 범위에 맞는 등급 찾기
|
|
40
|
-
const grade = kpi.grades.find(g => value >= g.minValue && value <= g.maxValue);
|
|
41
|
-
if (!grade) {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
name: grade.name,
|
|
46
|
-
score: grade.score,
|
|
47
|
-
color: grade.color,
|
|
48
|
-
description: grade.description,
|
|
49
|
-
minValue: grade.minValue,
|
|
50
|
-
maxValue: grade.maxValue
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* KpiValue 생성/수정 시 등급 자동 계산 및 저장
|
|
55
|
-
*/
|
|
56
|
-
async calculateAndSaveGrade(kpiValue, kpi) {
|
|
57
|
-
const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value);
|
|
58
|
-
if (gradeResult) {
|
|
59
|
-
// KpiValue의 meta 필드에 등급 정보 저장
|
|
60
|
-
kpiValue.meta = {
|
|
61
|
-
...kpiValue.meta,
|
|
62
|
-
grade: {
|
|
63
|
-
name: gradeResult.name,
|
|
64
|
-
score: gradeResult.score,
|
|
65
|
-
color: gradeResult.color,
|
|
66
|
-
description: gradeResult.description,
|
|
67
|
-
calculatedAt: new Date().toISOString()
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* 기존 KpiValue들의 등급 재계산 (배치 처리)
|
|
74
|
-
*/
|
|
75
|
-
async recalculateGradesForKpi(kpiId, context) {
|
|
76
|
-
const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { id: kpiId } });
|
|
77
|
-
if (!kpi)
|
|
78
|
-
return;
|
|
79
|
-
const kpiValues = await (0, shell_1.getRepository)(kpi_value_1.KpiValue).find({
|
|
80
|
-
where: { kpiId, version: kpi.version }
|
|
81
|
-
});
|
|
82
|
-
for (const kpiValue of kpiValues) {
|
|
83
|
-
await this.calculateAndSaveGrade(kpiValue, kpi);
|
|
84
|
-
}
|
|
85
|
-
await (0, shell_1.getRepository)(kpi_value_1.KpiValue).save(kpiValues);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* 특정 KpiValue의 등급 정보 조회
|
|
89
|
-
*/
|
|
90
|
-
async getGradeForKpiValue(kpiValue) {
|
|
91
|
-
// meta 필드에서 등급 정보 조회
|
|
92
|
-
if (kpiValue.meta?.grade) {
|
|
93
|
-
return {
|
|
94
|
-
name: kpiValue.meta.grade.name,
|
|
95
|
-
score: kpiValue.meta.grade.score,
|
|
96
|
-
color: kpiValue.meta.grade.color,
|
|
97
|
-
description: kpiValue.meta.grade.description
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
// 실시간 계산 (필요시)
|
|
101
|
-
const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { id: kpiValue.kpiId } });
|
|
102
|
-
if (kpi) {
|
|
103
|
-
const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value);
|
|
104
|
-
if (gradeResult) {
|
|
105
|
-
return {
|
|
106
|
-
name: gradeResult.name,
|
|
107
|
-
score: gradeResult.score,
|
|
108
|
-
color: gradeResult.color,
|
|
109
|
-
description: gradeResult.description
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return null;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
exports.KpiValueGradeService = KpiValueGradeService;
|
|
117
|
-
//# sourceMappingURL=kpi-value-grade.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-value-grade.service.js","sourceRoot":"","sources":["../../../server/service/kpi-value/kpi-value-grade.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { ObjectType, Field } from 'type-graphql'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiValue } from './kpi-value'\nimport { KpiGrades } from '../kpi/kpi-grade.types'\n\nexport interface GradeResult {\n name: string\n score?: number\n color?: string\n description?: string\n minValue: number\n maxValue: number\n}\n\n@ObjectType({ description: 'Grade information for KPI value' })\nexport class GradeInfo {\n @Field({ description: 'Grade name (e.g., A, B, C, 우수, 양호)' })\n name: string\n\n @Field({ nullable: true, description: 'Grade score or performance value' })\n score?: number\n\n @Field({ nullable: true, description: 'Color code for visualization' })\n color?: string\n\n @Field({ nullable: true, description: 'Grade description' })\n description?: string\n}\n\nexport class KpiValueGradeService {\n /**\n * KPI의 grades 정보를 이용하여 KpiValue의 등급 계산\n */\n calculateGradeFromKpiGrades(kpi: Kpi, value: number): GradeResult | null {\n if (!kpi.grades || kpi.grades.length === 0) {\n return null\n }\n\n // grades 배열에서 해당 값의 범위에 맞는 등급 찾기\n const grade = kpi.grades.find(g => value >= g.minValue && value <= g.maxValue)\n\n if (!grade) {\n return null\n }\n\n return {\n name: grade.name,\n score: grade.score,\n color: grade.color,\n description: grade.description,\n minValue: grade.minValue,\n maxValue: grade.maxValue\n }\n }\n\n /**\n * KpiValue 생성/수정 시 등급 자동 계산 및 저장\n */\n async calculateAndSaveGrade(kpiValue: KpiValue, kpi: Kpi): Promise<void> {\n const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value)\n\n if (gradeResult) {\n // KpiValue의 meta 필드에 등급 정보 저장\n kpiValue.meta = {\n ...kpiValue.meta,\n grade: {\n name: gradeResult.name,\n score: gradeResult.score,\n color: gradeResult.color,\n description: gradeResult.description,\n calculatedAt: new Date().toISOString()\n }\n }\n }\n }\n\n /**\n * 기존 KpiValue들의 등급 재계산 (배치 처리)\n */\n async recalculateGradesForKpi(kpiId: string, context: ResolverContext): Promise<void> {\n const kpi = await getRepository(Kpi).findOne({ where: { id: kpiId } })\n if (!kpi) return\n\n const kpiValues = await getRepository(KpiValue).find({\n where: { kpiId, version: kpi.version }\n })\n\n for (const kpiValue of kpiValues) {\n await this.calculateAndSaveGrade(kpiValue, kpi)\n }\n\n await getRepository(KpiValue).save(kpiValues)\n }\n\n /**\n * 특정 KpiValue의 등급 정보 조회\n */\n async getGradeForKpiValue(kpiValue: KpiValue): Promise<GradeInfo | null> {\n // meta 필드에서 등급 정보 조회\n if (kpiValue.meta?.grade) {\n return {\n name: kpiValue.meta.grade.name,\n score: kpiValue.meta.grade.score,\n color: kpiValue.meta.grade.color,\n description: kpiValue.meta.grade.description\n }\n }\n\n // 실시간 계산 (필요시)\n const kpi = await getRepository(Kpi).findOne({ where: { id: kpiValue.kpiId } })\n if (kpi) {\n const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value)\n\n if (gradeResult) {\n return {\n name: gradeResult.name,\n score: gradeResult.score,\n color: gradeResult.color,\n description: gradeResult.description\n }\n }\n }\n\n return null\n }\n}\n"]}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { getRepository } from '@things-factory/shell'
|
|
2
|
-
import { ObjectType, Field } from 'type-graphql'
|
|
3
|
-
import { Kpi } from '../kpi/kpi'
|
|
4
|
-
import { KpiValue } from './kpi-value'
|
|
5
|
-
import { KpiGrades } from '../kpi/kpi-grade.types'
|
|
6
|
-
|
|
7
|
-
export interface GradeResult {
|
|
8
|
-
name: string
|
|
9
|
-
score?: number
|
|
10
|
-
color?: string
|
|
11
|
-
description?: string
|
|
12
|
-
minValue: number
|
|
13
|
-
maxValue: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
@ObjectType({ description: 'Grade information for KPI value' })
|
|
17
|
-
export class GradeInfo {
|
|
18
|
-
@Field({ description: 'Grade name (e.g., A, B, C, 우수, 양호)' })
|
|
19
|
-
name: string
|
|
20
|
-
|
|
21
|
-
@Field({ nullable: true, description: 'Grade score or performance value' })
|
|
22
|
-
score?: number
|
|
23
|
-
|
|
24
|
-
@Field({ nullable: true, description: 'Color code for visualization' })
|
|
25
|
-
color?: string
|
|
26
|
-
|
|
27
|
-
@Field({ nullable: true, description: 'Grade description' })
|
|
28
|
-
description?: string
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export class KpiValueGradeService {
|
|
32
|
-
/**
|
|
33
|
-
* KPI의 grades 정보를 이용하여 KpiValue의 등급 계산
|
|
34
|
-
*/
|
|
35
|
-
calculateGradeFromKpiGrades(kpi: Kpi, value: number): GradeResult | null {
|
|
36
|
-
if (!kpi.grades || kpi.grades.length === 0) {
|
|
37
|
-
return null
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// grades 배열에서 해당 값의 범위에 맞는 등급 찾기
|
|
41
|
-
const grade = kpi.grades.find(g => value >= g.minValue && value <= g.maxValue)
|
|
42
|
-
|
|
43
|
-
if (!grade) {
|
|
44
|
-
return null
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
name: grade.name,
|
|
49
|
-
score: grade.score,
|
|
50
|
-
color: grade.color,
|
|
51
|
-
description: grade.description,
|
|
52
|
-
minValue: grade.minValue,
|
|
53
|
-
maxValue: grade.maxValue
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* KpiValue 생성/수정 시 등급 자동 계산 및 저장
|
|
59
|
-
*/
|
|
60
|
-
async calculateAndSaveGrade(kpiValue: KpiValue, kpi: Kpi): Promise<void> {
|
|
61
|
-
const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value)
|
|
62
|
-
|
|
63
|
-
if (gradeResult) {
|
|
64
|
-
// KpiValue의 meta 필드에 등급 정보 저장
|
|
65
|
-
kpiValue.meta = {
|
|
66
|
-
...kpiValue.meta,
|
|
67
|
-
grade: {
|
|
68
|
-
name: gradeResult.name,
|
|
69
|
-
score: gradeResult.score,
|
|
70
|
-
color: gradeResult.color,
|
|
71
|
-
description: gradeResult.description,
|
|
72
|
-
calculatedAt: new Date().toISOString()
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* 기존 KpiValue들의 등급 재계산 (배치 처리)
|
|
80
|
-
*/
|
|
81
|
-
async recalculateGradesForKpi(kpiId: string, context: ResolverContext): Promise<void> {
|
|
82
|
-
const kpi = await getRepository(Kpi).findOne({ where: { id: kpiId } })
|
|
83
|
-
if (!kpi) return
|
|
84
|
-
|
|
85
|
-
const kpiValues = await getRepository(KpiValue).find({
|
|
86
|
-
where: { kpiId, version: kpi.version }
|
|
87
|
-
})
|
|
88
|
-
|
|
89
|
-
for (const kpiValue of kpiValues) {
|
|
90
|
-
await this.calculateAndSaveGrade(kpiValue, kpi)
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
await getRepository(KpiValue).save(kpiValues)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* 특정 KpiValue의 등급 정보 조회
|
|
98
|
-
*/
|
|
99
|
-
async getGradeForKpiValue(kpiValue: KpiValue): Promise<GradeInfo | null> {
|
|
100
|
-
// meta 필드에서 등급 정보 조회
|
|
101
|
-
if (kpiValue.meta?.grade) {
|
|
102
|
-
return {
|
|
103
|
-
name: kpiValue.meta.grade.name,
|
|
104
|
-
score: kpiValue.meta.grade.score,
|
|
105
|
-
color: kpiValue.meta.grade.color,
|
|
106
|
-
description: kpiValue.meta.grade.description
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// 실시간 계산 (필요시)
|
|
111
|
-
const kpi = await getRepository(Kpi).findOne({ where: { id: kpiValue.kpiId } })
|
|
112
|
-
if (kpi) {
|
|
113
|
-
const gradeResult = this.calculateGradeFromKpiGrades(kpi, kpiValue.value)
|
|
114
|
-
|
|
115
|
-
if (gradeResult) {
|
|
116
|
-
return {
|
|
117
|
-
name: gradeResult.name,
|
|
118
|
-
score: gradeResult.score,
|
|
119
|
-
color: gradeResult.color,
|
|
120
|
-
description: gradeResult.description
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return null
|
|
126
|
-
}
|
|
127
|
-
}
|