@dssp/dkpi 1.0.0-alpha.57 → 1.0.0-alpha.59
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/assets/images/project-image.png +0 -0
- package/dist-client/components/kpi-boxplot-chart.d.ts +1 -1
- package/dist-client/components/kpi-boxplot-chart.js +29 -65
- package/dist-client/components/kpi-boxplot-chart.js.map +1 -1
- package/dist-client/components/kpi-lookup-chart.d.ts +29 -0
- package/dist-client/components/kpi-lookup-chart.js +434 -0
- package/dist-client/components/kpi-lookup-chart.js.map +1 -0
- package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
- package/dist-client/components/kpi-mini-trend-chart.js +148 -0
- package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
- package/dist-client/components/kpi-radar-chart.d.ts +1 -1
- package/dist-client/components/kpi-radar-chart.js +73 -55
- package/dist-client/components/kpi-radar-chart.js.map +1 -1
- package/dist-client/components/kpi-trend-chart.d.ts +25 -0
- package/dist-client/components/kpi-trend-chart.js +220 -0
- package/dist-client/components/kpi-trend-chart.js.map +1 -0
- package/dist-client/google-map/common-google-map.d.ts +35 -0
- package/dist-client/google-map/common-google-map.js +343 -0
- package/dist-client/google-map/common-google-map.js.map +1 -0
- package/dist-client/google-map/google-map-loader.d.ts +6 -0
- package/dist-client/google-map/google-map-loader.js +23 -0
- package/dist-client/google-map/google-map-loader.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +17 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +280 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +21 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +389 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +25 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +469 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +34 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +642 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +38 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +501 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +26 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +439 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +131 -0
- package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +36 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +572 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +59 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +1027 -0
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
- package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
- package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
- package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +147 -0
- package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
- package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
- package/dist-client/pages/sv-project-detail.d.ts +10 -0
- package/dist-client/pages/sv-project-detail.js +381 -3
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +3 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-client/viewparts/menu-tools.d.ts +10 -1
- package/dist-client/viewparts/menu-tools.js +36 -7
- package/dist-client/viewparts/menu-tools.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +54 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +443 -18
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +6 -4
- package/dist-server/service/kpi-stat/kpi-stat-query.js +232 -22
- package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +6 -0
- package/dist-server/service/kpi-stat/kpi-stat-types.js +23 -1
- package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +1 -0
- package/dist-server/service/kpi-value/kpi-value-query.js +22 -0
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/schema.graphql +3 -0
|
@@ -7,7 +7,7 @@ const shell_1 = require("@things-factory/shell");
|
|
|
7
7
|
const kpi_1 = require("@things-factory/kpi");
|
|
8
8
|
const kpi_stat_types_1 = require("./kpi-stat-types");
|
|
9
9
|
let KpiStatQuery = class KpiStatQuery {
|
|
10
|
-
async totalKpiZValueComprehensiveStats(context) {
|
|
10
|
+
async totalKpiZValueComprehensiveStats(startYearMonth, endYearMonth, context) {
|
|
11
11
|
const { domain } = context.state;
|
|
12
12
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
13
13
|
.createQueryBuilder('kv')
|
|
@@ -25,8 +25,15 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
25
25
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
26
26
|
.where('k.name LIKE :pattern', { pattern: 'Z%' })
|
|
27
27
|
.andWhere('p.end_date IS NOT NULL')
|
|
28
|
-
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
29
|
-
|
|
28
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id });
|
|
29
|
+
// 기간 필터
|
|
30
|
+
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
31
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth });
|
|
32
|
+
}
|
|
33
|
+
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
34
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth });
|
|
35
|
+
}
|
|
36
|
+
queryBuilder.groupBy('k.name');
|
|
30
37
|
const results = await queryBuilder.getRawMany();
|
|
31
38
|
return results.map(result => {
|
|
32
39
|
const kpiName = result.kpiname;
|
|
@@ -49,7 +56,7 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
49
56
|
};
|
|
50
57
|
});
|
|
51
58
|
}
|
|
52
|
-
async totalKpiYValueComprehensiveStats(context) {
|
|
59
|
+
async totalKpiYValueComprehensiveStats(startYearMonth, endYearMonth, context) {
|
|
53
60
|
const { domain } = context.state;
|
|
54
61
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
55
62
|
.createQueryBuilder('kv')
|
|
@@ -67,9 +74,15 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
67
74
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
68
75
|
.where('k.name LIKE :pattern', { pattern: 'Y%' })
|
|
69
76
|
.andWhere('p.end_date IS NOT NULL')
|
|
70
|
-
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id });
|
|
78
|
+
// 기간 필터
|
|
79
|
+
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
80
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth });
|
|
81
|
+
}
|
|
82
|
+
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
83
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth });
|
|
84
|
+
}
|
|
85
|
+
queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC');
|
|
73
86
|
const results = await queryBuilder.getRawMany();
|
|
74
87
|
return results.map(result => {
|
|
75
88
|
const kpiName = result.kpiname;
|
|
@@ -92,12 +105,30 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
92
105
|
};
|
|
93
106
|
});
|
|
94
107
|
}
|
|
95
|
-
async kpiZValueComprehensiveStatsByGeoGroup(geoGroup, context) {
|
|
108
|
+
async kpiZValueComprehensiveStatsByGeoGroup(geoGroup, kpiName, startYearMonth, endYearMonth, context) {
|
|
96
109
|
const { domain } = context.state;
|
|
97
110
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
98
111
|
.createQueryBuilder('kv')
|
|
99
112
|
.select([
|
|
100
|
-
|
|
113
|
+
`CASE
|
|
114
|
+
WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'
|
|
115
|
+
WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'
|
|
116
|
+
WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'
|
|
117
|
+
WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'
|
|
118
|
+
WHEN p.geo_group IN ('61','62') THEN '광주광역시'
|
|
119
|
+
WHEN p.geo_group IN ('34','35') THEN '대전광역시'
|
|
120
|
+
WHEN p.geo_group IN ('44','45') THEN '울산광역시'
|
|
121
|
+
WHEN p.geo_group = '30' THEN '세종특별자치시'
|
|
122
|
+
WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'
|
|
123
|
+
WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'
|
|
124
|
+
WHEN p.geo_group IN ('27','28','29') THEN '충청북도'
|
|
125
|
+
WHEN p.geo_group IN ('31','32') THEN '충청남도'
|
|
126
|
+
WHEN p.geo_group IN ('54','55','56') THEN '전라북도'
|
|
127
|
+
WHEN p.geo_group IN ('57','58','59') THEN '전라남도'
|
|
128
|
+
WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'
|
|
129
|
+
WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'
|
|
130
|
+
WHEN p.geo_group = '63' THEN '제주특별자치도'
|
|
131
|
+
END as geoGroup`,
|
|
101
132
|
'MIN(kv.score) as minVal',
|
|
102
133
|
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
103
134
|
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
@@ -108,13 +139,26 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
108
139
|
])
|
|
109
140
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
110
141
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
111
|
-
.where('
|
|
112
|
-
.andWhere('p.end_date IS NOT NULL')
|
|
142
|
+
.where('p.end_date IS NOT NULL')
|
|
113
143
|
.andWhere('p.geo_group IS NOT NULL')
|
|
114
|
-
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
115
|
-
|
|
144
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id });
|
|
145
|
+
// 기간 필터
|
|
146
|
+
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
147
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth });
|
|
148
|
+
}
|
|
149
|
+
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
150
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth });
|
|
151
|
+
}
|
|
152
|
+
// KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체
|
|
153
|
+
if (kpiName && kpiName.trim() !== '') {
|
|
154
|
+
queryBuilder.andWhere('k.name = :kpiName', { kpiName });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' });
|
|
158
|
+
}
|
|
159
|
+
queryBuilder.groupBy('geoGroup');
|
|
116
160
|
if (geoGroup && geoGroup.trim() !== '') {
|
|
117
|
-
queryBuilder.
|
|
161
|
+
queryBuilder.having('geoGroup = :geoGroup', { geoGroup });
|
|
118
162
|
}
|
|
119
163
|
const results = await queryBuilder.getRawMany();
|
|
120
164
|
return results
|
|
@@ -191,31 +235,175 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
191
235
|
})
|
|
192
236
|
.filter(result => result.geoGroup !== null);
|
|
193
237
|
}
|
|
238
|
+
async kpiZValueMonthlyTrendByGeoGroup(kpiName, startYearMonth, endYearMonth, context) {
|
|
239
|
+
const { domain } = context.state;
|
|
240
|
+
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
241
|
+
.createQueryBuilder('kv')
|
|
242
|
+
.select([
|
|
243
|
+
`CASE
|
|
244
|
+
WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'
|
|
245
|
+
WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'
|
|
246
|
+
WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'
|
|
247
|
+
WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'
|
|
248
|
+
WHEN p.geo_group IN ('61','62') THEN '광주광역시'
|
|
249
|
+
WHEN p.geo_group IN ('34','35') THEN '대전광역시'
|
|
250
|
+
WHEN p.geo_group IN ('44','45') THEN '울산광역시'
|
|
251
|
+
WHEN p.geo_group = '30' THEN '세종특별자치시'
|
|
252
|
+
WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'
|
|
253
|
+
WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'
|
|
254
|
+
WHEN p.geo_group IN ('27','28','29') THEN '충청북도'
|
|
255
|
+
WHEN p.geo_group IN ('31','32') THEN '충청남도'
|
|
256
|
+
WHEN p.geo_group IN ('54','55','56') THEN '전라북도'
|
|
257
|
+
WHEN p.geo_group IN ('57','58','59') THEN '전라남도'
|
|
258
|
+
WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'
|
|
259
|
+
WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'
|
|
260
|
+
WHEN p.geo_group = '63' THEN '제주특별자치도'
|
|
261
|
+
END as geoGroup`,
|
|
262
|
+
`TO_CHAR(p.end_date, 'YYYY-MM') as yearMonth`,
|
|
263
|
+
'AVG(kv.score) as avgVal',
|
|
264
|
+
'COUNT(DISTINCT p.id) as projectCount'
|
|
265
|
+
])
|
|
266
|
+
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
267
|
+
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
268
|
+
.where('p.end_date IS NOT NULL')
|
|
269
|
+
.andWhere('p.geo_group IS NOT NULL')
|
|
270
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id });
|
|
271
|
+
// 기간 필터
|
|
272
|
+
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
273
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth });
|
|
274
|
+
}
|
|
275
|
+
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
276
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth });
|
|
277
|
+
}
|
|
278
|
+
// KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체
|
|
279
|
+
if (kpiName && kpiName.trim() !== '') {
|
|
280
|
+
queryBuilder.andWhere('k.name = :kpiName', { kpiName });
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' });
|
|
284
|
+
}
|
|
285
|
+
queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC');
|
|
286
|
+
const results = await queryBuilder.getRawMany();
|
|
287
|
+
return results
|
|
288
|
+
.map(result => {
|
|
289
|
+
const avgVal = Number(result.avgval);
|
|
290
|
+
const projectCount = Number(result.projectcount);
|
|
291
|
+
return {
|
|
292
|
+
geoGroup: result.geogroup || null,
|
|
293
|
+
yearMonth: result.yearmonth,
|
|
294
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
295
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
296
|
+
};
|
|
297
|
+
})
|
|
298
|
+
.filter(result => result.geoGroup !== null);
|
|
299
|
+
}
|
|
300
|
+
async kpiYValueStatsByMetroArea(metroArea, startYearMonth, endYearMonth, context) {
|
|
301
|
+
if (!context || !context.state) {
|
|
302
|
+
console.error('Context is undefined or missing state');
|
|
303
|
+
return [];
|
|
304
|
+
}
|
|
305
|
+
const { domain } = context.state;
|
|
306
|
+
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
307
|
+
.createQueryBuilder('kv')
|
|
308
|
+
.select([
|
|
309
|
+
'k.name as kpiName',
|
|
310
|
+
'MIN(kv.score) as minVal',
|
|
311
|
+
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
312
|
+
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
313
|
+
'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
|
|
314
|
+
'MAX(kv.score) as maxVal',
|
|
315
|
+
'AVG(kv.score) as avgVal',
|
|
316
|
+
'COUNT(DISTINCT p.id) as projectCount'
|
|
317
|
+
])
|
|
318
|
+
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
319
|
+
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
320
|
+
.where('k.name LIKE :pattern', { pattern: 'Y%' })
|
|
321
|
+
.andWhere('p.end_date IS NOT NULL')
|
|
322
|
+
.andWhere('p.geo_group IS NOT NULL')
|
|
323
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id });
|
|
324
|
+
// 기간 필터
|
|
325
|
+
if (startYearMonth && startYearMonth.trim() !== '') {
|
|
326
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth });
|
|
327
|
+
}
|
|
328
|
+
if (endYearMonth && endYearMonth.trim() !== '') {
|
|
329
|
+
queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth });
|
|
330
|
+
}
|
|
331
|
+
queryBuilder
|
|
332
|
+
.andWhere(`CASE
|
|
333
|
+
WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'
|
|
334
|
+
WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'
|
|
335
|
+
WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'
|
|
336
|
+
WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'
|
|
337
|
+
WHEN p.geo_group IN ('61','62') THEN '광주광역시'
|
|
338
|
+
WHEN p.geo_group IN ('34','35') THEN '대전광역시'
|
|
339
|
+
WHEN p.geo_group IN ('44','45') THEN '울산광역시'
|
|
340
|
+
WHEN p.geo_group = '30' THEN '세종특별자치시'
|
|
341
|
+
WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'
|
|
342
|
+
WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'
|
|
343
|
+
WHEN p.geo_group IN ('27','28','29') THEN '충청북도'
|
|
344
|
+
WHEN p.geo_group IN ('31','32') THEN '충청남도'
|
|
345
|
+
WHEN p.geo_group IN ('54','55','56') THEN '전라북도'
|
|
346
|
+
WHEN p.geo_group IN ('57','58','59') THEN '전라남도'
|
|
347
|
+
WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'
|
|
348
|
+
WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'
|
|
349
|
+
WHEN p.geo_group = '63' THEN '제주특별자치도'
|
|
350
|
+
END = :metroArea`, { metroArea })
|
|
351
|
+
.groupBy('k.name')
|
|
352
|
+
.orderBy('k.name', 'ASC');
|
|
353
|
+
const results = await queryBuilder.getRawMany();
|
|
354
|
+
return results.map(result => {
|
|
355
|
+
const kpiName = result.kpiname;
|
|
356
|
+
const minVal = Number(result.minval);
|
|
357
|
+
const q1Val = Number(result.q1val);
|
|
358
|
+
const medVal = Number(result.medval);
|
|
359
|
+
const q3Val = Number(result.q3val);
|
|
360
|
+
const avgVal = Number(result.avgval);
|
|
361
|
+
const maxVal = Number(result.maxval);
|
|
362
|
+
const projectCount = Number(result.projectcount);
|
|
363
|
+
return {
|
|
364
|
+
kpiName: kpiName,
|
|
365
|
+
minVal: isNaN(minVal) ? 0 : minVal,
|
|
366
|
+
q1Val: isNaN(q1Val) ? 0 : q1Val,
|
|
367
|
+
medVal: isNaN(medVal) ? 0 : medVal,
|
|
368
|
+
q3Val: isNaN(q3Val) ? 0 : q3Val,
|
|
369
|
+
maxVal: isNaN(maxVal) ? 0 : maxVal,
|
|
370
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
371
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
372
|
+
};
|
|
373
|
+
});
|
|
374
|
+
}
|
|
194
375
|
};
|
|
195
376
|
exports.KpiStatQuery = KpiStatQuery;
|
|
196
377
|
tslib_1.__decorate([
|
|
197
378
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
198
379
|
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' }),
|
|
199
|
-
tslib_1.__param(0, (0, type_graphql_1.
|
|
380
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
381
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('endYearMonth', { nullable: true })),
|
|
382
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
200
383
|
tslib_1.__metadata("design:type", Function),
|
|
201
|
-
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
384
|
+
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
|
202
385
|
tslib_1.__metadata("design:returntype", Promise)
|
|
203
386
|
], KpiStatQuery.prototype, "totalKpiZValueComprehensiveStats", null);
|
|
204
387
|
tslib_1.__decorate([
|
|
205
388
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
206
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for
|
|
207
|
-
tslib_1.__param(0, (0, type_graphql_1.
|
|
389
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' }),
|
|
390
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
391
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('endYearMonth', { nullable: true })),
|
|
392
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
208
393
|
tslib_1.__metadata("design:type", Function),
|
|
209
|
-
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
394
|
+
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
|
210
395
|
tslib_1.__metadata("design:returntype", Promise)
|
|
211
396
|
], KpiStatQuery.prototype, "totalKpiYValueComprehensiveStats", null);
|
|
212
397
|
tslib_1.__decorate([
|
|
213
398
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
214
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by
|
|
399
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by metro area' }),
|
|
215
400
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
|
|
216
|
-
tslib_1.__param(1, (0, type_graphql_1.
|
|
401
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('kpiName', { nullable: true })),
|
|
402
|
+
tslib_1.__param(2, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
403
|
+
tslib_1.__param(3, (0, type_graphql_1.Arg)('endYearMonth', { nullable: true })),
|
|
404
|
+
tslib_1.__param(4, (0, type_graphql_1.Ctx)()),
|
|
217
405
|
tslib_1.__metadata("design:type", Function),
|
|
218
|
-
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
406
|
+
tslib_1.__metadata("design:paramtypes", [String, String, String, String, Object]),
|
|
219
407
|
tslib_1.__metadata("design:returntype", Promise)
|
|
220
408
|
], KpiStatQuery.prototype, "kpiZValueComprehensiveStatsByGeoGroup", null);
|
|
221
409
|
tslib_1.__decorate([
|
|
@@ -227,6 +415,28 @@ tslib_1.__decorate([
|
|
|
227
415
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
228
416
|
tslib_1.__metadata("design:returntype", Promise)
|
|
229
417
|
], KpiStatQuery.prototype, "kpiYValueComprehensiveStatsByGeoGroup", null);
|
|
418
|
+
tslib_1.__decorate([
|
|
419
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
420
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' }),
|
|
421
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiName', { nullable: true })),
|
|
422
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
423
|
+
tslib_1.__param(2, (0, type_graphql_1.Arg)('endYearMonth', { nullable: true })),
|
|
424
|
+
tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
|
|
425
|
+
tslib_1.__metadata("design:type", Function),
|
|
426
|
+
tslib_1.__metadata("design:paramtypes", [String, String, String, Object]),
|
|
427
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
428
|
+
], KpiStatQuery.prototype, "kpiZValueMonthlyTrendByGeoGroup", null);
|
|
429
|
+
tslib_1.__decorate([
|
|
430
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
431
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' }),
|
|
432
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('metroArea')),
|
|
433
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('startYearMonth', { nullable: true })),
|
|
434
|
+
tslib_1.__param(2, (0, type_graphql_1.Arg)('endYearMonth', { nullable: true })),
|
|
435
|
+
tslib_1.__param(3, (0, type_graphql_1.Ctx)()),
|
|
436
|
+
tslib_1.__metadata("design:type", Function),
|
|
437
|
+
tslib_1.__metadata("design:paramtypes", [String, String, String, Object]),
|
|
438
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
439
|
+
], KpiStatQuery.prototype, "kpiYValueStatsByMetroArea", null);
|
|
230
440
|
exports.KpiStatQuery = KpiStatQuery = tslib_1.__decorate([
|
|
231
441
|
(0, type_graphql_1.Resolver)(kpi_1.KpiStatistic)
|
|
232
442
|
], KpiStatQuery);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(@Ctx() context?: ResolverContext): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(@Ctx() context?: ResolverContext): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-stat-query.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Query, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '@things-factory/shell'\nimport type ResolverContext from '@things-factory/auth-base'\nimport { KpiStatistic } from '@things-factory/kpi'\nimport { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup, KpiMonthlyTrend } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' })\n async totalKpiZValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Z%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Y-category KPIs for all projects' })\n async totalKpiYValueComprehensiveStats(\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'AVG(kv.score) as avgVal',\n 'MAX(kv.score) as maxVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder.groupBy('k.name').orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by metro area' })\n async kpiZValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.having('geoGroup = :geoGroup', { geoGroup })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' })\n async kpiYValueComprehensiveStatsByGeoGroup(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStatsByGeoGroup[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'p.geo_group as geoGroup',\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n .groupBy('p.geo_group, k.name')\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const maxVal = Number(result.maxval)\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n geoGroup: result.geogroup || null,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiMonthlyTrend], { description: 'Get monthly KPI trend for Z-category KPIs by metro area' })\n async kpiZValueMonthlyTrendByGeoGroup(\n @Arg('kpiName', { nullable: true }) kpiName?: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiMonthlyTrend[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END as geoGroup`,\n `TO_CHAR(p.end_date, 'YYYY-MM') as yearMonth`,\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n // KPI 필터: kpiName이 지정되면 해당 Y-level KPI만, 없으면 Z-level KPI 전체\n if (kpiName && kpiName.trim() !== '') {\n queryBuilder.andWhere('k.name = :kpiName', { kpiName })\n } else {\n queryBuilder.andWhere('k.name LIKE :pattern', { pattern: 'Z%' })\n }\n\n queryBuilder.groupBy('geoGroup, yearMonth').orderBy('yearMonth', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n return results\n .map(result => {\n const avgVal = Number(result.avgval)\n const projectCount = Number(result.projectcount)\n\n return {\n geoGroup: result.geogroup || null,\n yearMonth: result.yearmonth,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiComprehensiveStats], { description: 'Get KPI statistics for Y-category KPIs by specific metro area' })\n async kpiYValueStatsByMetroArea(\n @Arg('metroArea') metroArea: string,\n @Arg('startYearMonth', { nullable: true }) startYearMonth?: string,\n @Arg('endYearMonth', { nullable: true }) endYearMonth?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiComprehensiveStats[]> {\n if (!context || !context.state) {\n console.error('Context is undefined or missing state')\n return []\n }\n\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\n 'k.name as kpiName',\n 'MIN(kv.score) as minVal',\n 'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',\n 'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',\n 'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',\n 'MAX(kv.score) as maxVal',\n 'AVG(kv.score) as avgVal',\n 'COUNT(DISTINCT p.id) as projectCount'\n ])\n .innerJoin('kpis', 'k', 'kv.kpi_id = k.id')\n .innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')\n .where('k.name LIKE :pattern', { pattern: 'Y%' })\n .andWhere('p.end_date IS NOT NULL')\n .andWhere('p.geo_group IS NOT NULL')\n .andWhere('kv.domain_id = :domainId', { domainId: domain.id })\n\n // 기간 필터\n if (startYearMonth && startYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') >= :startYearMonth`, { startYearMonth })\n }\n if (endYearMonth && endYearMonth.trim() !== '') {\n queryBuilder.andWhere(`TO_CHAR(p.end_date, 'YYYY-MM') <= :endYearMonth`, { endYearMonth })\n }\n\n queryBuilder\n .andWhere(\n `CASE\n WHEN p.geo_group IN ('01','02','03','04','05','06','07','08') THEN '서울특별시'\n WHEN p.geo_group IN ('46','47','48','49') THEN '부산광역시'\n WHEN p.geo_group IN ('41','42','43') THEN '대구광역시'\n WHEN p.geo_group IN ('21','22','23') THEN '인천광역시'\n WHEN p.geo_group IN ('61','62') THEN '광주광역시'\n WHEN p.geo_group IN ('34','35') THEN '대전광역시'\n WHEN p.geo_group IN ('44','45') THEN '울산광역시'\n WHEN p.geo_group = '30' THEN '세종특별자치시'\n WHEN p.geo_group IN ('10','11','12','13','14','15','16','17','18') THEN '경기도'\n WHEN p.geo_group IN ('24','25','26','33') THEN '강원도'\n WHEN p.geo_group IN ('27','28','29') THEN '충청북도'\n WHEN p.geo_group IN ('31','32') THEN '충청남도'\n WHEN p.geo_group IN ('54','55','56') THEN '전라북도'\n WHEN p.geo_group IN ('57','58','59') THEN '전라남도'\n WHEN p.geo_group IN ('36','37','38','39','40') THEN '경상북도'\n WHEN p.geo_group IN ('50','51','52','53') THEN '경상남도'\n WHEN p.geo_group = '63' THEN '제주특별자치도'\n END = :metroArea`,\n { metroArea }\n )\n .groupBy('k.name')\n .orderBy('k.name', 'ASC')\n\n const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\n const kpiName = result.kpiname\n const minVal = Number(result.minval)\n const q1Val = Number(result.q1val)\n const medVal = Number(result.medval)\n const q3Val = Number(result.q3val)\n const avgVal = Number(result.avgval)\n const maxVal = Number(result.maxval)\n const projectCount = Number(result.projectcount)\n\n return {\n kpiName: kpiName,\n minVal: isNaN(minVal) ? 0 : minVal,\n q1Val: isNaN(q1Val) ? 0 : q1Val,\n medVal: isNaN(medVal) ? 0 : medVal,\n q3Val: isNaN(q3Val) ? 0 : q3Val,\n maxVal: isNaN(maxVal) ? 0 : maxVal,\n avgVal: isNaN(avgVal) ? 0 : avgVal,\n projectCount: isNaN(projectCount) ? 0 : projectCount\n }\n })\n }\n}\n"]}
|
|
@@ -11,3 +11,9 @@ export declare class KpiComprehensiveStats {
|
|
|
11
11
|
export declare class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {
|
|
12
12
|
geoGroup?: string;
|
|
13
13
|
}
|
|
14
|
+
export declare class KpiMonthlyTrend {
|
|
15
|
+
geoGroup?: string;
|
|
16
|
+
yearMonth: string;
|
|
17
|
+
avgVal: number;
|
|
18
|
+
projectCount: number;
|
|
19
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.KpiComprehensiveStatsByGeoGroup = exports.KpiComprehensiveStats = void 0;
|
|
3
|
+
exports.KpiMonthlyTrend = exports.KpiComprehensiveStatsByGeoGroup = exports.KpiComprehensiveStats = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
6
|
// @ObjectType()
|
|
@@ -105,4 +105,26 @@ tslib_1.__decorate([
|
|
|
105
105
|
exports.KpiComprehensiveStatsByGeoGroup = KpiComprehensiveStatsByGeoGroup = tslib_1.__decorate([
|
|
106
106
|
(0, type_graphql_1.ObjectType)()
|
|
107
107
|
], KpiComprehensiveStatsByGeoGroup);
|
|
108
|
+
let KpiMonthlyTrend = class KpiMonthlyTrend {
|
|
109
|
+
};
|
|
110
|
+
exports.KpiMonthlyTrend = KpiMonthlyTrend;
|
|
111
|
+
tslib_1.__decorate([
|
|
112
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
113
|
+
tslib_1.__metadata("design:type", String)
|
|
114
|
+
], KpiMonthlyTrend.prototype, "geoGroup", void 0);
|
|
115
|
+
tslib_1.__decorate([
|
|
116
|
+
(0, type_graphql_1.Field)(),
|
|
117
|
+
tslib_1.__metadata("design:type", String)
|
|
118
|
+
], KpiMonthlyTrend.prototype, "yearMonth", void 0);
|
|
119
|
+
tslib_1.__decorate([
|
|
120
|
+
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
121
|
+
tslib_1.__metadata("design:type", Number)
|
|
122
|
+
], KpiMonthlyTrend.prototype, "avgVal", void 0);
|
|
123
|
+
tslib_1.__decorate([
|
|
124
|
+
(0, type_graphql_1.Field)(() => type_graphql_1.Int),
|
|
125
|
+
tslib_1.__metadata("design:type", Number)
|
|
126
|
+
], KpiMonthlyTrend.prototype, "projectCount", void 0);
|
|
127
|
+
exports.KpiMonthlyTrend = KpiMonthlyTrend = tslib_1.__decorate([
|
|
128
|
+
(0, type_graphql_1.ObjectType)()
|
|
129
|
+
], KpiMonthlyTrend);
|
|
108
130
|
//# sourceMappingURL=kpi-stat-types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-stat-types.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-types.ts"],"names":[],"mappings":";;;;AAAA,+CAA4D;AAE5D,gBAAgB;AAChB,iCAAiC;AACjC,+BAA+B;AAC/B,qBAAqB;AAErB,wBAAwB;AACxB,mBAAmB;AAEnB,wBAAwB;AACxB,kBAAkB;AAElB,wBAAwB;AACxB,mBAAmB;AAEnB,wBAAwB;AACxB,kBAAkB;AAElB,wBAAwB;AACxB,mBAAmB;AACnB,IAAI;AAEJ,gBAAgB;AAChB,mEAAmE;AACnE,+BAA+B;AAC/B,qBAAqB;AAErB,kCAAkC;AAClC,wBAAwB;AAExB,2BAA2B;AAC3B,sBAAsB;AAEtB,2BAA2B;AAC3B,qBAAqB;AAErB,2BAA2B;AAC3B,sBAAsB;AAEtB,2BAA2B;AAC3B,qBAAqB;AAErB,2BAA2B;AAC3B,sBAAsB;AACtB,IAAI;AAEJ,gBAAgB;AAChB,+BAA+B;AAC/B,+BAA+B;AAC/B,qBAAqB;AAErB,aAAa;AACb,oBAAoB;AAEpB,wBAAwB;AACxB,qBAAqB;AAErB,sBAAsB;AACtB,yBAAyB;AACzB,IAAI;AAEJ,gBAAgB;AAChB,+DAA+D;AAC/D,+BAA+B;AAC/B,qBAAqB;AAErB,gBAAgB;AAChB,uBAAuB;AAEvB,2BAA2B;AAC3B,wBAAwB;AAExB,yBAAyB;AACzB,4BAA4B;AAC5B,IAAI;AAGG,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAwBjC,CAAA;AAxBY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACX;AAGf;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;oDACN;AAGb;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;oDACN;AAGb;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;2DACG;gCAvBT,qBAAqB;IADjC,IAAA,yBAAU,GAAE;GACA,qBAAqB,CAwBjC;AAGM,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,qBAAqB;CAGzE,CAAA;AAHY,0EAA+B;AAE1C;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACT;0CAFN,+BAA+B;IAD3C,IAAA,yBAAU,GAAE;GACA,+BAA+B,CAG3C","sourcesContent":["import { ObjectType, Field, Float, Int } from 'type-graphql'\n\n// @ObjectType()\n// export class KpiBoxPlotStats {\n// @Field({ nullable: true })\n// kpiName?: string\n\n// @Field(() => Float)\n// minVal: number\n\n// @Field(() => Float)\n// q1Val: number\n\n// @Field(() => Float)\n// medVal: number\n\n// @Field(() => Float)\n// q3Val: number\n\n// @Field(() => Float)\n// maxVal: number\n// }\n\n// @ObjectType()\n// export class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// // @Field({ nullable: true })\n// // kpiName?: string\n\n// // @Field(() => Float)\n// // minVal: number\n\n// // @Field(() => Float)\n// // q1Val: number\n\n// // @Field(() => Float)\n// // medVal: number\n\n// // @Field(() => Float)\n// // q3Val: number\n\n// // @Field(() => Float)\n// // maxVal: number\n// }\n\n// @ObjectType()\n// export class KpiRadarStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// @Field()\n// kpiName: string\n\n// @Field(() => Float)\n// avgScore: number\n\n// @Field(() => Int)\n// projectCount: number\n// }\n\n// @ObjectType()\n// export class KpiRadarStatsByGeoGroup extends KpiRadarStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// // @Field()\n// // kpiName: string\n\n// // @Field(() => Float)\n// // avgScore: number\n\n// // @Field(() => Int)\n// // projectCount: number\n// }\n\n@ObjectType()\nexport class KpiComprehensiveStats {\n @Field({ nullable: true })\n kpiName: string\n\n @Field(() => Float)\n minVal: number\n\n @Field(() => Float)\n q1Val: number\n\n @Field(() => Float)\n medVal: number\n\n @Field(() => Float)\n q3Val: number\n\n @Field(() => Float)\n maxVal: number\n\n @Field(() => Float)\n avgVal: number\n\n @Field(() => Int)\n projectCount: number\n}\n\n@ObjectType()\nexport class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {\n @Field({ nullable: true })\n geoGroup?: string\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-stat-types.js","sourceRoot":"","sources":["../../../server/service/kpi-stat/kpi-stat-types.ts"],"names":[],"mappings":";;;;AAAA,+CAA4D;AAE5D,gBAAgB;AAChB,iCAAiC;AACjC,+BAA+B;AAC/B,qBAAqB;AAErB,wBAAwB;AACxB,mBAAmB;AAEnB,wBAAwB;AACxB,kBAAkB;AAElB,wBAAwB;AACxB,mBAAmB;AAEnB,wBAAwB;AACxB,kBAAkB;AAElB,wBAAwB;AACxB,mBAAmB;AACnB,IAAI;AAEJ,gBAAgB;AAChB,mEAAmE;AACnE,+BAA+B;AAC/B,qBAAqB;AAErB,kCAAkC;AAClC,wBAAwB;AAExB,2BAA2B;AAC3B,sBAAsB;AAEtB,2BAA2B;AAC3B,qBAAqB;AAErB,2BAA2B;AAC3B,sBAAsB;AAEtB,2BAA2B;AAC3B,qBAAqB;AAErB,2BAA2B;AAC3B,sBAAsB;AACtB,IAAI;AAEJ,gBAAgB;AAChB,+BAA+B;AAC/B,+BAA+B;AAC/B,qBAAqB;AAErB,aAAa;AACb,oBAAoB;AAEpB,wBAAwB;AACxB,qBAAqB;AAErB,sBAAsB;AACtB,yBAAyB;AACzB,IAAI;AAEJ,gBAAgB;AAChB,+DAA+D;AAC/D,+BAA+B;AAC/B,qBAAqB;AAErB,gBAAgB;AAChB,uBAAuB;AAEvB,2BAA2B;AAC3B,wBAAwB;AAExB,yBAAyB;AACzB,4BAA4B;AAC5B,IAAI;AAGG,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;CAwBjC,CAAA;AAxBY,sDAAqB;AAEhC;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sDACX;AAGf;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;oDACN;AAGb;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;oDACN;AAGb;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;qDACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;2DACG;gCAvBT,qBAAqB;IADjC,IAAA,yBAAU,GAAE;GACA,qBAAqB,CAwBjC;AAGM,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,qBAAqB;CAGzE,CAAA;AAHY,0EAA+B;AAE1C;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iEACT;0CAFN,+BAA+B;IAD3C,IAAA,yBAAU,GAAE;GACA,+BAA+B,CAG3C;AAGM,IAAM,eAAe,GAArB,MAAM,eAAe;CAY3B,CAAA;AAZY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDACT;AAGjB;IADC,IAAA,oBAAK,GAAE;;kDACS;AAGjB;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,oBAAK,CAAC;;+CACL;AAGd;IADC,IAAA,oBAAK,EAAC,GAAG,EAAE,CAAC,kBAAG,CAAC;;qDACG;0BAXT,eAAe;IAD3B,IAAA,yBAAU,GAAE;GACA,eAAe,CAY3B","sourcesContent":["import { ObjectType, Field, Float, Int } from 'type-graphql'\n\n// @ObjectType()\n// export class KpiBoxPlotStats {\n// @Field({ nullable: true })\n// kpiName?: string\n\n// @Field(() => Float)\n// minVal: number\n\n// @Field(() => Float)\n// q1Val: number\n\n// @Field(() => Float)\n// medVal: number\n\n// @Field(() => Float)\n// q3Val: number\n\n// @Field(() => Float)\n// maxVal: number\n// }\n\n// @ObjectType()\n// export class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// // @Field({ nullable: true })\n// // kpiName?: string\n\n// // @Field(() => Float)\n// // minVal: number\n\n// // @Field(() => Float)\n// // q1Val: number\n\n// // @Field(() => Float)\n// // medVal: number\n\n// // @Field(() => Float)\n// // q3Val: number\n\n// // @Field(() => Float)\n// // maxVal: number\n// }\n\n// @ObjectType()\n// export class KpiRadarStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// @Field()\n// kpiName: string\n\n// @Field(() => Float)\n// avgScore: number\n\n// @Field(() => Int)\n// projectCount: number\n// }\n\n// @ObjectType()\n// export class KpiRadarStatsByGeoGroup extends KpiRadarStats {\n// @Field({ nullable: true })\n// geoGroup: string\n\n// // @Field()\n// // kpiName: string\n\n// // @Field(() => Float)\n// // avgScore: number\n\n// // @Field(() => Int)\n// // projectCount: number\n// }\n\n@ObjectType()\nexport class KpiComprehensiveStats {\n @Field({ nullable: true })\n kpiName: string\n\n @Field(() => Float)\n minVal: number\n\n @Field(() => Float)\n q1Val: number\n\n @Field(() => Float)\n medVal: number\n\n @Field(() => Float)\n q3Val: number\n\n @Field(() => Float)\n maxVal: number\n\n @Field(() => Float)\n avgVal: number\n\n @Field(() => Int)\n projectCount: number\n}\n\n@ObjectType()\nexport class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {\n @Field({ nullable: true })\n geoGroup?: string\n}\n\n@ObjectType()\nexport class KpiMonthlyTrend {\n @Field({ nullable: true })\n geoGroup?: string\n\n @Field()\n yearMonth: string\n\n @Field(() => Float)\n avgVal: number\n\n @Field(() => Int)\n projectCount: number\n}\n"]}
|
|
@@ -3,5 +3,6 @@ import { KpiValue, KpiValueList } from '@things-factory/kpi';
|
|
|
3
3
|
import { Project } from '@dssp/project/dist-server/service/project/project';
|
|
4
4
|
export declare class KpiValueQueryForProject {
|
|
5
5
|
kpiValues(params: ListParam, context: ResolverContext): Promise<KpiValueList>;
|
|
6
|
+
projectXKpiValues(projectId: string, context: ResolverContext): Promise<KpiValue[]>;
|
|
6
7
|
project(kpiValue: KpiValue): Promise<Project | null>;
|
|
7
8
|
}
|
|
@@ -18,6 +18,19 @@ let KpiValueQueryForProject = class KpiValueQueryForProject {
|
|
|
18
18
|
const [items, total] = await queryBuilder.getManyAndCount();
|
|
19
19
|
return { items, total };
|
|
20
20
|
}
|
|
21
|
+
async projectXKpiValues(projectId, context) {
|
|
22
|
+
const { domain } = context.state;
|
|
23
|
+
const repository = await (0, shell_1.getRepository)(kpi_1.KpiValue);
|
|
24
|
+
const kpiValues = await repository
|
|
25
|
+
.createQueryBuilder('kpiValue')
|
|
26
|
+
.leftJoinAndSelect('kpiValue.kpi', 'kpi')
|
|
27
|
+
.where('kpiValue.domain = :domain', { domain: domain.id })
|
|
28
|
+
.andWhere('kpiValue.group = :projectId', { projectId })
|
|
29
|
+
.andWhere('kpi.name LIKE :namePrefix', { namePrefix: 'X%' })
|
|
30
|
+
.orderBy('kpi.name', 'ASC')
|
|
31
|
+
.getMany();
|
|
32
|
+
return kpiValues;
|
|
33
|
+
}
|
|
21
34
|
async project(kpiValue) {
|
|
22
35
|
if (!kpiValue.group)
|
|
23
36
|
return null;
|
|
@@ -34,6 +47,15 @@ tslib_1.__decorate([
|
|
|
34
47
|
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
35
48
|
tslib_1.__metadata("design:returntype", Promise)
|
|
36
49
|
], KpiValueQueryForProject.prototype, "kpiValues", null);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
52
|
+
(0, type_graphql_1.Query)(returns => [kpi_1.KpiValue], { description: 'To fetch KpiValues by project group with X prefix kpi names' }),
|
|
53
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('projectId', type => String)),
|
|
54
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
55
|
+
tslib_1.__metadata("design:type", Function),
|
|
56
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
57
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
58
|
+
], KpiValueQueryForProject.prototype, "projectXKpiValues", null);
|
|
37
59
|
tslib_1.__decorate([
|
|
38
60
|
(0, type_graphql_1.FieldResolver)(type => project_1.Project),
|
|
39
61
|
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-value/kpi-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAqG;AACrG,iDAAuG;AAEvG,6CAAiE;AACjE,+EAA2E;AAGpE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAG5B,AAAN,KAAK,CAAC,SAAS,CAA0B,MAAiB,EAAS,OAAwB;QACzF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM;YACN,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,cAAQ,CAAC;YACzC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;SAC3C,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,QAAkB;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAChC,OAAO,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACvE,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"kpi-value-query.js","sourceRoot":"","sources":["../../../server/service/kpi-value/kpi-value-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAqG;AACrG,iDAAuG;AAEvG,6CAAiE;AACjE,+EAA2E;AAGpE,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;IAG5B,AAAN,KAAK,CAAC,SAAS,CAA0B,MAAiB,EAAS,OAAwB;QACzF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,YAAY,GAAG,IAAA,qCAA6B,EAAC;YACjD,MAAM;YACN,MAAM;YACN,UAAU,EAAE,MAAM,IAAA,qBAAa,EAAC,cAAQ,CAAC;YACzC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;SAC3C,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,CAAC,eAAe,EAAE,CAAA;QAE3D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACzB,CAAC;IAIK,AAAN,KAAK,CAAC,iBAAiB,CACa,SAAiB,EAC5C,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAa,EAAC,cAAQ,CAAC,CAAA;QAEhD,MAAM,SAAS,GAAG,MAAM,UAAU;aAC/B,kBAAkB,CAAC,UAAU,CAAC;aAC9B,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;aACxC,KAAK,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;aACzD,QAAQ,CAAC,6BAA6B,EAAE,EAAE,SAAS,EAAE,CAAC;aACtD,QAAQ,CAAC,2BAA2B,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAC3D,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;aAC1B,OAAO,EAAE,CAAA;QAEZ,OAAO,SAAS,CAAA;IAClB,CAAC;IAGK,AAAN,KAAK,CAAC,OAAO,CAAS,QAAkB;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAChC,OAAO,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACvE,CAAC;CACF,CAAA;AA7CY,0DAAuB;AAG5B;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,kBAAY,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;IAC9D,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;wDAazD;AAIK;IAFL,IAAA,wBAAS,EAAC,mGAAmG,CAAC;IAC9G,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,cAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,6DAA6D,EAAE,CAAC;IAE1G,mBAAA,IAAA,kBAAG,EAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IAChC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAgBP;AAGK;IADL,IAAA,4BAAa,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAO,CAAC;IAChB,mBAAA,IAAA,mBAAI,GAAE,CAAA;;6CAAW,cAAQ;;sDAGvC;kCA5CU,uBAAuB;IADnC,IAAA,uBAAQ,EAAC,cAAQ,CAAC;GACN,uBAAuB,CA6CnC","sourcesContent":["import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive, Float } from 'type-graphql'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Kpi, KpiValue, KpiValueList } from '@things-factory/kpi'\nimport { Project } from '@dssp/project/dist-server/service/project/project'\n\n@Resolver(KpiValue)\nexport class KpiValueQueryForProject {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => KpiValueList, { description: 'To fetch multiple KpiValues' })\n async kpiValues(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<KpiValueList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n domain,\n params,\n repository: await getRepository(KpiValue),\n searchables: ['kpi', 'group', 'valueDate']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(returns => [KpiValue], { description: 'To fetch KpiValues by project group with X prefix kpi names' })\n async projectXKpiValues(\n @Arg('projectId', type => String) projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiValue[]> {\n const { domain } = context.state\n\n const repository = await getRepository(KpiValue)\n\n const kpiValues = await repository\n .createQueryBuilder('kpiValue')\n .leftJoinAndSelect('kpiValue.kpi', 'kpi')\n .where('kpiValue.domain = :domain', { domain: domain.id })\n .andWhere('kpiValue.group = :projectId', { projectId })\n .andWhere('kpi.name LIKE :namePrefix', { namePrefix: 'X%' })\n .orderBy('kpi.name', 'ASC')\n .getMany()\n\n return kpiValues\n }\n\n @FieldResolver(type => Project)\n async project(@Root() kpiValue: KpiValue): Promise<Project | null> {\n if (!kpiValue.group) return null\n return await getRepository(Project).findOneBy({ id: kpiValue.group })\n }\n}\n"]}
|