@dssp/dkpi 1.0.0-alpha.55 → 1.0.0-alpha.56
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.js +48 -76
- package/dist-client/components/kpi-boxplot-chart.js.map +1 -1
- package/dist-client/components/kpi-radar-chart.d.ts +1 -0
- package/dist-client/components/kpi-radar-chart.js +85 -7
- package/dist-client/components/kpi-radar-chart.js.map +1 -1
- package/dist-client/components/kpi-single-boxplot-chart.js +24 -6
- package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -1
- package/dist-client/pages/sv-project-complete.js +3 -1
- package/dist-client/pages/sv-project-complete.js.map +1 -1
- package/dist-client/pages/sv-project-completed-list.d.ts +2 -2
- package/dist-client/pages/sv-project-completed-list.js +14 -14
- package/dist-client/pages/sv-project-completed-list.js.map +1 -1
- package/dist-client/pages/sv-project-detail.d.ts +8 -0
- package/dist-client/pages/sv-project-detail.js +203 -58
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/pages/sv-project-list.d.ts +7 -2
- package/dist-client/pages/sv-project-list.js +13 -13
- package/dist-client/pages/sv-project-list.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +5 -6
- package/dist-server/service/kpi-stat/kpi-stat-query.js +108 -100
- package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -1
- package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +5 -12
- package/dist-server/service/kpi-stat/kpi-stat-types.js +72 -42
- package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/schema.graphql +41 -0
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KpiComprehensiveStats, KpiComprehensiveStatsByGeoGroup } from './kpi-stat-types';
|
|
2
2
|
export declare class KpiStatQuery {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
kpiComprehensiveStats(geoGroup?: string, includeOngoing?: boolean, context?: ResolverContext): Promise<KpiRadarStats[]>;
|
|
3
|
+
totalKpiZValueComprehensiveStats(context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
4
|
+
totalKpiYValueComprehensiveStats(context?: ResolverContext): Promise<KpiComprehensiveStats[]>;
|
|
5
|
+
kpiZValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
|
|
6
|
+
kpiYValueComprehensiveStatsByGeoGroup(geoGroup?: string, context?: ResolverContext): Promise<KpiComprehensiveStatsByGeoGroup[]>;
|
|
8
7
|
}
|
|
@@ -7,126 +7,158 @@ 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
|
|
10
|
+
async totalKpiZValueComprehensiveStats(context) {
|
|
11
11
|
const { domain } = context.state;
|
|
12
12
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
13
13
|
.createQueryBuilder('kv')
|
|
14
14
|
.select([
|
|
15
|
+
'k.name as kpiName',
|
|
15
16
|
'MIN(kv.score) as minVal',
|
|
16
17
|
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
17
18
|
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
18
19
|
'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
|
|
19
|
-
'
|
|
20
|
+
'AVG(kv.score) as avgVal',
|
|
21
|
+
'MAX(kv.score) as maxVal',
|
|
22
|
+
'COUNT(DISTINCT p.id) as projectCount'
|
|
20
23
|
])
|
|
21
24
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
22
25
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
23
26
|
.where('k.name LIKE :pattern', { pattern: 'Z%' })
|
|
24
27
|
.andWhere('p.end_date IS NOT NULL')
|
|
25
|
-
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
28
|
+
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
29
|
+
.groupBy('k.name');
|
|
26
30
|
const results = await queryBuilder.getRawMany();
|
|
27
31
|
return results.map(result => {
|
|
32
|
+
const kpiName = result.kpiname;
|
|
28
33
|
const minVal = Number(result.minval);
|
|
29
34
|
const q1Val = Number(result.q1val);
|
|
30
35
|
const medVal = Number(result.medval);
|
|
31
36
|
const q3Val = Number(result.q3val);
|
|
37
|
+
const avgVal = Number(result.avgval);
|
|
32
38
|
const maxVal = Number(result.maxval);
|
|
39
|
+
const projectCount = Number(result.projectcount);
|
|
33
40
|
return {
|
|
41
|
+
kpiName: kpiName,
|
|
34
42
|
minVal: isNaN(minVal) ? 0 : minVal,
|
|
35
43
|
q1Val: isNaN(q1Val) ? 0 : q1Val,
|
|
36
44
|
medVal: isNaN(medVal) ? 0 : medVal,
|
|
37
45
|
q3Val: isNaN(q3Val) ? 0 : q3Val,
|
|
38
|
-
maxVal: isNaN(maxVal) ? 0 : maxVal
|
|
46
|
+
maxVal: isNaN(maxVal) ? 0 : maxVal,
|
|
47
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
48
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
39
49
|
};
|
|
40
50
|
});
|
|
41
51
|
}
|
|
42
|
-
async
|
|
52
|
+
async totalKpiYValueComprehensiveStats(context) {
|
|
43
53
|
const { domain } = context.state;
|
|
44
54
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
45
55
|
.createQueryBuilder('kv')
|
|
46
56
|
.select([
|
|
47
|
-
'
|
|
57
|
+
'k.name as kpiName',
|
|
48
58
|
'MIN(kv.score) as minVal',
|
|
49
59
|
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
50
60
|
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
51
61
|
'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
|
|
52
|
-
'
|
|
62
|
+
'AVG(kv.score) as avgVal',
|
|
63
|
+
'MAX(kv.score) as maxVal',
|
|
64
|
+
'COUNT(DISTINCT p.id) as projectCount'
|
|
53
65
|
])
|
|
54
66
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
55
67
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
56
|
-
.where('k.name LIKE :pattern', { pattern: '
|
|
68
|
+
.where('k.name LIKE :pattern', { pattern: 'Y%' })
|
|
57
69
|
.andWhere('p.end_date IS NOT NULL')
|
|
58
|
-
.andWhere('p.geo_group IS NOT NULL')
|
|
59
70
|
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
60
|
-
.groupBy('
|
|
61
|
-
|
|
62
|
-
queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
|
|
63
|
-
}
|
|
71
|
+
.groupBy('k.name')
|
|
72
|
+
.orderBy('k.name', 'ASC');
|
|
64
73
|
const results = await queryBuilder.getRawMany();
|
|
65
|
-
return results
|
|
66
|
-
|
|
67
|
-
const minVal = Number(result.
|
|
68
|
-
const q1Val = Number(result.
|
|
69
|
-
const medVal = Number(result.
|
|
70
|
-
const q3Val = Number(result.
|
|
71
|
-
const
|
|
74
|
+
return results.map(result => {
|
|
75
|
+
const kpiName = result.kpiname;
|
|
76
|
+
const minVal = Number(result.minval);
|
|
77
|
+
const q1Val = Number(result.q1val);
|
|
78
|
+
const medVal = Number(result.medval);
|
|
79
|
+
const q3Val = Number(result.q3val);
|
|
80
|
+
const avgVal = Number(result.avgval);
|
|
81
|
+
const maxVal = Number(result.maxval);
|
|
82
|
+
const projectCount = Number(result.projectcount);
|
|
72
83
|
return {
|
|
73
|
-
|
|
84
|
+
kpiName: kpiName,
|
|
74
85
|
minVal: isNaN(minVal) ? 0 : minVal,
|
|
75
86
|
q1Val: isNaN(q1Val) ? 0 : q1Val,
|
|
76
87
|
medVal: isNaN(medVal) ? 0 : medVal,
|
|
77
88
|
q3Val: isNaN(q3Val) ? 0 : q3Val,
|
|
78
|
-
maxVal: isNaN(maxVal) ? 0 : maxVal
|
|
89
|
+
maxVal: isNaN(maxVal) ? 0 : maxVal,
|
|
90
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
91
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
79
92
|
};
|
|
80
|
-
})
|
|
81
|
-
.filter(result => result.geoGroup !== null);
|
|
93
|
+
});
|
|
82
94
|
}
|
|
83
|
-
async
|
|
95
|
+
async kpiZValueComprehensiveStatsByGeoGroup(geoGroup, context) {
|
|
84
96
|
const { domain } = context.state;
|
|
85
97
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
86
98
|
.createQueryBuilder('kv')
|
|
87
99
|
.select([
|
|
88
100
|
'p.geo_group as geoGroup',
|
|
89
|
-
'k.name as kpiName',
|
|
90
101
|
'MIN(kv.score) as minVal',
|
|
91
102
|
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
92
103
|
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
93
104
|
'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
|
|
94
|
-
'MAX(kv.score) as maxVal'
|
|
105
|
+
'MAX(kv.score) as maxVal',
|
|
106
|
+
'AVG(kv.score) as avgVal',
|
|
107
|
+
'COUNT(DISTINCT p.id) as projectCount'
|
|
95
108
|
])
|
|
96
109
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
97
110
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
98
|
-
.where('k.name LIKE :pattern', { pattern: '
|
|
111
|
+
.where('k.name LIKE :pattern', { pattern: 'Z%' })
|
|
99
112
|
.andWhere('p.end_date IS NOT NULL')
|
|
100
113
|
.andWhere('p.geo_group IS NOT NULL')
|
|
101
114
|
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
102
|
-
.groupBy('p.geo_group
|
|
115
|
+
.groupBy('p.geo_group');
|
|
103
116
|
if (geoGroup && geoGroup.trim() !== '') {
|
|
104
117
|
queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
|
|
105
118
|
}
|
|
106
119
|
const results = await queryBuilder.getRawMany();
|
|
107
|
-
return results
|
|
108
|
-
|
|
109
|
-
kpiName
|
|
110
|
-
minVal
|
|
111
|
-
q1Val
|
|
112
|
-
medVal
|
|
113
|
-
q3Val
|
|
114
|
-
maxVal
|
|
115
|
-
|
|
120
|
+
return results
|
|
121
|
+
.map(result => {
|
|
122
|
+
const kpiName = result.kpiname;
|
|
123
|
+
const minVal = Number(result.minval);
|
|
124
|
+
const q1Val = Number(result.q1val);
|
|
125
|
+
const medVal = Number(result.medval);
|
|
126
|
+
const q3Val = Number(result.q3val);
|
|
127
|
+
const maxVal = Number(result.maxval);
|
|
128
|
+
const avgVal = Number(result.avgval);
|
|
129
|
+
const projectCount = Number(result.projectcount);
|
|
130
|
+
return {
|
|
131
|
+
kpiName: kpiName,
|
|
132
|
+
geoGroup: result.geogroup || null,
|
|
133
|
+
minVal: isNaN(minVal) ? 0 : minVal,
|
|
134
|
+
q1Val: isNaN(q1Val) ? 0 : q1Val,
|
|
135
|
+
medVal: isNaN(medVal) ? 0 : medVal,
|
|
136
|
+
q3Val: isNaN(q3Val) ? 0 : q3Val,
|
|
137
|
+
maxVal: isNaN(maxVal) ? 0 : maxVal,
|
|
138
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
139
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
140
|
+
};
|
|
141
|
+
})
|
|
142
|
+
.filter(result => result.geoGroup !== null);
|
|
116
143
|
}
|
|
117
|
-
async
|
|
144
|
+
async kpiYValueComprehensiveStatsByGeoGroup(geoGroup, context) {
|
|
118
145
|
const { domain } = context.state;
|
|
119
146
|
const queryBuilder = (0, shell_1.getRepository)('kpi_values')
|
|
120
147
|
.createQueryBuilder('kv')
|
|
121
148
|
.select([
|
|
122
149
|
'p.geo_group as geoGroup',
|
|
123
150
|
'k.name as kpiName',
|
|
124
|
-
'
|
|
151
|
+
'MIN(kv.score) as minVal',
|
|
152
|
+
'PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY kv.score) as q1Val',
|
|
153
|
+
'PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY kv.score) as medVal',
|
|
154
|
+
'PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY kv.score) as q3Val',
|
|
155
|
+
'MAX(kv.score) as maxVal',
|
|
156
|
+
'AVG(kv.score) as avgVal',
|
|
125
157
|
'COUNT(DISTINCT p.id) as projectCount'
|
|
126
158
|
])
|
|
127
159
|
.innerJoin('kpis', 'k', 'kv.kpi_id = k.id')
|
|
128
160
|
.innerJoin('projects', 'p', 'kv.kpi_org_scope_id = p.id')
|
|
129
|
-
.where('k.name LIKE :pattern', { pattern:
|
|
161
|
+
.where('k.name LIKE :pattern', { pattern: 'Y%' })
|
|
130
162
|
.andWhere('p.end_date IS NOT NULL')
|
|
131
163
|
.andWhere('p.geo_group IS NOT NULL')
|
|
132
164
|
.andWhere('kv.domain_id = :domainId', { domainId: domain.id })
|
|
@@ -135,90 +167,66 @@ let KpiStatQuery = class KpiStatQuery {
|
|
|
135
167
|
queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
|
|
136
168
|
}
|
|
137
169
|
const results = await queryBuilder.getRawMany();
|
|
138
|
-
return results
|
|
139
|
-
|
|
140
|
-
kpiName
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
if (geoGroup && geoGroup.trim() !== '') {
|
|
163
|
-
queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` });
|
|
164
|
-
}
|
|
165
|
-
queryBuilder.groupBy('p.geo_group, k.name').orderBy('p.geo_group, k.name');
|
|
166
|
-
const results = await queryBuilder.getRawMany();
|
|
167
|
-
return results.map(result => ({
|
|
168
|
-
geoGroup: result.geoGroup,
|
|
169
|
-
kpiName: result.kpiName,
|
|
170
|
-
avgScore: parseFloat(result.avgScore),
|
|
171
|
-
projectCount: parseInt(result.projectCount)
|
|
172
|
-
}));
|
|
170
|
+
return results
|
|
171
|
+
.map(result => {
|
|
172
|
+
const kpiName = result.kpiname;
|
|
173
|
+
const minVal = Number(result.minval);
|
|
174
|
+
const q1Val = Number(result.q1val);
|
|
175
|
+
const medVal = Number(result.medval);
|
|
176
|
+
const q3Val = Number(result.q3val);
|
|
177
|
+
const maxVal = Number(result.maxval);
|
|
178
|
+
const avgVal = Number(result.avgval);
|
|
179
|
+
const projectCount = Number(result.projectcount);
|
|
180
|
+
return {
|
|
181
|
+
kpiName: kpiName,
|
|
182
|
+
geoGroup: result.geogroup || null,
|
|
183
|
+
minVal: isNaN(minVal) ? 0 : minVal,
|
|
184
|
+
q1Val: isNaN(q1Val) ? 0 : q1Val,
|
|
185
|
+
medVal: isNaN(medVal) ? 0 : medVal,
|
|
186
|
+
q3Val: isNaN(q3Val) ? 0 : q3Val,
|
|
187
|
+
maxVal: isNaN(maxVal) ? 0 : maxVal,
|
|
188
|
+
avgVal: isNaN(avgVal) ? 0 : avgVal,
|
|
189
|
+
projectCount: isNaN(projectCount) ? 0 : projectCount
|
|
190
|
+
};
|
|
191
|
+
})
|
|
192
|
+
.filter(result => result.geoGroup !== null);
|
|
173
193
|
}
|
|
174
194
|
};
|
|
175
195
|
exports.KpiStatQuery = KpiStatQuery;
|
|
176
196
|
tslib_1.__decorate([
|
|
177
197
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
178
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.
|
|
198
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' }),
|
|
179
199
|
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
180
200
|
tslib_1.__metadata("design:type", Function),
|
|
181
201
|
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
182
202
|
tslib_1.__metadata("design:returntype", Promise)
|
|
183
|
-
], KpiStatQuery.prototype, "
|
|
203
|
+
], KpiStatQuery.prototype, "totalKpiZValueComprehensiveStats", null);
|
|
184
204
|
tslib_1.__decorate([
|
|
185
205
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
186
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.
|
|
187
|
-
tslib_1.__param(0, (0, type_graphql_1.
|
|
188
|
-
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
206
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStats], { description: 'Get KPI box plot statistics for Z-category KPIs for all projects' }),
|
|
207
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
189
208
|
tslib_1.__metadata("design:type", Function),
|
|
190
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
209
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
191
210
|
tslib_1.__metadata("design:returntype", Promise)
|
|
192
|
-
], KpiStatQuery.prototype, "
|
|
211
|
+
], KpiStatQuery.prototype, "totalKpiYValueComprehensiveStats", null);
|
|
193
212
|
tslib_1.__decorate([
|
|
194
213
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
195
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.
|
|
214
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' }),
|
|
196
215
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
|
|
197
216
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
198
217
|
tslib_1.__metadata("design:type", Function),
|
|
199
218
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
200
219
|
tslib_1.__metadata("design:returntype", Promise)
|
|
201
|
-
], KpiStatQuery.prototype, "
|
|
220
|
+
], KpiStatQuery.prototype, "kpiZValueComprehensiveStatsByGeoGroup", null);
|
|
202
221
|
tslib_1.__decorate([
|
|
203
222
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
204
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.
|
|
205
|
-
tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiPattern', { defaultValue: '%' })),
|
|
206
|
-
tslib_1.__param(1, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
|
|
207
|
-
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
208
|
-
tslib_1.__metadata("design:type", Function),
|
|
209
|
-
tslib_1.__metadata("design:paramtypes", [String, String, Object]),
|
|
210
|
-
tslib_1.__metadata("design:returntype", Promise)
|
|
211
|
-
], KpiStatQuery.prototype, "kpiRadarStats", null);
|
|
212
|
-
tslib_1.__decorate([
|
|
213
|
-
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "query", domainOwnerGranted: true, superUserGranted: true)'),
|
|
214
|
-
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiRadarStats], { description: 'Get comprehensive KPI statistics for all completed projects' }),
|
|
223
|
+
(0, type_graphql_1.Query)(() => [kpi_stat_types_1.KpiComprehensiveStatsByGeoGroup], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group' }),
|
|
215
224
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('geoGroup', { nullable: true })),
|
|
216
|
-
tslib_1.__param(1, (0, type_graphql_1.
|
|
217
|
-
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
225
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
218
226
|
tslib_1.__metadata("design:type", Function),
|
|
219
|
-
tslib_1.__metadata("design:paramtypes", [String,
|
|
227
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
220
228
|
tslib_1.__metadata("design:returntype", Promise)
|
|
221
|
-
], KpiStatQuery.prototype, "
|
|
229
|
+
], KpiStatQuery.prototype, "kpiYValueComprehensiveStatsByGeoGroup", null);
|
|
222
230
|
exports.KpiStatQuery = KpiStatQuery = tslib_1.__decorate([
|
|
223
231
|
(0, type_graphql_1.Resolver)(kpi_1.KpiStatistic)
|
|
224
232
|
], 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 { KpiBoxPlotStats, KpiRadarStats, KpiBoxPlotStatsByGeoGroup } from './kpi-stat-types'\n\n@Resolver(KpiStatistic)\nexport class KpiStatQuery {\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async totalKpiZValueBoxPlotStats(@Ctx() context?: ResolverContext): Promise<KpiBoxPlotStats[]> {\n const { domain } = context.state\n\n const queryBuilder = getRepository('kpi_values')\n .createQueryBuilder('kv')\n .select([\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 ])\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 const results = await queryBuilder.getRawMany()\n\n return results.map(result => {\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\n return {\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 }\n })\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStatsByGeoGroup], { description: 'Get KPI box plot statistics for Z-category KPIs by geo group' })\n async kpiZValueBoxPlotStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiBoxPlotStatsByGeoGroup[]> {\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 ])\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 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\n return {\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 }\n })\n .filter(result => result.geoGroup !== null)\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiBoxPlotStats], { description: 'Get KPI box plot statistics for Y-category KPIs by geo group and KPI name' })\n async kpiYValueBoxPlotStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiBoxPlotStats[]> {\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 ])\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.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n minVal: parseFloat(result.minVal),\n q1Val: parseFloat(result.q1Val),\n medVal: parseFloat(result.medVal),\n q3Val: parseFloat(result.q3Val),\n maxVal: parseFloat(result.maxVal)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiRadarStats], { description: 'Get KPI radar chart statistics by geo group and KPI category' })\n async kpiRadarStats(\n @Arg('kpiPattern', { defaultValue: '%' }) kpiPattern: string,\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Ctx() context?: ResolverContext\n ): Promise<KpiRadarStats[]> {\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 'AVG(kv.score) as avgScore',\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: kpiPattern })\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.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n avgScore: parseFloat(result.avgScore),\n projectCount: parseInt(result.projectCount)\n }))\n }\n\n @Directive('@privilege(category: \"kpi\", privilege: \"query\", domainOwnerGranted: true, superUserGranted: true)')\n @Query(() => [KpiRadarStats], { description: 'Get comprehensive KPI statistics for all completed projects' })\n async kpiComprehensiveStats(\n @Arg('geoGroup', { nullable: true }) geoGroup?: string,\n @Arg('includeOngoing', { defaultValue: false }) includeOngoing?: boolean,\n @Ctx() context?: ResolverContext\n ): Promise<KpiRadarStats[]> {\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 'AVG(kv.score) as avgScore',\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('kv.domain_id = :domainId', { domainId: domain.id })\n .andWhere('p.geo_group IS NOT NULL')\n\n if (!includeOngoing) {\n queryBuilder.andWhere('p.end_date IS NOT NULL')\n }\n\n if (geoGroup && geoGroup.trim() !== '') {\n queryBuilder.andWhere('p.geo_group LIKE :geoGroup', { geoGroup: `%${geoGroup}%` })\n }\n\n queryBuilder.groupBy('p.geo_group, k.name').orderBy('p.geo_group, k.name')\n\n const results = await queryBuilder.getRawMany()\n return results.map(result => ({\n geoGroup: result.geoGroup,\n kpiName: result.kpiName,\n avgScore: parseFloat(result.avgScore),\n projectCount: parseInt(result.projectCount)\n }))\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 } 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,20 +1,13 @@
|
|
|
1
|
-
export declare class
|
|
2
|
-
kpiName
|
|
1
|
+
export declare class KpiComprehensiveStats {
|
|
2
|
+
kpiName: string;
|
|
3
3
|
minVal: number;
|
|
4
4
|
q1Val: number;
|
|
5
5
|
medVal: number;
|
|
6
6
|
q3Val: number;
|
|
7
7
|
maxVal: number;
|
|
8
|
-
|
|
9
|
-
export declare class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
|
|
10
|
-
geoGroup: string;
|
|
11
|
-
}
|
|
12
|
-
export declare class KpiRadarStats {
|
|
13
|
-
geoGroup: string;
|
|
14
|
-
kpiName: string;
|
|
15
|
-
avgScore: number;
|
|
8
|
+
avgVal: number;
|
|
16
9
|
projectCount: number;
|
|
17
10
|
}
|
|
18
|
-
export declare class
|
|
19
|
-
geoGroup
|
|
11
|
+
export declare class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {
|
|
12
|
+
geoGroup?: string;
|
|
20
13
|
}
|
|
@@ -1,78 +1,108 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
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()
|
|
7
|
+
// export class KpiBoxPlotStats {
|
|
8
|
+
// @Field({ nullable: true })
|
|
9
|
+
// kpiName?: string
|
|
10
|
+
// @Field(() => Float)
|
|
11
|
+
// minVal: number
|
|
12
|
+
// @Field(() => Float)
|
|
13
|
+
// q1Val: number
|
|
14
|
+
// @Field(() => Float)
|
|
15
|
+
// medVal: number
|
|
16
|
+
// @Field(() => Float)
|
|
17
|
+
// q3Val: number
|
|
18
|
+
// @Field(() => Float)
|
|
19
|
+
// maxVal: number
|
|
20
|
+
// }
|
|
21
|
+
// @ObjectType()
|
|
22
|
+
// export class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
|
|
23
|
+
// @Field({ nullable: true })
|
|
24
|
+
// geoGroup: string
|
|
25
|
+
// // @Field({ nullable: true })
|
|
26
|
+
// // kpiName?: string
|
|
27
|
+
// // @Field(() => Float)
|
|
28
|
+
// // minVal: number
|
|
29
|
+
// // @Field(() => Float)
|
|
30
|
+
// // q1Val: number
|
|
31
|
+
// // @Field(() => Float)
|
|
32
|
+
// // medVal: number
|
|
33
|
+
// // @Field(() => Float)
|
|
34
|
+
// // q3Val: number
|
|
35
|
+
// // @Field(() => Float)
|
|
36
|
+
// // maxVal: number
|
|
37
|
+
// }
|
|
38
|
+
// @ObjectType()
|
|
39
|
+
// export class KpiRadarStats {
|
|
40
|
+
// @Field({ nullable: true })
|
|
41
|
+
// geoGroup: string
|
|
42
|
+
// @Field()
|
|
43
|
+
// kpiName: string
|
|
44
|
+
// @Field(() => Float)
|
|
45
|
+
// avgScore: number
|
|
46
|
+
// @Field(() => Int)
|
|
47
|
+
// projectCount: number
|
|
48
|
+
// }
|
|
49
|
+
// @ObjectType()
|
|
50
|
+
// export class KpiRadarStatsByGeoGroup extends KpiRadarStats {
|
|
51
|
+
// @Field({ nullable: true })
|
|
52
|
+
// geoGroup: string
|
|
53
|
+
// // @Field()
|
|
54
|
+
// // kpiName: string
|
|
55
|
+
// // @Field(() => Float)
|
|
56
|
+
// // avgScore: number
|
|
57
|
+
// // @Field(() => Int)
|
|
58
|
+
// // projectCount: number
|
|
59
|
+
// }
|
|
60
|
+
let KpiComprehensiveStats = class KpiComprehensiveStats {
|
|
7
61
|
};
|
|
8
|
-
exports.
|
|
62
|
+
exports.KpiComprehensiveStats = KpiComprehensiveStats;
|
|
9
63
|
tslib_1.__decorate([
|
|
10
64
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
11
65
|
tslib_1.__metadata("design:type", String)
|
|
12
|
-
],
|
|
66
|
+
], KpiComprehensiveStats.prototype, "kpiName", void 0);
|
|
13
67
|
tslib_1.__decorate([
|
|
14
68
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
15
69
|
tslib_1.__metadata("design:type", Number)
|
|
16
|
-
],
|
|
70
|
+
], KpiComprehensiveStats.prototype, "minVal", void 0);
|
|
17
71
|
tslib_1.__decorate([
|
|
18
72
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
19
73
|
tslib_1.__metadata("design:type", Number)
|
|
20
|
-
],
|
|
74
|
+
], KpiComprehensiveStats.prototype, "q1Val", void 0);
|
|
21
75
|
tslib_1.__decorate([
|
|
22
76
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
23
77
|
tslib_1.__metadata("design:type", Number)
|
|
24
|
-
],
|
|
78
|
+
], KpiComprehensiveStats.prototype, "medVal", void 0);
|
|
25
79
|
tslib_1.__decorate([
|
|
26
80
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
27
81
|
tslib_1.__metadata("design:type", Number)
|
|
28
|
-
],
|
|
82
|
+
], KpiComprehensiveStats.prototype, "q3Val", void 0);
|
|
29
83
|
tslib_1.__decorate([
|
|
30
84
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
31
85
|
tslib_1.__metadata("design:type", Number)
|
|
32
|
-
],
|
|
33
|
-
exports.KpiBoxPlotStats = KpiBoxPlotStats = tslib_1.__decorate([
|
|
34
|
-
(0, type_graphql_1.ObjectType)()
|
|
35
|
-
], KpiBoxPlotStats);
|
|
36
|
-
let KpiBoxPlotStatsByGeoGroup = class KpiBoxPlotStatsByGeoGroup extends KpiBoxPlotStats {
|
|
37
|
-
};
|
|
38
|
-
exports.KpiBoxPlotStatsByGeoGroup = KpiBoxPlotStatsByGeoGroup;
|
|
39
|
-
tslib_1.__decorate([
|
|
40
|
-
(0, type_graphql_1.Field)({ nullable: true }),
|
|
41
|
-
tslib_1.__metadata("design:type", String)
|
|
42
|
-
], KpiBoxPlotStatsByGeoGroup.prototype, "geoGroup", void 0);
|
|
43
|
-
exports.KpiBoxPlotStatsByGeoGroup = KpiBoxPlotStatsByGeoGroup = tslib_1.__decorate([
|
|
44
|
-
(0, type_graphql_1.ObjectType)()
|
|
45
|
-
], KpiBoxPlotStatsByGeoGroup);
|
|
46
|
-
let KpiRadarStats = class KpiRadarStats {
|
|
47
|
-
};
|
|
48
|
-
exports.KpiRadarStats = KpiRadarStats;
|
|
49
|
-
tslib_1.__decorate([
|
|
50
|
-
(0, type_graphql_1.Field)({ nullable: true }),
|
|
51
|
-
tslib_1.__metadata("design:type", String)
|
|
52
|
-
], KpiRadarStats.prototype, "geoGroup", void 0);
|
|
53
|
-
tslib_1.__decorate([
|
|
54
|
-
(0, type_graphql_1.Field)(),
|
|
55
|
-
tslib_1.__metadata("design:type", String)
|
|
56
|
-
], KpiRadarStats.prototype, "kpiName", void 0);
|
|
86
|
+
], KpiComprehensiveStats.prototype, "maxVal", void 0);
|
|
57
87
|
tslib_1.__decorate([
|
|
58
88
|
(0, type_graphql_1.Field)(() => type_graphql_1.Float),
|
|
59
89
|
tslib_1.__metadata("design:type", Number)
|
|
60
|
-
],
|
|
90
|
+
], KpiComprehensiveStats.prototype, "avgVal", void 0);
|
|
61
91
|
tslib_1.__decorate([
|
|
62
92
|
(0, type_graphql_1.Field)(() => type_graphql_1.Int),
|
|
63
93
|
tslib_1.__metadata("design:type", Number)
|
|
64
|
-
],
|
|
65
|
-
exports.
|
|
94
|
+
], KpiComprehensiveStats.prototype, "projectCount", void 0);
|
|
95
|
+
exports.KpiComprehensiveStats = KpiComprehensiveStats = tslib_1.__decorate([
|
|
66
96
|
(0, type_graphql_1.ObjectType)()
|
|
67
|
-
],
|
|
68
|
-
let
|
|
97
|
+
], KpiComprehensiveStats);
|
|
98
|
+
let KpiComprehensiveStatsByGeoGroup = class KpiComprehensiveStatsByGeoGroup extends KpiComprehensiveStats {
|
|
69
99
|
};
|
|
70
|
-
exports.
|
|
100
|
+
exports.KpiComprehensiveStatsByGeoGroup = KpiComprehensiveStatsByGeoGroup;
|
|
71
101
|
tslib_1.__decorate([
|
|
72
102
|
(0, type_graphql_1.Field)({ nullable: true }),
|
|
73
103
|
tslib_1.__metadata("design:type", String)
|
|
74
|
-
],
|
|
75
|
-
exports.
|
|
104
|
+
], KpiComprehensiveStatsByGeoGroup.prototype, "geoGroup", void 0);
|
|
105
|
+
exports.KpiComprehensiveStatsByGeoGroup = KpiComprehensiveStatsByGeoGroup = tslib_1.__decorate([
|
|
76
106
|
(0, type_graphql_1.ObjectType)()
|
|
77
|
-
],
|
|
107
|
+
], KpiComprehensiveStatsByGeoGroup);
|
|
78
108
|
//# sourceMappingURL=kpi-stat-types.js.map
|