@things-factory/kpi 9.0.32 → 9.0.34
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-dashboard/kpi-dashboard-map.ts +291 -49
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +3 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +268 -47
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/migrations/seed-data/kpi-scopes-seed.json +121 -0
- package/dist-server/migrations/seed-data/scope-definitions-seed.json +90 -0
- package/dist-server/service/index.d.ts +4 -3
- package/dist-server/service/index.js +7 -3
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/kpi/kpi-query.js.map +1 -1
- package/dist-server/service/kpi-org-scope/index.d.ts +0 -4
- package/dist-server/service/kpi-org-scope/index.js +0 -5
- package/dist-server/service/kpi-org-scope/index.js.map +1 -1
- package/dist-server/service/kpi-scope/index.d.ts +9 -0
- package/dist-server/service/kpi-scope/index.js +14 -0
- package/dist-server/service/kpi-scope/index.js.map +1 -0
- package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +9 -0
- package/dist-server/service/kpi-scope/kpi-scope-mutation.js +135 -0
- package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -0
- package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +11 -0
- package/dist-server/service/kpi-scope/kpi-scope-query.js +89 -0
- package/dist-server/service/kpi-scope/kpi-scope-query.js.map +1 -0
- package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +35 -0
- package/dist-server/service/kpi-scope/kpi-scope-type.js +138 -0
- package/dist-server/service/kpi-scope/kpi-scope-type.js.map +1 -0
- package/dist-server/service/kpi-scope/kpi-scope.d.ts +38 -0
- package/dist-server/service/kpi-scope/kpi-scope.js +144 -0
- package/dist-server/service/kpi-scope/kpi-scope.js.map +1 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +43 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +181 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +1 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +50 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +324 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +1 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +4 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +76 -0
- package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -1
- package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +5 -1
- package/dist-server/service/kpi-statistic/kpi-statistic-query.js +92 -1
- package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +1 -1
- package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +3 -0
- package/dist-server/service/kpi-statistic/kpi-statistic.js +23 -1
- package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/server/migrations/seed-data/kpi-scopes-seed.json +121 -0
- package/server/migrations/seed-data/scope-definitions-seed.json +90 -0
- package/server/service/index.ts +7 -3
- package/server/service/kpi/kpi-query.ts +1 -0
- package/server/service/kpi-org-scope/index.ts +1 -6
- package/server/service/kpi-scope/index.ts +11 -0
- package/server/service/kpi-scope/kpi-scope-mutation.ts +129 -0
- package/server/service/kpi-scope/kpi-scope-query.ts +63 -0
- package/server/service/kpi-scope/kpi-scope-type.ts +96 -0
- package/server/service/kpi-scope/kpi-scope.ts +143 -0
- package/server/service/kpi-statistic/kpi-statistic-batch.service.ts +231 -0
- package/server/service/kpi-statistic/kpi-statistic-calculation.service.ts +410 -0
- package/server/service/kpi-statistic/kpi-statistic-mutation.ts +97 -0
- package/server/service/kpi-statistic/kpi-statistic-query.ts +89 -2
- package/server/service/kpi-statistic/kpi-statistic.ts +23 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "공사진도율",
|
|
4
|
+
"description": "건설 프로젝트의 진행률을 나타내는 KPI",
|
|
5
|
+
"scopeMappingStrategy": "RULE_BASED",
|
|
6
|
+
"autoGenerateOrgScope": true,
|
|
7
|
+
"scopeMappingRules": {
|
|
8
|
+
"scope01": {
|
|
9
|
+
"strategy": "FIELD_MAPPING",
|
|
10
|
+
"sourceField": "project_name",
|
|
11
|
+
"required": true
|
|
12
|
+
},
|
|
13
|
+
"scope02": {
|
|
14
|
+
"strategy": "LOOKUP_TABLE",
|
|
15
|
+
"sourceField": "address",
|
|
16
|
+
"mappingTable": "address_region_mapping",
|
|
17
|
+
"mappingColumn": "region",
|
|
18
|
+
"defaultValue": "기타"
|
|
19
|
+
},
|
|
20
|
+
"scope03": {
|
|
21
|
+
"strategy": "FIELD_MAPPING",
|
|
22
|
+
"sourceField": "contractor_company",
|
|
23
|
+
"required": true
|
|
24
|
+
},
|
|
25
|
+
"scope04": {
|
|
26
|
+
"strategy": "FORMULA",
|
|
27
|
+
"formula": "${total_budget} >= 100000000 ? '대규모' : ${total_budget} >= 50000000 ? '중규모' : '소규모'",
|
|
28
|
+
"defaultValue": "중규모"
|
|
29
|
+
},
|
|
30
|
+
"scope05": {
|
|
31
|
+
"strategy": "STATIC",
|
|
32
|
+
"staticValue": "건축공사"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"dataSource": {
|
|
36
|
+
"type": "API",
|
|
37
|
+
"apiEndpoint": "https://api.construction-system.com/progress",
|
|
38
|
+
"refreshInterval": 60
|
|
39
|
+
},
|
|
40
|
+
"validationRules": {
|
|
41
|
+
"valueRange": { "min": 0, "max": 100 },
|
|
42
|
+
"requiredScopes": ["scope01", "scope02", "scope03"],
|
|
43
|
+
"allowedScopeValues": {
|
|
44
|
+
"scope04": ["대규모", "중규모", "소규모"],
|
|
45
|
+
"scope05": ["건축공사", "토목공사", "플랜트공사"]
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "안전사고율",
|
|
51
|
+
"description": "건설 현장의 안전사고 발생률",
|
|
52
|
+
"scopeMappingStrategy": "ENTITY_BASED",
|
|
53
|
+
"autoGenerateOrgScope": true,
|
|
54
|
+
"scopeMappingRules": {
|
|
55
|
+
"scope01": {
|
|
56
|
+
"strategy": "FIELD_MAPPING",
|
|
57
|
+
"sourceField": "site_name",
|
|
58
|
+
"required": true
|
|
59
|
+
},
|
|
60
|
+
"scope02": {
|
|
61
|
+
"strategy": "API_CALL",
|
|
62
|
+
"apiEndpoint": "https://api.address-service.com/region",
|
|
63
|
+
"sourceField": "site_address"
|
|
64
|
+
},
|
|
65
|
+
"scope03": {
|
|
66
|
+
"strategy": "FIELD_MAPPING",
|
|
67
|
+
"sourceField": "company_name",
|
|
68
|
+
"required": true
|
|
69
|
+
},
|
|
70
|
+
"scope04": {
|
|
71
|
+
"strategy": "LOOKUP_TABLE",
|
|
72
|
+
"sourceField": "worker_count",
|
|
73
|
+
"mappingTable": "project_size_mapping",
|
|
74
|
+
"mappingColumn": "size_category"
|
|
75
|
+
},
|
|
76
|
+
"scope05": {
|
|
77
|
+
"strategy": "FIELD_MAPPING",
|
|
78
|
+
"sourceField": "construction_type",
|
|
79
|
+
"defaultValue": "일반공사"
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
"dataSource": {
|
|
83
|
+
"type": "DATABASE",
|
|
84
|
+
"connection": "safety_db",
|
|
85
|
+
"query": "SELECT * FROM safety_incidents WHERE report_date >= CURRENT_DATE - INTERVAL '1 month'",
|
|
86
|
+
"refreshInterval": 1440
|
|
87
|
+
},
|
|
88
|
+
"validationRules": {
|
|
89
|
+
"valueRange": { "min": 0, "max": 1000 },
|
|
90
|
+
"requiredScopes": ["scope01", "scope02", "scope03"]
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "품질점수",
|
|
95
|
+
"description": "건설 품질 평가 점수",
|
|
96
|
+
"scopeMappingStrategy": "MANUAL",
|
|
97
|
+
"autoGenerateOrgScope": false,
|
|
98
|
+
"scopeMappingRules": {
|
|
99
|
+
"scope01": {
|
|
100
|
+
"strategy": "FIELD_MAPPING",
|
|
101
|
+
"sourceField": "project_id"
|
|
102
|
+
},
|
|
103
|
+
"scope02": {
|
|
104
|
+
"strategy": "FIELD_MAPPING",
|
|
105
|
+
"sourceField": "region"
|
|
106
|
+
},
|
|
107
|
+
"scope03": {
|
|
108
|
+
"strategy": "FIELD_MAPPING",
|
|
109
|
+
"sourceField": "company"
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"dataSource": {
|
|
113
|
+
"type": "MANUAL",
|
|
114
|
+
"description": "수동 입력으로 관리되는 KPI"
|
|
115
|
+
},
|
|
116
|
+
"validationRules": {
|
|
117
|
+
"valueRange": { "min": 0, "max": 100 },
|
|
118
|
+
"requiredScopes": ["scope02", "scope03"]
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
]
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"scopeLevel": 1,
|
|
4
|
+
"name": "프로젝트명",
|
|
5
|
+
"description": "개별 건설 프로젝트나 현장의 고유 식별명",
|
|
6
|
+
"scopeType": "BUSINESS",
|
|
7
|
+
"displayOrder": 1,
|
|
8
|
+
"active": true,
|
|
9
|
+
"includeInStatistics": false,
|
|
10
|
+
"showInDashboard": false,
|
|
11
|
+
"metadata": {
|
|
12
|
+
"icon": "construction",
|
|
13
|
+
"color": "#1976d2"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"scopeLevel": 2,
|
|
18
|
+
"name": "지역",
|
|
19
|
+
"description": "시도 단위 행정구역 (서울특별시, 부산광역시, 경기도 등)",
|
|
20
|
+
"scopeType": "GEOGRAPHIC",
|
|
21
|
+
"displayOrder": 2,
|
|
22
|
+
"active": true,
|
|
23
|
+
"includeInStatistics": true,
|
|
24
|
+
"showInDashboard": true,
|
|
25
|
+
"validValues": [
|
|
26
|
+
"서울특별시", "부산광역시", "대구광역시", "인천광역시",
|
|
27
|
+
"광주광역시", "대전광역시", "울산광역시", "세종특별자치시",
|
|
28
|
+
"경기도", "강원도", "충청북도", "충청남도",
|
|
29
|
+
"전라북도", "전라남도", "경상북도", "경상남도", "제주특별자치도"
|
|
30
|
+
],
|
|
31
|
+
"metadata": {
|
|
32
|
+
"icon": "location_on",
|
|
33
|
+
"color": "#388e3c",
|
|
34
|
+
"mapVisualization": true
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"scopeLevel": 3,
|
|
39
|
+
"name": "건설회사",
|
|
40
|
+
"description": "주요 건설회사 또는 시공사",
|
|
41
|
+
"scopeType": "ORGANIZATIONAL",
|
|
42
|
+
"displayOrder": 3,
|
|
43
|
+
"active": true,
|
|
44
|
+
"includeInStatistics": true,
|
|
45
|
+
"showInDashboard": true,
|
|
46
|
+
"validValues": [
|
|
47
|
+
"현대건설", "삼성물산", "GS건설", "대우건설", "롯데건설",
|
|
48
|
+
"대림산업", "포스코건설", "HDC현대산업개발", "호반건설", "태영건설",
|
|
49
|
+
"한화건설", "코오롱글로벌", "제일건설", "남광토건", "한국토지주택공사"
|
|
50
|
+
],
|
|
51
|
+
"metadata": {
|
|
52
|
+
"icon": "business",
|
|
53
|
+
"color": "#f57c00"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"scopeLevel": 4,
|
|
58
|
+
"name": "프로젝트규모",
|
|
59
|
+
"description": "프로젝트의 규모나 등급 분류",
|
|
60
|
+
"scopeType": "BUSINESS",
|
|
61
|
+
"displayOrder": 4,
|
|
62
|
+
"active": true,
|
|
63
|
+
"includeInStatistics": true,
|
|
64
|
+
"showInDashboard": false,
|
|
65
|
+
"validValues": ["대규모", "중규모", "소규모", "특대형", "일반형"],
|
|
66
|
+
"metadata": {
|
|
67
|
+
"icon": "bar_chart",
|
|
68
|
+
"color": "#7b1fa2"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"scopeLevel": 5,
|
|
73
|
+
"name": "공종",
|
|
74
|
+
"description": "건설 공사의 종류나 기술 분야",
|
|
75
|
+
"scopeType": "TECHNICAL",
|
|
76
|
+
"displayOrder": 5,
|
|
77
|
+
"active": true,
|
|
78
|
+
"includeInStatistics": true,
|
|
79
|
+
"showInDashboard": false,
|
|
80
|
+
"validValues": [
|
|
81
|
+
"토목공사", "건축공사", "플랜트공사", "주택공사",
|
|
82
|
+
"도로공사", "철도공사", "항만공사", "상하수도공사",
|
|
83
|
+
"전기공사", "통신공사", "조경공사", "소방공사"
|
|
84
|
+
],
|
|
85
|
+
"metadata": {
|
|
86
|
+
"icon": "engineering",
|
|
87
|
+
"color": "#d32f2f"
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
]
|
|
@@ -7,8 +7,9 @@ export * from './kpi-metric/kpi-metric';
|
|
|
7
7
|
export * from './kpi-metric/kpi-metric-type';
|
|
8
8
|
export * from './kpi-metric-value/kpi-metric-value';
|
|
9
9
|
export * from './kpi-metric-value/kpi-metric-value-type';
|
|
10
|
-
export * from './kpi-
|
|
11
|
-
export
|
|
10
|
+
export * from './kpi-scope/kpi-scope';
|
|
11
|
+
export * from './kpi-org-scope/kpi-org-scope';
|
|
12
|
+
export declare const entities: (typeof import("./kpi-value/kpi-value").KpiValue | typeof import("./kpi/kpi").Kpi | typeof import("./kpi-org-scope/kpi-org-scope").KpiOrgScope | typeof import("./kpi-metric/kpi-metric").KpiMetric | typeof import("./kpi-statistic/kpi-statistic").KpiStatistic | typeof import("./kpi-metric-value/kpi-metric-value").KpiMetricValue | typeof import("./kpi-scope").KpiScope | typeof import("./kpi/kpi-history").KpiHistory)[];
|
|
12
13
|
export declare const schema: {
|
|
13
|
-
resolverClasses: (typeof import("./kpi-
|
|
14
|
+
resolverClasses: (typeof import("./kpi-statistic/kpi-statistic-query").KpiStatisticQuery | typeof import("./kpi-statistic/kpi-statistic-mutation").KpiStatisticMutation | typeof import("./kpi/kpi-query").KpiQuery | typeof import("./kpi/kpi-mutation").KpiMutation | typeof import("./kpi-value/kpi-value-query").KpiValueQuery | typeof import("./kpi-value/kpi-value-mutation").KpiValueMutation | typeof import("./kpi-metric/kpi-metric-query").KpiMetricQuery | typeof import("./kpi-metric/kpi-metric-mutation").KpiMetricMutation | typeof import("./kpi-metric-value/kpi-metric-value-query").KpiMetricValueQuery | typeof import("./kpi-metric-value/kpi-metric-value-mutation").KpiMetricValueMutation | typeof import("./kpi-org-scope/kpi-org-scope-query").KpiOrgScopeQuery | typeof import("./kpi-org-scope/kpi-org-scope-mutation").KpiOrgScopeMutation | typeof import("./kpi-alert/kpi-alert-query").KpiAlertQuery | typeof import("./kpi-scope").KpiScopeQuery | typeof import("./kpi-scope").KpiScopeMutation)[];
|
|
14
15
|
};
|
|
@@ -12,7 +12,8 @@ tslib_1.__exportStar(require("./kpi-metric/kpi-metric"), exports);
|
|
|
12
12
|
tslib_1.__exportStar(require("./kpi-metric/kpi-metric-type"), exports);
|
|
13
13
|
tslib_1.__exportStar(require("./kpi-metric-value/kpi-metric-value"), exports);
|
|
14
14
|
tslib_1.__exportStar(require("./kpi-metric-value/kpi-metric-value-type"), exports);
|
|
15
|
-
tslib_1.__exportStar(require("./kpi-
|
|
15
|
+
tslib_1.__exportStar(require("./kpi-scope/kpi-scope"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./kpi-org-scope/kpi-org-scope"), exports);
|
|
16
17
|
/* IMPORT ENTITIES AND RESOLVERS */
|
|
17
18
|
const kpi_statistic_1 = require("./kpi-statistic");
|
|
18
19
|
const kpi_1 = require("./kpi");
|
|
@@ -21,6 +22,7 @@ const kpi_metric_1 = require("./kpi-metric");
|
|
|
21
22
|
const kpi_metric_value_1 = require("./kpi-metric-value");
|
|
22
23
|
const kpi_org_scope_1 = require("./kpi-org-scope");
|
|
23
24
|
const kpi_alert_1 = require("./kpi-alert");
|
|
25
|
+
const kpi_scope_1 = require("./kpi-scope");
|
|
24
26
|
exports.entities = [
|
|
25
27
|
/* ENTITIES */
|
|
26
28
|
...kpi_statistic_1.entities,
|
|
@@ -28,7 +30,8 @@ exports.entities = [
|
|
|
28
30
|
...kpi_value_1.entities,
|
|
29
31
|
...kpi_metric_1.entities,
|
|
30
32
|
...kpi_metric_value_1.entities,
|
|
31
|
-
...kpi_org_scope_1.entities
|
|
33
|
+
...kpi_org_scope_1.entities,
|
|
34
|
+
...kpi_scope_1.entities
|
|
32
35
|
];
|
|
33
36
|
exports.schema = {
|
|
34
37
|
resolverClasses: [
|
|
@@ -39,7 +42,8 @@ exports.schema = {
|
|
|
39
42
|
...kpi_metric_1.resolvers,
|
|
40
43
|
...kpi_metric_value_1.resolvers,
|
|
41
44
|
...kpi_org_scope_1.resolvers,
|
|
42
|
-
...kpi_alert_1.resolvers
|
|
45
|
+
...kpi_alert_1.resolvers,
|
|
46
|
+
...kpi_scope_1.resolvers
|
|
43
47
|
]
|
|
44
48
|
};
|
|
45
49
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,wEAA6C;AAC7C,oDAAyB;AACzB,yDAA8B;AAC9B,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,8EAAmD;AACnD,mFAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/service/index.ts"],"names":[],"mappings":";;;;AAAA,yBAAyB;AACzB,wEAA6C;AAC7C,oDAAyB;AACzB,yDAA8B;AAC9B,gEAAqC;AACrC,qEAA0C;AAC1C,kEAAuC;AACvC,uEAA4C;AAC5C,8EAAmD;AACnD,mFAAwD;AACxD,gEAAqC;AACrC,wEAA6C;AAE7C,mCAAmC;AACnC,mDAIwB;AACxB,+BAA0E;AAC1E,2CAA0F;AAC1F,6CAA6F;AAC7F,yDAA6G;AAC7G,mDAAoG;AACpG,2CAA4D;AAC5D,2CAA0F;AAE7E,QAAA,QAAQ,GAAG;IACtB,cAAc;IACd,GAAG,wBAAoB;IACvB,GAAG,cAAW;IACd,GAAG,oBAAgB;IACnB,GAAG,qBAAiB;IACpB,GAAG,2BAAsB;IACzB,GAAG,wBAAmB;IACtB,GAAG,oBAAgB;CACpB,CAAA;AAEY,QAAA,MAAM,GAAG;IACpB,eAAe,EAAE;QACf,sBAAsB;QACtB,GAAG,yBAAqB;QACxB,GAAG,eAAY;QACf,GAAG,qBAAiB;QACpB,GAAG,sBAAkB;QACrB,GAAG,4BAAuB;QAC1B,GAAG,yBAAoB;QACvB,GAAG,qBAAiB;QACpB,GAAG,qBAAiB;KACrB;CACF,CAAA","sourcesContent":["/* EXPORT ENTITY TYPES */\nexport * from './kpi-statistic/kpi-statistic'\nexport * from './kpi/kpi'\nexport * from './kpi/kpi-type'\nexport * from './kpi-value/kpi-value'\nexport * from './kpi-value/kpi-value-type'\nexport * from './kpi-metric/kpi-metric'\nexport * from './kpi-metric/kpi-metric-type'\nexport * from './kpi-metric-value/kpi-metric-value'\nexport * from './kpi-metric-value/kpi-metric-value-type'\nexport * from './kpi-scope/kpi-scope'\nexport * from './kpi-org-scope/kpi-org-scope'\n\n/* IMPORT ENTITIES AND RESOLVERS */\nimport {\n entities as KpiStatisticEntities,\n resolvers as KpiStatisticResolvers,\n subscribers as KpiStatisticSubscribers\n} from './kpi-statistic'\nimport { entities as KpiEntities, resolvers as KpiResolvers } from './kpi'\nimport { entities as KpiValueEntities, resolvers as KpiValueResolvers } from './kpi-value'\nimport { entities as KpiMetricEntities, resolvers as KpiMetricResolvers } from './kpi-metric'\nimport { entities as KpiMetricValueEntities, resolvers as KpiMetricValueResolvers } from './kpi-metric-value'\nimport { entities as KpiOrgScopeEntities, resolvers as KpiOrgScopeResolvers } from './kpi-org-scope'\nimport { resolvers as KpiAlertResolvers } from './kpi-alert'\nimport { entities as KpiScopeEntities, resolvers as KpiScopeResolvers } from './kpi-scope'\n\nexport const entities = [\n /* ENTITIES */\n ...KpiStatisticEntities,\n ...KpiEntities,\n ...KpiValueEntities,\n ...KpiMetricEntities,\n ...KpiMetricValueEntities,\n ...KpiOrgScopeEntities,\n ...KpiScopeEntities\n]\n\nexport const schema = {\n resolverClasses: [\n /* RESOLVER CLASSES */\n ...KpiStatisticResolvers,\n ...KpiResolvers,\n ...KpiValueResolvers,\n ...KpiMetricResolvers,\n ...KpiMetricValueResolvers,\n ...KpiOrgScopeResolvers,\n ...KpiAlertResolvers,\n ...KpiScopeResolvers\n ]\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-query.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { IsNull } from 'typeorm'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Kpi } from './kpi'\nimport { KpiList } from './kpi-type'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiHistory } from './kpi-history'\nimport { Int } from 'type-graphql'\n\n@Resolver(Kpi)\nexport class KpiQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch root KPIs (KPIs without parent)' })\n async kpisLevel0(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: null },\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], {\n description:\n 'Fetch first level child KPIs. If rootId is provided, get children of that parent. If not, get all level 1 KPIs (children of root KPIs)'\n })\n async kpisLevel1(\n @Arg('rootId', {\n nullable: true,\n description: 'ID of the parent KPI to get level 1 children. If not provided, returns all level 1 KPIs'\n })\n rootId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n let whereCondition: any = { domain: { id: domain.id } }\n\n if (rootId) {\n // 특정 부모의 자식들\n whereCondition.parent = { id: rootId }\n } else {\n // 모든 level 1 KPI들 (root KPI들의 직계 자식들)\n // 부모가 있으면서 부모의 부모가 null인 KPI들\n const kpis = await getRepository(Kpi)\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .leftJoinAndSelect('children.children', 'grandchildren')\n .where('kpi.domain = :domainId', { domainId: domain.id })\n .andWhere('parent.id IS NOT NULL')\n .andWhere('parent.parent IS NULL')\n .orderBy('kpi.name', 'ASC')\n .getMany()\n\n return kpis\n }\n\n // rootId 제공된 경우\n const kpis = await getRepository(Kpi).find({\n where: whereCondition,\n relations: ['children', 'children.children'],\n order: { name: 'ASC' }\n })\n\n return kpis\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => Kpi!, { nullable: true, description: 'Fetch a single KPI by its unique identifier.' })\n async kpi(\n @Arg('id', { description: 'Unique identifier of the KPI to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain } = context.state\n\n return await getRepository(Kpi).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiList, { description: 'To fetch multiple Kpis' })\n async kpis(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(Kpi),\n searchables: ['name', 'description'],\n filtersMap: {\n parent: { columnName: 'id', relationColumn: 'parent' }\n }\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [Kpi])\n children(@Root() kpi: Kpi): Promise<Kpi[]> {\n return getRepository(Kpi).find({\n where: { parent: { id: kpi.id } }\n })\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() kpi: Kpi): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: kpi.domainId },\n refType: Kpi.name,\n refBy: kpi.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpi: Kpi): Promise<Domain> {\n return kpi.domainId && (await getRepository(Domain).findOneBy({ id: kpi.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpi: Kpi): Promise<User> {\n return kpi.updaterId && (await getRepository(User).findOneBy({ id: kpi.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpi: Kpi): Promise<User> {\n return kpi.creatorId && (await getRepository(User).findOneBy({ id: kpi.creatorId }))\n }\n\n @FieldResolver(type => KpiValue, { nullable: true })\n async value(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('orgScope', { nullable: true, description: 'Organization scope filter for value' }) orgScope?: string\n ): Promise<KpiValue | null> {\n const { domain } = context.state\n\n let whereCondition: any = {\n domain: { id: domain.id },\n kpi: { id: kpi.id }\n }\n\n // orgScope 필터가 있으면 KpiOrgScope로 필터링\n if (orgScope) {\n whereCondition.kpiOrgScope = { org: orgScope }\n }\n\n return await getRepository(KpiValue).findOne({\n where: whereCondition,\n relations: ['kpiOrgScope'],\n order: { valueDate: 'DESC' }\n })\n }\n\n @FieldResolver(type => Number, { nullable: true })\n targetValue(@Root() kpi: Kpi): number | undefined {\n return kpi.vizMeta?.targetValue\n }\n\n @FieldResolver(type => String, { nullable: true })\n unit(@Root() kpi: Kpi): string | undefined {\n return kpi.vizMeta?.unit\n }\n\n @FieldResolver(type => Kpi, { nullable: true })\n async parent(@Root() kpi: Kpi): Promise<Kpi | null> {\n if (!kpi.parentId) return null\n return await getRepository(Kpi).findOneBy({ id: kpi.parentId })\n }\n\n @FieldResolver(type => [KpiHistory], { nullable: true })\n async histories(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('limit', type => Int, { nullable: true }) limit?: number\n ): Promise<KpiHistory[]> {\n const { domain } = context.state\n const qb = getRepository(KpiHistory)\n .createQueryBuilder('history')\n .where('history.domain = :domainId', { domainId: domain.id })\n .andWhere('history.originalId = :kpiId', { kpiId: kpi.id })\n .orderBy('history.updatedAt', 'DESC')\n if (limit) qb.limit(limit)\n else qb.limit(1)\n return await qb.getMany()\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch KPIs in hierarchical tree structure' })\n async kpiTree(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: IsNull() },\n relations: ['children', 'children.children', 'children.children.children'],\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch child KPIs of a given parent KPI' })\n async kpiChildren(\n @Arg('parentId', { description: 'ID of the parent KPI' }) parentId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: { id: parentId } },\n order: { name: 'ASC' }\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-query.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { IsNull } from 'typeorm'\nimport { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { Kpi } from './kpi'\nimport { KpiList } from './kpi-type'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiHistory } from './kpi-history'\nimport { Int } from 'type-graphql'\n\n@Resolver(Kpi)\nexport class KpiQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch root KPIs (KPIs without parent)' })\n async kpisLevel0(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: null },\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], {\n description:\n 'Fetch first level child KPIs. If rootId is provided, get children of that parent. If not, get all level 1 KPIs (children of root KPIs)'\n })\n async kpisLevel1(\n @Arg('rootId', {\n nullable: true,\n description: 'ID of the parent KPI to get level 1 children. If not provided, returns all level 1 KPIs'\n })\n rootId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n let whereCondition: any = { domain: { id: domain.id } }\n\n if (rootId) {\n // 특정 부모의 자식들\n whereCondition.parent = { id: rootId }\n } else {\n // 모든 level 1 KPI들 (root KPI들의 직계 자식들)\n // 부모가 있으면서 부모의 부모가 null인 KPI들\n const kpis = await getRepository(Kpi)\n .createQueryBuilder('kpi')\n .leftJoinAndSelect('kpi.parent', 'parent')\n .leftJoinAndSelect('kpi.children', 'children')\n .leftJoinAndSelect('children.children', 'grandchildren')\n .where('kpi.domain = :domainId', { domainId: domain.id })\n .andWhere('parent.id IS NOT NULL')\n .andWhere('parent.parent IS NULL')\n .orderBy('kpi.name', 'ASC')\n .getMany()\n\n return kpis\n }\n\n // rootId 제공된 경우\n const kpis = await getRepository(Kpi).find({\n where: whereCondition,\n relations: ['children', 'children.children'],\n order: { name: 'ASC' }\n })\n\n return kpis\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => Kpi!, { nullable: true, description: 'Fetch a single KPI by its unique identifier.' })\n async kpi(\n @Arg('id', { description: 'Unique identifier of the KPI to fetch.' }) id: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain } = context.state\n\n return await getRepository(Kpi).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiList, { description: 'To fetch multiple Kpis' })\n async kpis(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(Kpi),\n searchables: ['name', 'description'],\n filtersMap: {\n parent: { columnName: 'id', relationColumn: 'parent' }\n }\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => [Kpi])\n children(@Root() kpi: Kpi): Promise<Kpi[]> {\n return getRepository(Kpi).find({\n where: { parent: { id: kpi.id } }\n })\n }\n\n @FieldResolver(type => String)\n async thumbnail(@Root() kpi: Kpi): Promise<string | undefined> {\n const attachment: Attachment = await getRepository(Attachment).findOne({\n where: {\n domain: { id: kpi.domainId },\n refType: Kpi.name,\n refBy: kpi.id\n }\n })\n\n return attachment?.fullpath\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() kpi: Kpi): Promise<Domain> {\n return kpi.domainId && (await getRepository(Domain).findOneBy({ id: kpi.domainId }))\n }\n\n @FieldResolver(type => User)\n async updater(@Root() kpi: Kpi): Promise<User> {\n return kpi.updaterId && (await getRepository(User).findOneBy({ id: kpi.updaterId }))\n }\n\n @FieldResolver(type => User)\n async creator(@Root() kpi: Kpi): Promise<User> {\n return kpi.creatorId && (await getRepository(User).findOneBy({ id: kpi.creatorId }))\n }\n\n @FieldResolver(type => KpiValue, { nullable: true })\n async value(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('orgScope', { nullable: true, description: 'Organization scope filter for value' }) orgScope?: string\n ): Promise<KpiValue | null> {\n const { domain } = context.state\n\n let whereCondition: any = {\n domain: { id: domain.id },\n kpi: { id: kpi.id }\n }\n\n // orgScope 필터가 있으면 KpiOrgScope로 필터링\n if (orgScope) {\n whereCondition.kpiOrgScope = { org: orgScope }\n }\n\n return await getRepository(KpiValue).findOne({\n where: whereCondition,\n relations: ['kpiOrgScope'],\n order: { valueDate: 'DESC' }\n })\n }\n\n @FieldResolver(type => Number, { nullable: true })\n targetValue(@Root() kpi: Kpi): number | undefined {\n return kpi.vizMeta?.targetValue\n }\n\n @FieldResolver(type => String, { nullable: true })\n unit(@Root() kpi: Kpi): string | undefined {\n return kpi.vizMeta?.unit\n }\n\n @FieldResolver(type => Kpi, { nullable: true })\n async parent(@Root() kpi: Kpi): Promise<Kpi | null> {\n if (!kpi.parentId) return null\n return await getRepository(Kpi).findOneBy({ id: kpi.parentId })\n }\n\n @FieldResolver(type => [KpiHistory], { nullable: true })\n async histories(\n @Root() kpi: Kpi,\n @Ctx() context,\n @Arg('limit', type => Int, { nullable: true }) limit?: number\n ): Promise<KpiHistory[]> {\n const { domain } = context.state\n const qb = getRepository(KpiHistory)\n .createQueryBuilder('history')\n .where('history.domain = :domainId', { domainId: domain.id })\n .andWhere('history.originalId = :kpiId', { kpiId: kpi.id })\n .orderBy('history.updatedAt', 'DESC')\n if (limit) qb.limit(limit)\n else qb.limit(1)\n return await qb.getMany()\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch KPIs in hierarchical tree structure' })\n async kpiTree(@Ctx() context: ResolverContext): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: IsNull() },\n relations: ['children', 'children.children', 'children.children.children'],\n order: { name: 'ASC' }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [Kpi], { description: 'Fetch child KPIs of a given parent KPI' })\n async kpiChildren(\n @Arg('parentId', { description: 'ID of the parent KPI' }) parentId: string,\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\n const { domain } = context.state\n\n return await getRepository(Kpi).find({\n where: { domain: { id: domain.id }, parent: { id: parentId } },\n order: { name: 'ASC' }\n })\n }\n}\n"]}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
export * from './kpi-org-scope';
|
|
2
|
-
export * from './kpi-org-scope-type';
|
|
3
|
-
export * from './kpi-org-scope-query';
|
|
4
|
-
export * from './kpi-org-scope-mutation';
|
|
5
1
|
import { KpiOrgScope } from './kpi-org-scope';
|
|
6
2
|
import { KpiOrgScopeQuery } from './kpi-org-scope-query';
|
|
7
3
|
import { KpiOrgScopeMutation } from './kpi-org-scope-mutation';
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.resolvers = exports.entities = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
tslib_1.__exportStar(require("./kpi-org-scope"), exports);
|
|
6
|
-
tslib_1.__exportStar(require("./kpi-org-scope-type"), exports);
|
|
7
|
-
tslib_1.__exportStar(require("./kpi-org-scope-query"), exports);
|
|
8
|
-
tslib_1.__exportStar(require("./kpi-org-scope-mutation"), exports);
|
|
9
4
|
const kpi_org_scope_1 = require("./kpi-org-scope");
|
|
10
5
|
const kpi_org_scope_query_1 = require("./kpi-org-scope-query");
|
|
11
6
|
const kpi_org_scope_mutation_1 = require("./kpi-org-scope-mutation");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-org-scope/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-org-scope/index.ts"],"names":[],"mappings":";;;AAAA,mDAA6C;AAC7C,+DAAwD;AACxD,qEAA8D;AAEjD,QAAA,QAAQ,GAAG,CAAC,2BAAW,CAAC,CAAA;AACxB,QAAA,SAAS,GAAG,CAAC,sCAAgB,EAAE,4CAAmB,CAAC,CAAA","sourcesContent":["import { KpiOrgScope } from './kpi-org-scope'\nimport { KpiOrgScopeQuery } from './kpi-org-scope-query'\nimport { KpiOrgScopeMutation } from './kpi-org-scope-mutation'\n\nexport const entities = [KpiOrgScope]\nexport const resolvers = [KpiOrgScopeQuery, KpiOrgScopeMutation]\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { KpiScope } from './kpi-scope';
|
|
2
|
+
import { KpiScopeQuery } from './kpi-scope-query';
|
|
3
|
+
import { KpiScopeMutation } from './kpi-scope-mutation';
|
|
4
|
+
export declare const entities: (typeof KpiScope)[];
|
|
5
|
+
export declare const resolvers: (typeof KpiScopeQuery | typeof KpiScopeMutation)[];
|
|
6
|
+
export * from './kpi-scope';
|
|
7
|
+
export * from './kpi-scope-query';
|
|
8
|
+
export * from './kpi-scope-mutation';
|
|
9
|
+
export * from './kpi-scope-type';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolvers = exports.entities = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const kpi_scope_1 = require("./kpi-scope");
|
|
6
|
+
const kpi_scope_query_1 = require("./kpi-scope-query");
|
|
7
|
+
const kpi_scope_mutation_1 = require("./kpi-scope-mutation");
|
|
8
|
+
exports.entities = [kpi_scope_1.KpiScope];
|
|
9
|
+
exports.resolvers = [kpi_scope_query_1.KpiScopeQuery, kpi_scope_mutation_1.KpiScopeMutation];
|
|
10
|
+
tslib_1.__exportStar(require("./kpi-scope"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./kpi-scope-query"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./kpi-scope-mutation"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./kpi-scope-type"), exports);
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/index.ts"],"names":[],"mappings":";;;;AAAA,2CAAsC;AACtC,uDAAiD;AACjD,6DAAuD;AAE1C,QAAA,QAAQ,GAAG,CAAC,oBAAQ,CAAC,CAAA;AACrB,QAAA,SAAS,GAAG,CAAC,+BAAa,EAAE,qCAAgB,CAAC,CAAA;AAE1D,sDAA2B;AAC3B,4DAAiC;AACjC,+DAAoC;AACpC,2DAAgC","sourcesContent":["import { KpiScope } from './kpi-scope'\nimport { KpiScopeQuery } from './kpi-scope-query'\nimport { KpiScopeMutation } from './kpi-scope-mutation'\n\nexport const entities = [KpiScope]\nexport const resolvers = [KpiScopeQuery, KpiScopeMutation]\n\nexport * from './kpi-scope'\nexport * from './kpi-scope-query'\nexport * from './kpi-scope-mutation'\nexport * from './kpi-scope-type'\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { KpiScope } from './kpi-scope';
|
|
2
|
+
import { NewKpiScope, KpiScopePatch } from './kpi-scope-type';
|
|
3
|
+
export declare class KpiScopeMutation {
|
|
4
|
+
createKpiScope(kpiScope: NewKpiScope, context: ResolverContext): Promise<KpiScope>;
|
|
5
|
+
updateKpiScope(id: string, patch: KpiScopePatch, context: ResolverContext): Promise<KpiScope>;
|
|
6
|
+
updateMultipleKpiScope(patches: KpiScopePatch[], context: ResolverContext): Promise<KpiScope[]>;
|
|
7
|
+
deleteKpiScope(id: string, context: ResolverContext): Promise<boolean>;
|
|
8
|
+
deleteKpiScopes(ids: string[], context: ResolverContext): Promise<boolean>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KpiScopeMutation = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const typeorm_1 = require("typeorm");
|
|
7
|
+
const shell_1 = require("@things-factory/shell");
|
|
8
|
+
const kpi_scope_1 = require("./kpi-scope");
|
|
9
|
+
const kpi_scope_type_1 = require("./kpi-scope-type");
|
|
10
|
+
let KpiScopeMutation = class KpiScopeMutation {
|
|
11
|
+
async createKpiScope(kpiScope, context) {
|
|
12
|
+
const { domain, user, tx } = context.state;
|
|
13
|
+
const result = await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).save({
|
|
14
|
+
...kpiScope,
|
|
15
|
+
domain,
|
|
16
|
+
creator: user,
|
|
17
|
+
updater: user
|
|
18
|
+
});
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
async updateKpiScope(id, patch, context) {
|
|
22
|
+
const { domain, user, tx } = context.state;
|
|
23
|
+
const repository = (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx);
|
|
24
|
+
const kpiScope = await repository.findOne({
|
|
25
|
+
where: { domain: { id: domain.id }, id }
|
|
26
|
+
});
|
|
27
|
+
const result = await repository.save({
|
|
28
|
+
...kpiScope,
|
|
29
|
+
...patch,
|
|
30
|
+
updater: user
|
|
31
|
+
});
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
async updateMultipleKpiScope(patches, context) {
|
|
35
|
+
const { domain, user, tx } = context.state;
|
|
36
|
+
let results = [];
|
|
37
|
+
const _createRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === '+');
|
|
38
|
+
const _updateRecords = patches.filter((patch) => patch.cuFlag.toUpperCase() === 'M');
|
|
39
|
+
const kpiScopeRepo = (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx);
|
|
40
|
+
if (_createRecords.length > 0) {
|
|
41
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
42
|
+
const newRecord = _createRecords[i];
|
|
43
|
+
const result = await kpiScopeRepo.save({
|
|
44
|
+
...newRecord,
|
|
45
|
+
domain,
|
|
46
|
+
creator: user,
|
|
47
|
+
updater: user
|
|
48
|
+
});
|
|
49
|
+
results.push({ ...result, cuFlag: '+' });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (_updateRecords.length > 0) {
|
|
53
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
54
|
+
const updateRecord = _updateRecords[i];
|
|
55
|
+
const kpiScope = await kpiScopeRepo.findOneBy({ id: updateRecord.id });
|
|
56
|
+
const result = await kpiScopeRepo.save({
|
|
57
|
+
...kpiScope,
|
|
58
|
+
...updateRecord,
|
|
59
|
+
updater: user
|
|
60
|
+
});
|
|
61
|
+
results.push({ ...result, cuFlag: 'M' });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return results;
|
|
65
|
+
}
|
|
66
|
+
async deleteKpiScope(id, context) {
|
|
67
|
+
const { domain, tx } = context.state;
|
|
68
|
+
await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).delete({ domain: { id: domain.id }, id });
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
async deleteKpiScopes(ids, context) {
|
|
72
|
+
const { domain, tx } = context.state;
|
|
73
|
+
await (0, shell_1.getRepository)(kpi_scope_1.KpiScope, tx).delete({
|
|
74
|
+
domain: { id: domain.id },
|
|
75
|
+
id: (0, typeorm_1.In)(ids)
|
|
76
|
+
});
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
exports.KpiScopeMutation = KpiScopeMutation;
|
|
81
|
+
tslib_1.__decorate([
|
|
82
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
83
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
84
|
+
(0, type_graphql_1.Mutation)(returns => kpi_scope_1.KpiScope, { description: 'Create a new scope dimension definition' }),
|
|
85
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiScope')),
|
|
86
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
87
|
+
tslib_1.__metadata("design:type", Function),
|
|
88
|
+
tslib_1.__metadata("design:paramtypes", [kpi_scope_type_1.NewKpiScope, Object]),
|
|
89
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
90
|
+
], KpiScopeMutation.prototype, "createKpiScope", null);
|
|
91
|
+
tslib_1.__decorate([
|
|
92
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
93
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
94
|
+
(0, type_graphql_1.Mutation)(returns => kpi_scope_1.KpiScope, { description: 'Update a scope dimension definition' }),
|
|
95
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
|
96
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
|
|
97
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
98
|
+
tslib_1.__metadata("design:type", Function),
|
|
99
|
+
tslib_1.__metadata("design:paramtypes", [String, kpi_scope_type_1.KpiScopePatch, Object]),
|
|
100
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
101
|
+
], KpiScopeMutation.prototype, "updateKpiScope", null);
|
|
102
|
+
tslib_1.__decorate([
|
|
103
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
104
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
105
|
+
(0, type_graphql_1.Mutation)(returns => [kpi_scope_1.KpiScope], { description: "Update multiple scope dimension definitions" }),
|
|
106
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [kpi_scope_type_1.KpiScopePatch])),
|
|
107
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
108
|
+
tslib_1.__metadata("design:type", Function),
|
|
109
|
+
tslib_1.__metadata("design:paramtypes", [Array, Object]),
|
|
110
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
111
|
+
], KpiScopeMutation.prototype, "updateMultipleKpiScope", null);
|
|
112
|
+
tslib_1.__decorate([
|
|
113
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
114
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
115
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Delete a scope dimension definition' }),
|
|
116
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
|
117
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
118
|
+
tslib_1.__metadata("design:type", Function),
|
|
119
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
120
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
121
|
+
], KpiScopeMutation.prototype, "deleteKpiScope", null);
|
|
122
|
+
tslib_1.__decorate([
|
|
123
|
+
(0, type_graphql_1.Directive)('@transaction'),
|
|
124
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
125
|
+
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'Delete multiple scope dimension definitions' }),
|
|
126
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('ids', type => [String])),
|
|
127
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
128
|
+
tslib_1.__metadata("design:type", Function),
|
|
129
|
+
tslib_1.__metadata("design:paramtypes", [Array, Object]),
|
|
130
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
131
|
+
], KpiScopeMutation.prototype, "deleteKpiScopes", null);
|
|
132
|
+
exports.KpiScopeMutation = KpiScopeMutation = tslib_1.__decorate([
|
|
133
|
+
(0, type_graphql_1.Resolver)(kpi_scope_1.KpiScope)
|
|
134
|
+
], KpiScopeMutation);
|
|
135
|
+
//# sourceMappingURL=kpi-scope-mutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kpi-scope-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/kpi-scope-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 type ResolverContext from '@things-factory/auth-base'\n\nimport { KpiScope } from './kpi-scope'\nimport { NewKpiScope, KpiScopePatch } from './kpi-scope-type'\n\n@Resolver(KpiScope)\nexport class KpiScopeMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Create a new scope dimension definition' })\n async createKpiScope(\n @Arg('kpiScope') kpiScope: NewKpiScope,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(KpiScope, tx).save({\n ...kpiScope,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Update a scope dimension definition' })\n async updateKpiScope(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiScopePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiScope, tx)\n const kpiScope = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...kpiScope,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiScope], { description: \"Update multiple scope dimension definitions\" })\n async updateMultipleKpiScope(\n @Arg('patches', type => [KpiScopePatch]) patches: KpiScopePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiScope[]> {\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 kpiScopeRepo = getRepository(KpiScope, 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 kpiScopeRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\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 kpiScope = await kpiScopeRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiScopeRepo.save({\n ...kpiScope,\n ...updateRecord,\n updater: user\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: 'Delete a scope dimension definition' })\n async deleteKpiScope(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({ domain: { id: domain.id }, id })\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: 'Delete multiple scope dimension definitions' })\n async deleteKpiScopes(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n}"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Domain, ListParam } from '@things-factory/shell';
|
|
2
|
+
import { User } from '@things-factory/auth-base';
|
|
3
|
+
import { KpiScope } from './kpi-scope';
|
|
4
|
+
import { KpiScopeList } from './kpi-scope-type';
|
|
5
|
+
export declare class KpiScopeQuery {
|
|
6
|
+
kpiScope(id: string, context: ResolverContext): Promise<KpiScope>;
|
|
7
|
+
kpiScopes(params: ListParam, context: ResolverContext): Promise<KpiScopeList>;
|
|
8
|
+
domain(kpiScope: KpiScope): Promise<Domain>;
|
|
9
|
+
updater(kpiScope: KpiScope): Promise<User>;
|
|
10
|
+
creator(kpiScope: KpiScope): Promise<User>;
|
|
11
|
+
}
|