@things-factory/kpi 10.0.0-beta.7 → 10.0.0-beta.71

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 (31) hide show
  1. package/client/index.ts +1 -0
  2. package/client/pages/kpi/kpi-list-page.ts +150 -17
  3. package/client/pages/kpi-dashboard/components/kpi-map-panel.ts +2 -2
  4. package/client/pages/kpi-metric/kpi-metric-list-page.ts +17 -3
  5. package/dist-client/index.d.ts +1 -0
  6. package/dist-client/index.js +1 -1
  7. package/dist-client/index.js.map +1 -1
  8. package/dist-client/pages/kpi/kpi-list-page.d.ts +48 -3
  9. package/dist-client/pages/kpi/kpi-list-page.js +140 -18
  10. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  11. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +2 -2
  12. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
  13. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +17 -3
  14. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  15. package/dist-client/tsconfig.tsbuildinfo +1 -1
  16. package/dist-server/service/kpi/kpi-type.d.ts +5 -1
  17. package/dist-server/service/kpi/kpi-type.js +28 -0
  18. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  19. package/dist-server/service/kpi/kpi.d.ts +64 -0
  20. package/dist-server/service/kpi/kpi.js +89 -1
  21. package/dist-server/service/kpi/kpi.js.map +1 -1
  22. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +15 -7
  23. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
  24. package/dist-server/service/kpi-metric/kpi-metric-query.d.ts +2 -0
  25. package/dist-server/service/kpi-metric/kpi-metric-query.js +13 -1
  26. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -1
  27. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +3 -2
  28. package/dist-server/service/kpi-metric/kpi-metric-type.js +7 -6
  29. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
  30. package/dist-server/tsconfig.tsbuildinfo +1 -1
  31. package/package.json +5 -5
@@ -1,6 +1,6 @@
1
1
  import type { FileUpload } from 'graphql-upload/GraphQLUpload.js';
2
2
  import { ObjectRef } from '@things-factory/shell';
3
- import { Kpi, KpiStatus, KpiVizType } from './kpi';
3
+ import { Kpi, KpiStatus, KpiVizType, KpiScoreType, KpiValueType } from './kpi';
4
4
  import { KpiScores } from './kpi-grade.types';
5
5
  export declare class NewKpi {
6
6
  name: string;
@@ -16,6 +16,8 @@ export declare class NewKpi {
16
16
  schedule?: string;
17
17
  timezone?: string;
18
18
  weight?: number;
19
+ scoreType?: KpiScoreType;
20
+ valueType?: KpiValueType;
19
21
  grades?: KpiScores;
20
22
  scoreFormula?: string;
21
23
  }
@@ -35,6 +37,8 @@ export declare class KpiPatch {
35
37
  schedule?: string;
36
38
  timezone?: string;
37
39
  weight?: number;
40
+ scoreType?: KpiScoreType;
41
+ valueType?: KpiValueType;
38
42
  grades?: KpiScores;
39
43
  scoreFormula?: string;
40
44
  }
@@ -70,6 +70,20 @@ tslib_1.__decorate([
70
70
  (0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in parent category.' }),
71
71
  tslib_1.__metadata("design:type", Number)
72
72
  ], NewKpi.prototype, "weight", void 0);
73
+ tslib_1.__decorate([
74
+ (0, type_graphql_1.Field)(type => kpi_1.KpiScoreType, {
75
+ nullable: true,
76
+ description: 'value → score 변환 방식.'
77
+ }),
78
+ tslib_1.__metadata("design:type", String)
79
+ ], NewKpi.prototype, "scoreType", void 0);
80
+ tslib_1.__decorate([
81
+ (0, type_graphql_1.Field)(type => kpi_1.KpiValueType, {
82
+ nullable: true,
83
+ description: 'value 획득 방식.'
84
+ }),
85
+ tslib_1.__metadata("design:type", String)
86
+ ], NewKpi.prototype, "valueType", void 0);
73
87
  tslib_1.__decorate([
74
88
  (0, type_graphql_1.Field)(type => shell_1.ScalarObject, {
75
89
  nullable: true,
@@ -159,6 +173,20 @@ tslib_1.__decorate([
159
173
  (0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in parent category.' }),
160
174
  tslib_1.__metadata("design:type", Number)
161
175
  ], KpiPatch.prototype, "weight", void 0);
176
+ tslib_1.__decorate([
177
+ (0, type_graphql_1.Field)(type => kpi_1.KpiScoreType, {
178
+ nullable: true,
179
+ description: 'value → score 변환 방식.'
180
+ }),
181
+ tslib_1.__metadata("design:type", String)
182
+ ], KpiPatch.prototype, "scoreType", void 0);
183
+ tslib_1.__decorate([
184
+ (0, type_graphql_1.Field)(type => kpi_1.KpiValueType, {
185
+ nullable: true,
186
+ description: 'value 획득 방식.'
187
+ }),
188
+ tslib_1.__metadata("design:type", String)
189
+ ], KpiPatch.prototype, "valueType", void 0);
162
190
  tslib_1.__decorate([
163
191
  (0, type_graphql_1.Field)(type => shell_1.ScalarObject, {
164
192
  nullable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-type.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-type.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\nimport { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { ObjectRef, ScalarObject } from '@things-factory/shell'\n\nimport { Kpi, KpiStatus, KpiVizType } from './kpi'\nimport { KpiScores } from './kpi-grade.types'\n\n@InputType({ description: 'Input type for creating a new KPI. Used in mutations to provide KPI details.' })\nexport class NewKpi {\n @Field({ description: 'Name of the KPI.' })\n name: string\n\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Reference to the parent KPI in hierarchical structure.' })\n parent?: ObjectRef\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Field({ nullable: true, description: 'Calculation formula for the KPI, using metric codes and operators.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Field(type => KpiStatus, { nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Field(type => GraphQLUpload, { nullable: true, description: 'Thumbnail image or file for this KPI.' })\n thumbnail?: FileUpload\n\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.'\n })\n vizMeta?: any\n\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'Score lookup table for this KPI version'\n })\n grades?: KpiScores\n\n @Field({\n nullable: true,\n description: 'Score calculation formula for this KPI. Converts KPI value to performance score (0-1).'\n })\n scoreFormula?: string\n}\n\n@InputType({ description: 'Input type for updating an existing KPI. Used in mutations to patch KPI details.' })\nexport class KpiPatch {\n @Field(type => ID, { nullable: true, description: 'ID of the KPI to update.' })\n id?: string\n\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Reference to the parent KPI in hierarchical structure.' })\n parent?: ObjectRef\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Field({ nullable: true, description: 'Calculation formula for the KPI, using metric codes and operators.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Field(type => KpiStatus, { nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Field(type => GraphQLUpload, { nullable: true, description: 'Thumbnail image or file for this KPI.' })\n thumbnail?: FileUpload\n\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.'\n })\n vizMeta?: any\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'Score lookup table for this KPI version'\n })\n grades?: KpiScores\n\n @Field({\n nullable: true,\n description: 'Score calculation formula for this KPI. Converts KPI value to performance score (0-1).'\n })\n scoreFormula?: string\n}\n\n@ObjectType()\nexport class KpiList {\n @Field(type => [Kpi])\n items: Kpi[]\n\n @Field(type => Int)\n total: number\n}\n"]}
1
+ {"version":3,"file":"kpi-type.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-type.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\nimport { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { ObjectRef, ScalarObject } from '@things-factory/shell'\n\nimport { Kpi, KpiStatus, KpiVizType, KpiScoreType, KpiValueType } from './kpi'\nimport { KpiScores } from './kpi-grade.types'\n\n@InputType({ description: 'Input type for creating a new KPI. Used in mutations to provide KPI details.' })\nexport class NewKpi {\n @Field({ description: 'Name of the KPI.' })\n name: string\n\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Reference to the parent KPI in hierarchical structure.' })\n parent?: ObjectRef\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Field({ nullable: true, description: 'Calculation formula for the KPI, using metric codes and operators.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Field(type => KpiStatus, { nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Field(type => GraphQLUpload, { nullable: true, description: 'Thumbnail image or file for this KPI.' })\n thumbnail?: FileUpload\n\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.'\n })\n vizMeta?: any\n\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Field(type => KpiScoreType, {\n nullable: true,\n description: 'value → score 변환 방식.'\n })\n scoreType?: KpiScoreType\n\n @Field(type => KpiValueType, {\n nullable: true,\n description: 'value 획득 방식.'\n })\n valueType?: KpiValueType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'Score lookup table for this KPI version'\n })\n grades?: KpiScores\n\n @Field({\n nullable: true,\n description: 'Score calculation formula for this KPI. Converts KPI value to performance score (0-1).'\n })\n scoreFormula?: string\n}\n\n@InputType({ description: 'Input type for updating an existing KPI. Used in mutations to patch KPI details.' })\nexport class KpiPatch {\n @Field(type => ID, { nullable: true, description: 'ID of the KPI to update.' })\n id?: string\n\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @Field(type => ObjectRef, { nullable: true, description: 'Reference to the parent KPI in hierarchical structure.' })\n parent?: ObjectRef\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Field({ nullable: true, description: 'Calculation formula for the KPI, using metric codes and operators.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Field(type => KpiStatus, { nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Field(type => GraphQLUpload, { nullable: true, description: 'Thumbnail image or file for this KPI.' })\n thumbnail?: FileUpload\n\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, etc.'\n })\n vizMeta?: any\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Field(type => KpiScoreType, {\n nullable: true,\n description: 'value → score 변환 방식.'\n })\n scoreType?: KpiScoreType\n\n @Field(type => KpiValueType, {\n nullable: true,\n description: 'value 획득 방식.'\n })\n valueType?: KpiValueType\n\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'Score lookup table for this KPI version'\n })\n grades?: KpiScores\n\n @Field({\n nullable: true,\n description: 'Score calculation formula for this KPI. Converts KPI value to performance score (0-1).'\n })\n scoreFormula?: string\n}\n\n@ObjectType()\nexport class KpiList {\n @Field(type => [Kpi])\n items: Kpi[]\n\n @Field(type => Int)\n total: number\n}\n"]}
@@ -32,6 +32,68 @@ export declare enum KpiPeriodType {
32
32
  RANGE = "RANGE",
33
33
  ALLTIME = "ALLTIME"
34
34
  }
35
+ /**
36
+ * KPI scoreType — value → score 변환 방식
37
+ *
38
+ * 미설정(null)이면 score 변환이 정의되지 않은 상태.
39
+ *
40
+ * DIRECT — value = score, 별도 변환 없음.
41
+ * value 자체가 최종 성과 점수로 사용됨.
42
+ * 예: Y1~Y6(영역별 성과), Z(전체스코어) — formula로 계산된 value가 곧 score.
43
+ * 예: X14(일정성과 수준 평가) — 감리자가 입력한 1~5점이 곧 score.
44
+ *
45
+ * FORMULA — scoreFormula 수식으로 value → score 변환.
46
+ * KPI 엔티티의 scoreFormula 필드에 정의된 수식을 적용.
47
+ * 예: "1 - value / 0.82", "if(value >= 90, 100, 70)"
48
+ *
49
+ * LOOKUP — grade table(1D 배열)로 raw value → 0~1 score 변환.
50
+ * KPI 엔티티의 grades 필드에 {minValue, maxValue, score} 배열로 정의.
51
+ * value가 속하는 구간의 score를 반환.
52
+ * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X34(품질 SL-PA)
53
+ *
54
+ * CUSTOM — 2D 룩업 등 애플리케이션에서 정의하는 특수 변환.
55
+ * grades에 다차원 lookup 구조가 저장됨.
56
+ * 예: X13(일정 이탈 수준) — 공정률(%) × 편차율(%) → 1~5점
57
+ */
58
+ export declare enum KpiScoreType {
59
+ DIRECT = "DIRECT",
60
+ FORMULA = "FORMULA",
61
+ LOOKUP = "LOOKUP",
62
+ CUSTOM = "CUSTOM"
63
+ }
64
+ /**
65
+ * KPI valueType — value 획득 방식
66
+ *
67
+ * KPI의 value(측정값/입력값)를 어떤 방식으로 얻는지를 정의한다.
68
+ * scoreType(value→score 변환)과는 독립적인 개념.
69
+ *
70
+ * MEASURED — 외부 시스템(API, DB 연계)에서 자동 수집한 정량 측정값.
71
+ * 연속 실수값이며, 단위와 범위가 KPI마다 다름.
72
+ * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X41(재해율), X61(투입인력 생산성)
73
+ * 보통 scoreType=LOOKUP과 함께 사용하여 grade table로 score 변환.
74
+ *
75
+ * ASSESSED — 감리자/평가자가 직접 입력한 정성 평가.
76
+ * 배점 기준(1~5점 척도)에 따라 수동 입력됨.
77
+ * 예: X14(일정성과 수준 평가), X23(비용성과), X35(품질성과), X44(안전성과)
78
+ * 보통 scoreType=DIRECT와 함께 사용 (value가 곧 score).
79
+ *
80
+ * CALCULATED — 산식(formula 필드)으로 하위 KPI들의 가중합 등을 자동 계산.
81
+ * KPI 엔티티의 formula 필드에 정의된 수식을 기반으로 서버에서 연산.
82
+ * 예: Y1(일정성과) = X11*0.3 + X12*0.4 + X13/5*0.15 + X14/5*0.15
83
+ * 예: Z(전체스코어) = Y1~Y6의 가중 평균
84
+ * 보통 scoreType=DIRECT와 함께 사용 (계산 결과가 곧 score).
85
+ *
86
+ * COMPOSITE — 다차원 입력의 복합 결과.
87
+ * 단일 raw value가 아닌 복수의 입력(공정률, 편차율 등)을 조합하여 산출.
88
+ * 예: X13(일정 이탈 수준) — 공정률(%) × 공기편차(%) 2D 룩업 → 1~5점
89
+ * 보통 scoreType=CUSTOM과 함께 사용.
90
+ */
91
+ export declare enum KpiValueType {
92
+ MEASURED = "MEASURED",
93
+ ASSESSED = "ASSESSED",
94
+ CALCULATED = "CALCULATED",
95
+ COMPOSITE = "COMPOSITE"
96
+ }
35
97
  export declare class Kpi {
36
98
  readonly id: string;
37
99
  version?: number;
@@ -53,6 +115,8 @@ export declare class Kpi {
53
115
  timezone?: string;
54
116
  periodType: KpiPeriodType;
55
117
  weight?: number;
118
+ scoreType?: KpiScoreType;
119
+ valueType?: KpiValueType;
56
120
  grades?: KpiScores;
57
121
  scoreFormula?: string;
58
122
  createdAt?: Date;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Kpi = exports.KpiPeriodType = exports.KpiVizType = exports.KpiStatus = void 0;
3
+ exports.Kpi = exports.KpiValueType = exports.KpiScoreType = exports.KpiPeriodType = exports.KpiVizType = exports.KpiStatus = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const typeorm_1 = require("typeorm");
6
6
  const type_graphql_1 = require("type-graphql");
@@ -44,6 +44,70 @@ var KpiPeriodType;
44
44
  KpiPeriodType["RANGE"] = "RANGE";
45
45
  KpiPeriodType["ALLTIME"] = "ALLTIME";
46
46
  })(KpiPeriodType || (exports.KpiPeriodType = KpiPeriodType = {}));
47
+ /**
48
+ * KPI scoreType — value → score 변환 방식
49
+ *
50
+ * 미설정(null)이면 score 변환이 정의되지 않은 상태.
51
+ *
52
+ * DIRECT — value = score, 별도 변환 없음.
53
+ * value 자체가 최종 성과 점수로 사용됨.
54
+ * 예: Y1~Y6(영역별 성과), Z(전체스코어) — formula로 계산된 value가 곧 score.
55
+ * 예: X14(일정성과 수준 평가) — 감리자가 입력한 1~5점이 곧 score.
56
+ *
57
+ * FORMULA — scoreFormula 수식으로 value → score 변환.
58
+ * KPI 엔티티의 scoreFormula 필드에 정의된 수식을 적용.
59
+ * 예: "1 - value / 0.82", "if(value >= 90, 100, 70)"
60
+ *
61
+ * LOOKUP — grade table(1D 배열)로 raw value → 0~1 score 변환.
62
+ * KPI 엔티티의 grades 필드에 {minValue, maxValue, score} 배열로 정의.
63
+ * value가 속하는 구간의 score를 반환.
64
+ * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X34(품질 SL-PA)
65
+ *
66
+ * CUSTOM — 2D 룩업 등 애플리케이션에서 정의하는 특수 변환.
67
+ * grades에 다차원 lookup 구조가 저장됨.
68
+ * 예: X13(일정 이탈 수준) — 공정률(%) × 편차율(%) → 1~5점
69
+ */
70
+ var KpiScoreType;
71
+ (function (KpiScoreType) {
72
+ KpiScoreType["DIRECT"] = "DIRECT";
73
+ KpiScoreType["FORMULA"] = "FORMULA";
74
+ KpiScoreType["LOOKUP"] = "LOOKUP";
75
+ KpiScoreType["CUSTOM"] = "CUSTOM";
76
+ })(KpiScoreType || (exports.KpiScoreType = KpiScoreType = {}));
77
+ /**
78
+ * KPI valueType — value 획득 방식
79
+ *
80
+ * KPI의 value(측정값/입력값)를 어떤 방식으로 얻는지를 정의한다.
81
+ * scoreType(value→score 변환)과는 독립적인 개념.
82
+ *
83
+ * MEASURED — 외부 시스템(API, DB 연계)에서 자동 수집한 정량 측정값.
84
+ * 연속 실수값이며, 단위와 범위가 KPI마다 다름.
85
+ * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X41(재해율), X61(투입인력 생산성)
86
+ * 보통 scoreType=LOOKUP과 함께 사용하여 grade table로 score 변환.
87
+ *
88
+ * ASSESSED — 감리자/평가자가 직접 입력한 정성 평가.
89
+ * 배점 기준(1~5점 척도)에 따라 수동 입력됨.
90
+ * 예: X14(일정성과 수준 평가), X23(비용성과), X35(품질성과), X44(안전성과)
91
+ * 보통 scoreType=DIRECT와 함께 사용 (value가 곧 score).
92
+ *
93
+ * CALCULATED — 산식(formula 필드)으로 하위 KPI들의 가중합 등을 자동 계산.
94
+ * KPI 엔티티의 formula 필드에 정의된 수식을 기반으로 서버에서 연산.
95
+ * 예: Y1(일정성과) = X11*0.3 + X12*0.4 + X13/5*0.15 + X14/5*0.15
96
+ * 예: Z(전체스코어) = Y1~Y6의 가중 평균
97
+ * 보통 scoreType=DIRECT와 함께 사용 (계산 결과가 곧 score).
98
+ *
99
+ * COMPOSITE — 다차원 입력의 복합 결과.
100
+ * 단일 raw value가 아닌 복수의 입력(공정률, 편차율 등)을 조합하여 산출.
101
+ * 예: X13(일정 이탈 수준) — 공정률(%) × 공기편차(%) 2D 룩업 → 1~5점
102
+ * 보통 scoreType=CUSTOM과 함께 사용.
103
+ */
104
+ var KpiValueType;
105
+ (function (KpiValueType) {
106
+ KpiValueType["MEASURED"] = "MEASURED";
107
+ KpiValueType["ASSESSED"] = "ASSESSED";
108
+ KpiValueType["CALCULATED"] = "CALCULATED";
109
+ KpiValueType["COMPOSITE"] = "COMPOSITE";
110
+ })(KpiValueType || (exports.KpiValueType = KpiValueType = {}));
47
111
  (0, type_graphql_1.registerEnumType)(KpiStatus, {
48
112
  name: 'KpiStatus',
49
113
  description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'
@@ -56,6 +120,14 @@ var KpiPeriodType;
56
120
  name: 'KpiPeriodType',
57
121
  description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'
58
122
  });
123
+ (0, type_graphql_1.registerEnumType)(KpiScoreType, {
124
+ name: 'KpiScoreType',
125
+ description: 'value → score 변환 방식. DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식 적용, LOOKUP: grade table(1D) 매핑, CUSTOM: 2D 룩업 등 특수 변환.'
126
+ });
127
+ (0, type_graphql_1.registerEnumType)(KpiValueType, {
128
+ name: 'KpiValueType',
129
+ description: 'value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 복합 입력 결과.'
130
+ });
59
131
  let Kpi = class Kpi {
60
132
  constructor() {
61
133
  this.version = 1;
@@ -187,6 +259,22 @@ tslib_1.__decorate([
187
259
  (0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in parent category.' }),
188
260
  tslib_1.__metadata("design:type", Number)
189
261
  ], Kpi.prototype, "weight", void 0);
262
+ tslib_1.__decorate([
263
+ (0, typeorm_1.Column)({ nullable: true }),
264
+ (0, type_graphql_1.Field)(type => KpiScoreType, {
265
+ nullable: true,
266
+ description: 'value → score 변환 방식. NONE: 미설정, DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식, LOOKUP: grade table(1D), CUSTOM: 2D 룩업 등 특수 변환.'
267
+ }),
268
+ tslib_1.__metadata("design:type", String)
269
+ ], Kpi.prototype, "scoreType", void 0);
270
+ tslib_1.__decorate([
271
+ (0, typeorm_1.Column)({ nullable: true }),
272
+ (0, type_graphql_1.Field)(type => KpiValueType, {
273
+ nullable: true,
274
+ description: 'value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 룩업 결과.'
275
+ }),
276
+ tslib_1.__metadata("design:type", String)
277
+ ], Kpi.prototype, "valueType", void 0);
190
278
  tslib_1.__decorate([
191
279
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
192
280
  (0, type_graphql_1.Field)(type => shell_2.ScalarObject, {
@@ -1 +1 @@
1
- {"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiScores } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n YEAR = 'YEAR',\n RANGE = 'RANGE',\n ALLTIME = 'ALLTIME'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@Index('ix_kpi_hierarchy', (kpi: Kpi) => [kpi.domain, kpi.parent], {\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => Kpi, { nullable: true })\n @Field(type => Kpi, { nullable: true, description: 'Parent KPI in hierarchical structure.' })\n parent?: Kpi\n\n @RelationId((kpi: Kpi) => kpi.parent)\n @Field({ nullable: true, description: 'ID of the parent KPI.' })\n parentId?: string\n\n @OneToMany(() => Kpi, kpi => kpi.parent)\n @Field(type => [Kpi], { nullable: true, description: 'Child KPIs in hierarchical structure.' })\n children?: Kpi[]\n\n @Column({ nullable: false, default: true })\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'\n })\n grades?: KpiScores\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: \"if(value >= 90, 100, if(value >= 80, 85, 70))\" or \"value * 0.8 + 20\"'\n })\n scoreFormula?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n}\n"]}
1
+ {"version":3,"file":"kpi.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n DeleteDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n VersionColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { config } from '@things-factory/env'\nimport { ScalarObject } from '@things-factory/shell'\n\nimport { KpiScores } from './kpi-grade.types'\n\nconst ORMCONFIG = config.get('ormconfig', {})\nconst DATABASE_TYPE = ORMCONFIG.type\n\nexport enum KpiStatus {\n DRAFT = 'DRAFT',\n RELEASE = 'RELEASE',\n ARCHIVED = 'ARCHIVED'\n}\n\nexport enum KpiVizType {\n CARD = 'CARD',\n GAUGE = 'GAUGE',\n PROGRESS = 'PROGRESS',\n BAR = 'BAR',\n LINE = 'LINE',\n PIE = 'PIE',\n DONUT = 'DONUT',\n RADAR = 'RADAR',\n BULLET = 'BULLET',\n THERMOMETER = 'THERMOMETER',\n SPEEDOMETER = 'SPEEDOMETER',\n ICON = 'ICON',\n BADGE = 'BADGE',\n TEXT = 'TEXT',\n TABLE = 'TABLE'\n}\n\nexport enum KpiPeriodType {\n DAY = 'DAY',\n WEEK = 'WEEK',\n MONTH = 'MONTH',\n QUARTER = 'QUARTER',\n YEAR = 'YEAR',\n RANGE = 'RANGE',\n ALLTIME = 'ALLTIME'\n}\n\n/**\n * KPI scoreType — value → score 변환 방식\n *\n * 미설정(null)이면 score 변환이 정의되지 않은 상태.\n *\n * DIRECT — value = score, 별도 변환 없음.\n * value 자체가 최종 성과 점수로 사용됨.\n * 예: Y1~Y6(영역별 성과), Z(전체스코어) — formula로 계산된 value가 곧 score.\n * 예: X14(일정성과 수준 평가) — 감리자가 입력한 1~5점이 곧 score.\n *\n * FORMULA — scoreFormula 수식으로 value → score 변환.\n * KPI 엔티티의 scoreFormula 필드에 정의된 수식을 적용.\n * 예: \"1 - value / 0.82\", \"if(value >= 90, 100, 70)\"\n *\n * LOOKUP — grade table(1D 배열)로 raw value → 0~1 score 변환.\n * KPI 엔티티의 grades 필드에 {minValue, maxValue, score} 배열로 정의.\n * value가 속하는 구간의 score를 반환.\n * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X34(품질 SL-PA)\n *\n * CUSTOM — 2D 룩업 등 애플리케이션에서 정의하는 특수 변환.\n * grades에 다차원 lookup 구조가 저장됨.\n * 예: X13(일정 이탈 수준) — 공정률(%) × 편차율(%) → 1~5점\n */\nexport enum KpiScoreType {\n DIRECT = 'DIRECT',\n FORMULA = 'FORMULA',\n LOOKUP = 'LOOKUP',\n CUSTOM = 'CUSTOM'\n}\n\n/**\n * KPI valueType — value 획득 방식\n *\n * KPI의 value(측정값/입력값)를 어떤 방식으로 얻는지를 정의한다.\n * scoreType(value→score 변환)과는 독립적인 개념.\n *\n * MEASURED — 외부 시스템(API, DB 연계)에서 자동 수집한 정량 측정값.\n * 연속 실수값이며, 단위와 범위가 KPI마다 다름.\n * 예: X11(연면적 대비 공사기간), X33(검측 불합격률), X41(재해율), X61(투입인력 생산성)\n * 보통 scoreType=LOOKUP과 함께 사용하여 grade table로 score 변환.\n *\n * ASSESSED — 감리자/평가자가 직접 입력한 정성 평가.\n * 배점 기준(1~5점 척도)에 따라 수동 입력됨.\n * 예: X14(일정성과 수준 평가), X23(비용성과), X35(품질성과), X44(안전성과)\n * 보통 scoreType=DIRECT와 함께 사용 (value가 곧 score).\n *\n * CALCULATED — 산식(formula 필드)으로 하위 KPI들의 가중합 등을 자동 계산.\n * KPI 엔티티의 formula 필드에 정의된 수식을 기반으로 서버에서 연산.\n * 예: Y1(일정성과) = X11*0.3 + X12*0.4 + X13/5*0.15 + X14/5*0.15\n * 예: Z(전체스코어) = Y1~Y6의 가중 평균\n * 보통 scoreType=DIRECT와 함께 사용 (계산 결과가 곧 score).\n *\n * COMPOSITE — 다차원 입력의 복합 결과.\n * 단일 raw value가 아닌 복수의 입력(공정률, 편차율 등)을 조합하여 산출.\n * 예: X13(일정 이탈 수준) — 공정률(%) × 공기편차(%) 2D 룩업 → 1~5점\n * 보통 scoreType=CUSTOM과 함께 사용.\n */\nexport enum KpiValueType {\n MEASURED = 'MEASURED',\n ASSESSED = 'ASSESSED',\n CALCULATED = 'CALCULATED',\n COMPOSITE = 'COMPOSITE'\n}\n\nregisterEnumType(KpiStatus, {\n name: 'KpiStatus',\n description: 'State enumeration of a KPI (DRAFT, RELEASED, ARCHIVED)'\n})\n\nregisterEnumType(KpiVizType, {\n name: 'KpiVizType',\n description: 'Visualization type for KPI display (CARD, GAUGE, PROGRESS, etc.)'\n})\n\nregisterEnumType(KpiPeriodType, {\n name: 'KpiPeriodType',\n description: 'Aggregation period type for KPI (DAY, WEEK, MONTH, QUARTER, RANGE, ALLTIME)'\n})\n\nregisterEnumType(KpiScoreType, {\n name: 'KpiScoreType',\n description:\n 'value → score 변환 방식. DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식 적용, LOOKUP: grade table(1D) 매핑, CUSTOM: 2D 룩업 등 특수 변환.'\n})\n\nregisterEnumType(KpiValueType, {\n name: 'KpiValueType',\n description:\n 'value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 복합 입력 결과.'\n})\n\n@Entity()\n@Index('ix_kpi_0', (kpi: Kpi) => [kpi.domain, kpi.name], {\n where: '\"deleted_at\" IS NULL',\n unique: true\n})\n@Index('ix_kpi_hierarchy', (kpi: Kpi) => [kpi.domain, kpi.parent], {\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({\n description:\n 'KPI entity. Represents a key performance indicator with calculation formula, target, category, and other attributes.'\n})\nexport class Kpi {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI.' })\n readonly id: string\n\n @VersionColumn()\n @Field({\n nullable: true,\n description:\n 'Version number of the KPI. Increments on each modification. When the KPI is released, a snapshot is saved in kpi-history and the status becomes RELEASED. Editing after release increases the version and sets status to DRAFT.'\n })\n version?: number = 1\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI belongs.' })\n domain?: Domain\n\n @RelationId((kpi: Kpi) => kpi.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI.' })\n domainId?: string\n\n @Column()\n @Field({ nullable: true, description: 'Name of the KPI.' })\n name?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of the KPI.' })\n description?: string\n\n @ManyToOne(() => Kpi, { nullable: true })\n @Field(type => Kpi, { nullable: true, description: 'Parent KPI in hierarchical structure.' })\n parent?: Kpi\n\n @RelationId((kpi: Kpi) => kpi.parent)\n @Field({ nullable: true, description: 'ID of the parent KPI.' })\n parentId?: string\n\n @OneToMany(() => Kpi, kpi => kpi.parent)\n @Field(type => [Kpi], { nullable: true, description: 'Child KPIs in hierarchical structure.' })\n children?: Kpi[]\n\n @Column({ nullable: false, default: true })\n @Field({ nullable: true, description: 'Indicates whether this KPI is a leaf node (has actual measured values).' })\n isLeaf?: boolean\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Calculation formula for the KPI. Expressed as a string using metric codes and operators, e.g., \"defect_count / total_count * 100\".'\n })\n formula?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Indicates whether this KPI is active and usable.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Current state of the KPI (DRAFT, RELEASED, ARCHIVED).' })\n state?: KpiStatus\n\n @Column({ nullable: true })\n @Field(type => KpiVizType, {\n nullable: true,\n description: 'Visualization type for this KPI (e.g., CARD, GAUGE, PROGRESS, BAR, LINE, etc.).'\n })\n vizType?: KpiVizType\n\n @Column({ type: 'json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Visualization options and metadata for this KPI, such as color, icon, thresholds, unit, decimal places, min/max values, etc.'\n })\n vizMeta?: any\n\n @Column({ nullable: true })\n @Field({\n nullable: true,\n description: 'Cron schedule string for periodic KPI value aggregation (e.g., \"0 0 * * *\" for daily).'\n })\n schedule?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Schedule ID for the KPI (used for scheduler registration).' })\n scheduleId?: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Timezone for the KPI schedule.' })\n timezone?: string\n\n @Column({ default: 'DAY' })\n @Field(type => KpiPeriodType, { description: 'Aggregation period type for this KPI.' })\n periodType: KpiPeriodType\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in parent category.' })\n weight?: number\n\n @Column({ nullable: true })\n @Field(type => KpiScoreType, {\n nullable: true,\n description:\n 'value → score 변환 방식. NONE: 미설정, DIRECT: value=score(변환 없음), FORMULA: scoreFormula 수식, LOOKUP: grade table(1D), CUSTOM: 2D 룩업 등 특수 변환.'\n })\n scoreType?: KpiScoreType\n\n @Column({ nullable: true })\n @Field(type => KpiValueType, {\n nullable: true,\n description:\n 'value 획득 방식. MEASURED: 외부 시스템 수집 측정값, ASSESSED: 감리자 직접 평가(1~5), CALCULATED: formula 자동 계산, COMPOSITE: 다차원 룩업 결과.'\n })\n valueType?: KpiValueType\n\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description:\n 'Performance index lookup table for complex transformations. @deprecated 향후 제거 예정. performanceFormula 사용 권장.'\n })\n grades?: KpiScores\n\n @Column({\n nullable: true,\n type:\n DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n ? 'longtext'\n : DATABASE_TYPE == 'oracle'\n ? 'clob'\n : DATABASE_TYPE == 'mssql'\n ? 'nvarchar'\n : 'varchar',\n length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined\n })\n @Field({\n nullable: true,\n description:\n 'Score calculation formula for this KPI. Converts KPI value to performance score (0-100). For complex mappings, use grades lookup table instead. Example: \"if(value >= 90, 100, if(value >= 80, 85, 70))\" or \"value * 0.8 + 20\"'\n })\n scoreFormula?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was last updated.' })\n updatedAt?: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI was deleted (soft delete).' })\n deletedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI.' })\n creator?: User\n\n @RelationId((kpi: Kpi) => kpi.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI.' })\n updater?: User\n\n @RelationId((kpi: Kpi) => kpi.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI.' })\n updaterId?: string\n\n @Field(type => String, { nullable: true, description: 'Thumbnail image or file path for this KPI.' })\n thumbnail?: string\n}\n"]}
@@ -13,8 +13,8 @@ const scheduler_client_1 = require("@things-factory/scheduler-client");
13
13
  let KpiMetricMutation = class KpiMetricMutation {
14
14
  async createKpiMetric(kpiMetric, context) {
15
15
  const { domain, user, tx } = context.state;
16
- let dataSet = kpiMetric.dataSetId
17
- ? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id: kpiMetric.dataSetId } })
16
+ let dataSet = kpiMetric.dataSet?.id
17
+ ? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id: kpiMetric.dataSet.id } })
18
18
  : undefined;
19
19
  // formula 관련 로직 완전 제거
20
20
  const result = await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric, tx).save({
@@ -78,10 +78,9 @@ let KpiMetricMutation = class KpiMetricMutation {
78
78
  const kpiMetric = await repository.findOne({
79
79
  where: { domain: { id: domain.id }, id }
80
80
  });
81
- let dataSet = patch.dataSetId
82
- ? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id: patch.dataSetId } })
83
- : kpiMetric.dataSet;
84
- // formula 관련 로직 완전 제거
81
+ const dsId = patch.dataSet?.id;
82
+ let dataSet = dsId ? await (0, shell_1.getRepository)(dataset_1.DataSet, tx).findOne({ where: { id: dsId } }) : kpiMetric.dataSet;
83
+ delete patch.dataSet;
85
84
  const result = await repository.save({
86
85
  ...kpiMetric,
87
86
  ...patch,
@@ -150,8 +149,12 @@ let KpiMetricMutation = class KpiMetricMutation {
150
149
  if (_createRecords.length > 0) {
151
150
  for (let i = 0; i < _createRecords.length; i++) {
152
151
  const newRecord = _createRecords[i];
152
+ const dsId = newRecord.dataSet?.id;
153
+ let dataSet = dsId ? await (0, shell_1.getRepository)(dataset_1.DataSet, tx).findOne({ where: { id: dsId } }) : undefined;
154
+ delete newRecord.dataSet;
153
155
  const result = await kpiMetricRepo.save({
154
156
  ...newRecord,
157
+ dataSet,
155
158
  domain,
156
159
  creator: user,
157
160
  updater: user
@@ -171,10 +174,15 @@ let KpiMetricMutation = class KpiMetricMutation {
171
174
  if (_updateRecords.length > 0) {
172
175
  for (let i = 0; i < _updateRecords.length; i++) {
173
176
  const updateRecord = _updateRecords[i];
174
- const kpiMetric = await kpiMetricRepo.findOneBy({ id: updateRecord.id });
177
+ const kpiMetric = await kpiMetricRepo.findOne({ where: { id: updateRecord.id }, relations: ['dataSet'] });
178
+ const dsId = updateRecord.dataSet?.id;
179
+ let dataSet = dsId ? await (0, shell_1.getRepository)(dataset_1.DataSet, tx).findOne({ where: { id: dsId } }) : kpiMetric.dataSet;
180
+ // ObjectRef 필드 제거 (TypeORM에 실제 엔티티만 전달)
181
+ delete updateRecord.dataSet;
175
182
  const result = await kpiMetricRepo.save({
176
183
  ...kpiMetric,
177
184
  ...updateRecord,
185
+ dataSet,
178
186
  updater: user
179
187
  });
180
188
  if (updateRecord.thumbnail) {
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-metric-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/kpi-metric-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { DataSet } from '@things-factory/dataset'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { KpiMetric } from './kpi-metric'\nimport { NewKpiMetric, KpiMetricPatch } from './kpi-metric-type'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\nimport { registerSchedule, unregisterSchedule, CallbackBase, Application } from '@things-factory/scheduler-client'\n\n@Resolver(KpiMetric)\nexport class KpiMetricMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetric, { description: 'Create a new KPI metric with the provided details.' })\n async createKpiMetric(\n @Arg('kpiMetric', { description: 'Input object containing details for the new KPI metric.' })\n kpiMetric: NewKpiMetric,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n let dataSet = kpiMetric.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: kpiMetric.dataSetId } })\n : undefined\n\n // formula 관련 로직 완전 제거\n\n const result = await getRepository(KpiMetric, tx).save({\n ...kpiMetric,\n dataSet,\n domain,\n creator: user,\n updater: user\n })\n\n // 스케줄러 등록\n if (kpiMetric.schedule) {\n const handle = await registerSchedule({\n name: kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: kpiMetric.schedule,\n timezone: kpiMetric.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = kpiMetric.timezone\n await getRepository(KpiMetric, tx).save(result)\n }\n\n if (kpiMetric.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: kpiMetric.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetric, { description: 'To modify KpiMetric information' })\n async updateKpiMetric(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetric, tx)\n const kpiMetric = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let dataSet = patch.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: patch.dataSetId } })\n : kpiMetric.dataSet\n\n // formula 관련 로직 완전 제거\n\n const result = await repository.save({\n ...kpiMetric,\n ...patch,\n dataSet,\n updater: user\n })\n\n // 스케줄러 해제/등록 (변경 시)\n if (kpiMetric.scheduleId && (patch.scheduleId !== kpiMetric.scheduleId || !patch.scheduleId)) {\n await unregisterSchedule(kpiMetric.scheduleId)\n result.scheduleId = null\n }\n if (patch.schedule) {\n const handle = await registerSchedule({\n name: patch.name || kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: patch.schedule,\n timezone: patch.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = patch.timezone\n await repository.save(result)\n }\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetric], { description: \"To modify multiple KpiMetrics' information\" })\n async updateMultipleKpiMetric(\n @Arg('patches', type => [KpiMetricPatch]) patches: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiMetricRepo = getRepository(KpiMetric, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiMetricRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiMetric = await kpiMetricRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiMetricRepo.save({\n ...kpiMetric,\n ...updateRecord,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetric' })\n async deleteKpiMetric(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n const repo = getRepository(KpiMetric, tx)\n const metric = await repo.findOne({ where: { domain: { id: domain.id }, id } })\n if (metric?.scheduleId) {\n await unregisterSchedule(metric.scheduleId)\n }\n await repo.delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetrics' })\n async deleteKpiMetrics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiMetric, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetrics' })\n async importKpiMetrics(\n @Arg('kpiMetrics', type => [KpiMetricPatch]) kpiMetrics: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiMetrics.map(async (kpiMetric: KpiMetricPatch) => {\n const createdKpiMetric: KpiMetric = await getRepository(KpiMetric, tx).save({ domain, ...kpiMetric })\n })\n )\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"kpi-metric-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/kpi-metric-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { DataSet } from '@things-factory/dataset'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { KpiMetric } from './kpi-metric'\nimport { NewKpiMetric, KpiMetricPatch } from './kpi-metric-type'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\nimport { registerSchedule, unregisterSchedule, CallbackBase, Application } from '@things-factory/scheduler-client'\n\n@Resolver(KpiMetric)\nexport class KpiMetricMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetric, { description: 'Create a new KPI metric with the provided details.' })\n async createKpiMetric(\n @Arg('kpiMetric', { description: 'Input object containing details for the new KPI metric.' })\n kpiMetric: NewKpiMetric,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n let dataSet = kpiMetric.dataSet?.id\n ? await getRepository(DataSet).findOne({ where: { id: kpiMetric.dataSet.id } })\n : undefined\n\n // formula 관련 로직 완전 제거\n\n const result = await getRepository(KpiMetric, tx).save({\n ...kpiMetric,\n dataSet,\n domain,\n creator: user,\n updater: user\n })\n\n // 스케줄러 등록\n if (kpiMetric.schedule) {\n const handle = await registerSchedule({\n name: kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: kpiMetric.schedule,\n timezone: kpiMetric.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = kpiMetric.timezone\n await getRepository(KpiMetric, tx).save(result)\n }\n\n if (kpiMetric.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: kpiMetric.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetric, { description: 'To modify KpiMetric information' })\n async updateKpiMetric(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetric, tx)\n const kpiMetric = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const dsId = patch.dataSet?.id\n let dataSet = dsId ? await getRepository(DataSet, tx).findOne({ where: { id: dsId } }) : kpiMetric.dataSet\n\n delete patch.dataSet\n\n const result = await repository.save({\n ...kpiMetric,\n ...patch,\n dataSet,\n updater: user\n })\n\n // 스케줄러 해제/등록 (변경 시)\n if (kpiMetric.scheduleId && (patch.scheduleId !== kpiMetric.scheduleId || !patch.scheduleId)) {\n await unregisterSchedule(kpiMetric.scheduleId)\n result.scheduleId = null\n }\n if (patch.schedule) {\n const handle = await registerSchedule({\n name: patch.name || kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: patch.schedule,\n timezone: patch.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = patch.timezone\n await repository.save(result)\n }\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetric], { description: \"To modify multiple KpiMetrics' information\" })\n async updateMultipleKpiMetric(\n @Arg('patches', type => [KpiMetricPatch]) patches: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiMetricRepo = getRepository(KpiMetric, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const dsId = newRecord.dataSet?.id\n let dataSet = dsId ? await getRepository(DataSet, tx).findOne({ where: { id: dsId } }) : undefined\n\n delete newRecord.dataSet\n\n const result = await kpiMetricRepo.save({\n ...newRecord,\n dataSet,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiMetric = await kpiMetricRepo.findOne({ where: { id: updateRecord.id }, relations: ['dataSet'] })\n\n const dsId = updateRecord.dataSet?.id\n let dataSet = dsId ? await getRepository(DataSet, tx).findOne({ where: { id: dsId } }) : kpiMetric.dataSet\n\n // ObjectRef 필드 제거 (TypeORM에 실제 엔티티만 전달)\n delete updateRecord.dataSet\n\n const result = await kpiMetricRepo.save({\n ...kpiMetric,\n ...updateRecord,\n dataSet,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetric' })\n async deleteKpiMetric(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n const repo = getRepository(KpiMetric, tx)\n const metric = await repo.findOne({ where: { domain: { id: domain.id }, id } })\n if (metric?.scheduleId) {\n await unregisterSchedule(metric.scheduleId)\n }\n await repo.delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetrics' })\n async deleteKpiMetrics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiMetric, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetrics' })\n async importKpiMetrics(\n @Arg('kpiMetrics', type => [KpiMetricPatch]) kpiMetrics: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiMetrics.map(async (kpiMetric: KpiMetricPatch) => {\n const createdKpiMetric: KpiMetric = await getRepository(KpiMetric, tx).save({ domain, ...kpiMetric })\n })\n )\n\n return true\n }\n}\n"]}
@@ -2,10 +2,12 @@ import { Domain, ListParam } from '@things-factory/shell';
2
2
  import { User } from '@things-factory/auth-base';
3
3
  import { KpiMetric } from './kpi-metric';
4
4
  import { KpiMetricList } from './kpi-metric-type';
5
+ import { DataSet } from '@things-factory/dataset';
5
6
  export declare class KpiMetricQuery {
6
7
  kpiMetric(id: string, context: ResolverContext): Promise<KpiMetric>;
7
8
  kpiMetrics(params: ListParam, context: ResolverContext): Promise<KpiMetricList>;
8
9
  thumbnail(kpiMetric: KpiMetric): Promise<string | undefined>;
10
+ dataSet(kpiMetric: KpiMetric): Promise<DataSet>;
9
11
  domain(kpiMetric: KpiMetric): Promise<Domain>;
10
12
  updater(kpiMetric: KpiMetric): Promise<User>;
11
13
  creator(kpiMetric: KpiMetric): Promise<User>;
@@ -8,11 +8,13 @@ const shell_1 = require("@things-factory/shell");
8
8
  const auth_base_1 = require("@things-factory/auth-base");
9
9
  const kpi_metric_1 = require("./kpi-metric");
10
10
  const kpi_metric_type_1 = require("./kpi-metric-type");
11
+ const dataset_1 = require("@things-factory/dataset");
11
12
  let KpiMetricQuery = class KpiMetricQuery {
12
13
  async kpiMetric(id, context) {
13
14
  const { domain } = context.state;
14
15
  return await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric).findOne({
15
- where: { domain: { id: domain.id }, id }
16
+ where: { domain: { id: domain.id }, id },
17
+ relations: ['dataSet']
16
18
  });
17
19
  }
18
20
  async kpiMetrics(params, context) {
@@ -36,6 +38,9 @@ let KpiMetricQuery = class KpiMetricQuery {
36
38
  });
37
39
  return attachment?.fullpath;
38
40
  }
41
+ async dataSet(kpiMetric) {
42
+ return kpiMetric.dataSetId && (await (0, shell_1.getRepository)(dataset_1.DataSet).findOneBy({ id: kpiMetric.dataSetId }));
43
+ }
39
44
  async domain(kpiMetric) {
40
45
  return kpiMetric.domainId && (await (0, shell_1.getRepository)(shell_1.Domain).findOneBy({ id: kpiMetric.domainId }));
41
46
  }
@@ -72,6 +77,13 @@ tslib_1.__decorate([
72
77
  tslib_1.__metadata("design:paramtypes", [kpi_metric_1.KpiMetric]),
73
78
  tslib_1.__metadata("design:returntype", Promise)
74
79
  ], KpiMetricQuery.prototype, "thumbnail", null);
80
+ tslib_1.__decorate([
81
+ (0, type_graphql_1.FieldResolver)(type => String),
82
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
83
+ tslib_1.__metadata("design:type", Function),
84
+ tslib_1.__metadata("design:paramtypes", [kpi_metric_1.KpiMetric]),
85
+ tslib_1.__metadata("design:returntype", Promise)
86
+ ], KpiMetricQuery.prototype, "dataSet", null);
75
87
  tslib_1.__decorate([
76
88
  (0, type_graphql_1.FieldResolver)(type => shell_1.Domain),
77
89
  tslib_1.__param(0, (0, type_graphql_1.Root)()),