@things-factory/kpi 9.0.22 → 9.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/client/pages/kpi/kpi-list-page.ts +180 -22
- package/client/pages/kpi-category/kpi-category-list-page.ts +76 -3
- package/client/pages/kpi-category/kpi-category-value-calculator.ts +233 -0
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +13 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +43 -1
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +3 -13
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.ts +13 -1
- package/client/pages/kpi-value/kpi-value-list-page.ts +45 -1
- package/dist-client/pages/kpi/kpi-list-page.d.ts +2 -1
- package/dist-client/pages/kpi/kpi-list-page.js +180 -22
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +3 -0
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +71 -3
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +13 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +256 -0
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +1 -0
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +13 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +4 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +39 -2
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +3 -13
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +13 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +1 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +45 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/calculator/evaluator.d.ts +8 -0
- package/dist-server/calculator/evaluator.js +42 -0
- package/dist-server/calculator/evaluator.js.map +1 -0
- package/dist-server/calculator/functions.d.ts +3 -0
- package/dist-server/calculator/functions.js +62 -0
- package/dist-server/calculator/functions.js.map +1 -0
- package/dist-server/calculator/index.d.ts +4 -0
- package/dist-server/calculator/index.js +8 -0
- package/dist-server/calculator/index.js.map +1 -0
- package/dist-server/calculator/parser.d.ts +21 -0
- package/dist-server/calculator/parser.js +121 -0
- package/dist-server/calculator/parser.js.map +1 -0
- package/dist-server/calculator/provider.d.ts +8 -0
- package/dist-server/calculator/provider.js +13 -0
- package/dist-server/calculator/provider.js.map +1 -0
- package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-metric-value-provider.js +63 -0
- package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
- package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
- package/dist-server/controllers/kpi-value-provider.js +46 -0
- package/dist-server/controllers/kpi-value-provider.js.map +1 -0
- package/dist-server/service/index.d.ts +2 -2
- package/dist-server/service/kpi/aggregate-kpi.js +4 -4
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
- package/dist-server/service/kpi/kpi-grade.types.d.ts +11 -10
- package/dist-server/service/kpi/kpi-grade.types.js.map +1 -1
- package/dist-server/service/kpi/kpi-history.d.ts +2 -2
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
- package/dist-server/service/kpi/kpi-mutation.js +126 -4
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +8 -5
- package/dist-server/service/kpi/kpi-type.js +22 -8
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +6 -3
- package/dist-server/service/kpi/kpi.js +29 -9
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.js +3 -3
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-query.d.ts +13 -0
- package/dist-server/service/kpi-category/kpi-category-query.js +180 -0
- package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -0
- package/dist-server/service/kpi-category/kpi-category-type.js +16 -1
- package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +2 -0
- package/dist-server/service/kpi-category/kpi-category.js +10 -1
- package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js +5 -3
- package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric.d.ts +2 -8
- package/dist-server/service/kpi-metric/kpi-metric.js +3 -14
- package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +67 -45
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -2
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +2 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +114 -6
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.d.ts +0 -2
- package/dist-server/service/kpi-value/kpi-value-query.js +0 -12
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +26 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js +97 -0
- package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +2 -0
- package/dist-server/service/kpi-value/kpi-value-type.js +14 -0
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +1 -0
- package/dist-server/service/kpi-value/kpi-value.js +9 -1
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/service/utils/value-date-util.d.ts +3 -0
- package/dist-server/service/utils/value-date-util.js +76 -0
- package/dist-server/service/utils/value-date-util.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/server/calculator/evaluator.ts +45 -0
- package/server/calculator/functions.ts +67 -0
- package/server/calculator/index.ts +4 -0
- package/server/calculator/parser.ts +128 -0
- package/server/calculator/provider.ts +10 -0
- package/server/controllers/kpi-metric-value-provider.ts +66 -0
- package/server/controllers/kpi-value-provider.ts +51 -0
- package/server/service/kpi/aggregate-kpi.ts +4 -4
- package/server/service/kpi/kpi-grade.types.ts +11 -10
- package/server/service/kpi/kpi-history.ts +2 -2
- package/server/service/kpi/kpi-mutation.ts +128 -4
- package/server/service/kpi/kpi-type.ts +21 -9
- package/server/service/kpi/kpi.ts +32 -10
- package/server/service/kpi-category/kpi-category-mutation.ts +3 -3
- package/server/service/kpi-category/kpi-category-query.ts +175 -1
- package/server/service/kpi-category/kpi-category-type.ts +17 -6
- package/server/service/kpi-category/kpi-category.ts +10 -1
- package/server/service/kpi-metric/kpi-metric-type.ts +7 -5
- package/server/service/kpi-metric/kpi-metric.ts +3 -15
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +67 -47
- package/server/service/kpi-metric-value/kpi-metric-value.ts +4 -2
- package/server/service/kpi-value/kpi-value-mutation.ts +110 -6
- package/server/service/kpi-value/kpi-value-query.ts +2 -8
- package/server/service/kpi-value/kpi-value-score.service.ts +112 -0
- package/server/service/kpi-value/kpi-value-type.ts +12 -0
- package/server/service/kpi-value/kpi-value.ts +8 -1
- package/server/service/utils/value-date-util.ts +72 -0
- package/dist-server/service/kpi-value/kpi-value-grade.service.d.ts +0 -34
- package/dist-server/service/kpi-value/kpi-value-grade.service.js +0 -117
- package/dist-server/service/kpi-value/kpi-value-grade.service.js.map +0 -1
- package/server/service/kpi-value/kpi-value-grade.service.ts +0 -127
|
@@ -3,6 +3,7 @@ import '@material/web/button/elevated-button.js'
|
|
|
3
3
|
import '@operato/data-grist/ox-grist.js'
|
|
4
4
|
import '@operato/data-grist/ox-filters-form.js'
|
|
5
5
|
import '@operato/data-grist/ox-record-creator.js'
|
|
6
|
+
import './kpi-metric-value-manual-entry-form.js'
|
|
6
7
|
|
|
7
8
|
import { CommonButtonStyles, CommonHeaderStyles, CommonGristStyles, ScrollbarStyles } from '@operato/styles'
|
|
8
9
|
import { PageView, store } from '@operato/shell'
|
|
@@ -113,6 +114,18 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
|
|
|
113
114
|
columns: [
|
|
114
115
|
{ type: 'gutter', gutterName: 'sequence' },
|
|
115
116
|
{ type: 'gutter', gutterName: 'row-selector', multiple: true },
|
|
117
|
+
// KPI Metric Value 수정 버튼 추가
|
|
118
|
+
{
|
|
119
|
+
type: 'gutter',
|
|
120
|
+
gutterName: 'button',
|
|
121
|
+
icon: 'edit',
|
|
122
|
+
title: '수정',
|
|
123
|
+
handlers: {
|
|
124
|
+
click: (columns, data, column, record, rowIndex) => {
|
|
125
|
+
this._editKpiMetricValue(record)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
},
|
|
116
129
|
{
|
|
117
130
|
type: 'string',
|
|
118
131
|
name: 'metric',
|
|
@@ -120,7 +133,7 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
|
|
|
120
133
|
record: { editable: false, renderer: (v, c, r) => r.metric?.name },
|
|
121
134
|
width: 150
|
|
122
135
|
},
|
|
123
|
-
{ type: '
|
|
136
|
+
{ type: 'string', name: 'valueDate', header: '날짜', record: { editable: true }, width: 120 },
|
|
124
137
|
{ type: 'number', name: 'value', header: '값', record: { editable: true }, width: 120 },
|
|
125
138
|
{ type: 'string', name: 'group', header: '그룹', record: { editable: false }, width: 120 },
|
|
126
139
|
{ type: 'object', name: 'meta', header: '메타', record: { editable: false }, width: 120 },
|
|
@@ -151,6 +164,12 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
|
|
|
151
164
|
}
|
|
152
165
|
}
|
|
153
166
|
|
|
167
|
+
pageUpdated(changes: any, lifecycle: any) {
|
|
168
|
+
if (this.active) {
|
|
169
|
+
this.grist.fetch()
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
154
173
|
async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }: FetchOption) {
|
|
155
174
|
const response = await client.query({
|
|
156
175
|
query: gql`
|
|
@@ -296,4 +315,27 @@ export class KpiMetricValueListPage extends connect(store)(localize(i18next)(Sco
|
|
|
296
315
|
async importHandler(records) {
|
|
297
316
|
// 임포트 팝업 등은 추후 구현
|
|
298
317
|
}
|
|
318
|
+
|
|
319
|
+
async _editKpiMetricValue(metricValue) {
|
|
320
|
+
const popup = await openPopup(
|
|
321
|
+
html`
|
|
322
|
+
<kpi-metric-value-manual-entry-form
|
|
323
|
+
.metric=${metricValue.metric}
|
|
324
|
+
.valueDate=${metricValue.valueDate}
|
|
325
|
+
.value=${metricValue.value}
|
|
326
|
+
.group=${metricValue.group}
|
|
327
|
+
.meta=${metricValue.meta ? JSON.stringify(metricValue.meta) : ''}
|
|
328
|
+
@saved=${() => {
|
|
329
|
+
this.grist.fetch()
|
|
330
|
+
popup.close()
|
|
331
|
+
}}
|
|
332
|
+
></kpi-metric-value-manual-entry-form>
|
|
333
|
+
`,
|
|
334
|
+
{
|
|
335
|
+
title: `${metricValue.metric?.name || ''} 값 수정`,
|
|
336
|
+
size: 'medium',
|
|
337
|
+
backdrop: true
|
|
338
|
+
}
|
|
339
|
+
)
|
|
340
|
+
}
|
|
299
341
|
}
|
|
@@ -111,24 +111,14 @@ export class KpiMetricValueManualEntryForm extends LitElement {
|
|
|
111
111
|
try {
|
|
112
112
|
await client.mutate({
|
|
113
113
|
mutation: gql`
|
|
114
|
-
mutation ($
|
|
115
|
-
|
|
116
|
-
metricValue: {
|
|
117
|
-
metricId: $metricId
|
|
118
|
-
valueDate: $valueDate
|
|
119
|
-
value: $value
|
|
120
|
-
group: $group
|
|
121
|
-
meta: $meta
|
|
122
|
-
periodType: DAY
|
|
123
|
-
}
|
|
124
|
-
) {
|
|
114
|
+
mutation ($metricName: String!, $value: Float!, $group: String, $meta: Object) {
|
|
115
|
+
recordKpiMetricValue(metricName: $metricName, value: $value, meta: $meta, group: $group) {
|
|
125
116
|
id
|
|
126
117
|
}
|
|
127
118
|
}
|
|
128
119
|
`,
|
|
129
120
|
variables: {
|
|
130
|
-
|
|
131
|
-
valueDate: this.valueDate,
|
|
121
|
+
metricName: this.metric.name,
|
|
132
122
|
value: parseFloat(this.value),
|
|
133
123
|
group: this.group || undefined,
|
|
134
124
|
meta: parsedMeta
|
|
@@ -99,7 +99,19 @@ export class KpiMetricValueManualEntryPage extends connect(store)(localize(i18ne
|
|
|
99
99
|
type: 'select',
|
|
100
100
|
name: 'periodType',
|
|
101
101
|
header: '주기',
|
|
102
|
-
record: {
|
|
102
|
+
record: {
|
|
103
|
+
editable: true,
|
|
104
|
+
options: [
|
|
105
|
+
{ value: '', display: '' },
|
|
106
|
+
{ value: 'DAY', display: '일' },
|
|
107
|
+
{ value: 'WEEK', display: '주' },
|
|
108
|
+
{ value: 'MONTH', display: '월' },
|
|
109
|
+
{ value: 'QUARTER', display: '분기' },
|
|
110
|
+
{ value: 'YEAR', display: '년' },
|
|
111
|
+
{ value: 'RANGE', display: '범위' },
|
|
112
|
+
{ value: 'ALLTIME', display: '전체' }
|
|
113
|
+
]
|
|
114
|
+
},
|
|
103
115
|
width: 80
|
|
104
116
|
},
|
|
105
117
|
{
|
|
@@ -130,6 +130,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
130
130
|
'version',
|
|
131
131
|
'valueDate',
|
|
132
132
|
'value',
|
|
133
|
+
'score',
|
|
133
134
|
'group',
|
|
134
135
|
'inputType',
|
|
135
136
|
'source',
|
|
@@ -144,6 +145,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
144
145
|
'version',
|
|
145
146
|
'valueDate',
|
|
146
147
|
'value',
|
|
148
|
+
'score',
|
|
147
149
|
'group',
|
|
148
150
|
'inputType',
|
|
149
151
|
'source',
|
|
@@ -157,6 +159,18 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
157
159
|
columns: [
|
|
158
160
|
{ type: 'gutter', gutterName: 'sequence' },
|
|
159
161
|
{ type: 'gutter', gutterName: 'row-selector', multiple: true },
|
|
162
|
+
// KPI Value 재계산 버튼 추가
|
|
163
|
+
{
|
|
164
|
+
type: 'gutter',
|
|
165
|
+
gutterName: 'button',
|
|
166
|
+
icon: 'refresh',
|
|
167
|
+
title: '재계산',
|
|
168
|
+
handlers: {
|
|
169
|
+
click: (columns, data, column, record, rowIndex) => {
|
|
170
|
+
this._recalculateKpiValue(record)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
160
174
|
{
|
|
161
175
|
type: 'string',
|
|
162
176
|
name: 'kpi',
|
|
@@ -165,8 +179,9 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
165
179
|
width: 150
|
|
166
180
|
},
|
|
167
181
|
{ type: 'number', name: 'version', header: '버전', record: { editable: false }, width: 80 },
|
|
168
|
-
{ type: '
|
|
182
|
+
{ type: 'string', name: 'valueDate', header: '실적일', record: { editable: true }, width: 120 },
|
|
169
183
|
{ type: 'number', name: 'value', header: '실적값', record: { editable: true }, width: 120 },
|
|
184
|
+
{ type: 'number', name: 'score', header: '성과점수', record: { editable: false }, width: 120 },
|
|
170
185
|
{ type: 'string', name: 'group', header: '그룹', record: { editable: false }, width: 120 },
|
|
171
186
|
{ type: 'string', name: 'inputType', header: '입력방식', record: { editable: false }, width: 100 },
|
|
172
187
|
{ type: 'string', name: 'source', header: '수집출처', record: { editable: false }, width: 120 },
|
|
@@ -218,6 +233,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
218
233
|
version
|
|
219
234
|
valueDate
|
|
220
235
|
value
|
|
236
|
+
score
|
|
221
237
|
inputType
|
|
222
238
|
source
|
|
223
239
|
meta
|
|
@@ -308,6 +324,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
308
324
|
version
|
|
309
325
|
valueDate
|
|
310
326
|
value
|
|
327
|
+
score
|
|
311
328
|
}
|
|
312
329
|
}
|
|
313
330
|
`,
|
|
@@ -322,6 +339,33 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
|
|
|
322
339
|
}
|
|
323
340
|
}
|
|
324
341
|
|
|
342
|
+
async _recalculateKpiValue(kpiValue) {
|
|
343
|
+
try {
|
|
344
|
+
const response = await client.mutate({
|
|
345
|
+
mutation: gql`
|
|
346
|
+
mutation ($id: String!) {
|
|
347
|
+
recalculateKpiValue(id: $id) {
|
|
348
|
+
id
|
|
349
|
+
value
|
|
350
|
+
score
|
|
351
|
+
valueDate
|
|
352
|
+
group
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
`,
|
|
356
|
+
variables: {
|
|
357
|
+
id: kpiValue.id
|
|
358
|
+
}
|
|
359
|
+
})
|
|
360
|
+
if (!response.errors) {
|
|
361
|
+
notify({ message: 'KPI Value가 성공적으로 재계산되었습니다.' })
|
|
362
|
+
this.grist.fetch()
|
|
363
|
+
}
|
|
364
|
+
} catch (error) {
|
|
365
|
+
notify({ message: 'KPI Value 재계산 중 오류가 발생했습니다.' })
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
325
369
|
async creationCallback(kpiValue) {
|
|
326
370
|
try {
|
|
327
371
|
const response = await client.query({
|
|
@@ -29,7 +29,7 @@ export declare class KpiListPage extends KpiListPage_base {
|
|
|
29
29
|
private grist;
|
|
30
30
|
availableVariables: any[];
|
|
31
31
|
availableVariablesLoaded: boolean;
|
|
32
|
-
|
|
32
|
+
getAvailableKpiMetricVariables(): Promise<any[]>;
|
|
33
33
|
get context(): {
|
|
34
34
|
title: string;
|
|
35
35
|
search: {
|
|
@@ -76,5 +76,6 @@ export declare class KpiListPage extends KpiListPage_base {
|
|
|
76
76
|
_editGrades(kpi: any): Promise<void>;
|
|
77
77
|
_editViz(kpi: any): Promise<void>;
|
|
78
78
|
_onVizUpdated(kpiId: string, vizType: string, vizMeta: any): Promise<void>;
|
|
79
|
+
_calculateKpiValue(kpi: any): Promise<void>;
|
|
79
80
|
}
|
|
80
81
|
export {};
|
|
@@ -60,7 +60,7 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
60
60
|
'kpi-viz-editor': KpiVizEditor
|
|
61
61
|
};
|
|
62
62
|
}
|
|
63
|
-
async
|
|
63
|
+
async getAvailableKpiMetricVariables() {
|
|
64
64
|
if (this.availableVariablesLoaded) {
|
|
65
65
|
return this.availableVariables;
|
|
66
66
|
}
|
|
@@ -153,24 +153,7 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
153
153
|
async pageInitialized(lifecycle) {
|
|
154
154
|
this.gristConfig = {
|
|
155
155
|
list: {
|
|
156
|
-
fields: [
|
|
157
|
-
'name',
|
|
158
|
-
'description',
|
|
159
|
-
'category',
|
|
160
|
-
'formula',
|
|
161
|
-
'active',
|
|
162
|
-
'state',
|
|
163
|
-
'vizType',
|
|
164
|
-
'schedule',
|
|
165
|
-
'scheduleId',
|
|
166
|
-
'timezone',
|
|
167
|
-
'version',
|
|
168
|
-
'createdAt',
|
|
169
|
-
'updatedAt',
|
|
170
|
-
'creator',
|
|
171
|
-
'updater',
|
|
172
|
-
'thumbnail'
|
|
173
|
-
],
|
|
156
|
+
fields: ['name', 'description'],
|
|
174
157
|
details: [
|
|
175
158
|
'name',
|
|
176
159
|
'description',
|
|
@@ -193,6 +176,18 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
193
176
|
columns: [
|
|
194
177
|
{ type: 'gutter', gutterName: 'sequence' },
|
|
195
178
|
{ type: 'gutter', gutterName: 'row-selector', multiple: true },
|
|
179
|
+
// KPI 실적값 계산 버튼 추가
|
|
180
|
+
{
|
|
181
|
+
type: 'gutter',
|
|
182
|
+
gutterName: 'button',
|
|
183
|
+
icon: 'calculate',
|
|
184
|
+
title: '실적값 계산',
|
|
185
|
+
handlers: {
|
|
186
|
+
click: (columns, data, column, record, rowIndex) => {
|
|
187
|
+
this._calculateKpiValue(record);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
},
|
|
196
191
|
{
|
|
197
192
|
type: 'string',
|
|
198
193
|
name: 'name',
|
|
@@ -231,15 +226,150 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
231
226
|
record: {
|
|
232
227
|
editable: true,
|
|
233
228
|
availableVariables: async () => {
|
|
234
|
-
return await this.
|
|
229
|
+
return await this.getAvailableKpiMetricVariables();
|
|
235
230
|
}
|
|
236
231
|
},
|
|
237
232
|
width: 320
|
|
238
233
|
},
|
|
234
|
+
{
|
|
235
|
+
type: 'select',
|
|
236
|
+
name: 'periodType',
|
|
237
|
+
header: '계산주기',
|
|
238
|
+
record: {
|
|
239
|
+
editable: true,
|
|
240
|
+
options: [
|
|
241
|
+
{ value: '', display: '' },
|
|
242
|
+
{ value: 'DAY', display: '일' },
|
|
243
|
+
{ value: 'WEEK', display: '주' },
|
|
244
|
+
{ value: 'MONTH', display: '월' },
|
|
245
|
+
{ value: 'QUARTER', display: '분기' },
|
|
246
|
+
{ value: 'YEAR', display: '년' },
|
|
247
|
+
{ value: 'RANGE', display: '범위' },
|
|
248
|
+
{ value: 'ALLTIME', display: '전체' }
|
|
249
|
+
]
|
|
250
|
+
},
|
|
251
|
+
width: 80
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: 'formula',
|
|
255
|
+
name: 'scoreFormula',
|
|
256
|
+
header: '성과점수수식',
|
|
257
|
+
record: {
|
|
258
|
+
editable: true,
|
|
259
|
+
availableVariables: async () => {
|
|
260
|
+
return [
|
|
261
|
+
{
|
|
262
|
+
name: 'value',
|
|
263
|
+
description: 'KPI 실적값',
|
|
264
|
+
type: 'kpi-value',
|
|
265
|
+
unit: ''
|
|
266
|
+
}
|
|
267
|
+
];
|
|
268
|
+
},
|
|
269
|
+
includeDefaultFunctions: false,
|
|
270
|
+
availableFunctions: [
|
|
271
|
+
{
|
|
272
|
+
name: 'INTEGRATE()',
|
|
273
|
+
description: '수치 적분',
|
|
274
|
+
template: 'INTEGRATE({func}, {a}, {b}, {n})',
|
|
275
|
+
syntax: 'INTEGRATE(func, a, b, n)',
|
|
276
|
+
parameters: ['func - 적분할 함수', 'a - 하한값', 'b - 상한값', 'n - 분할 수 (기본값: 1000)'],
|
|
277
|
+
returnType: 'number',
|
|
278
|
+
help: '사다리꼴 적분법을 사용하여 수치 적분을 계산합니다.',
|
|
279
|
+
examples: ['INTEGRATE(x => x*x, 0, 1, 1000)', 'INTEGRATE([효율성], 0, 1)']
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: 'BETA_FUNCTION()',
|
|
283
|
+
description: '베타 함수',
|
|
284
|
+
template: 'BETA_FUNCTION({x}, {alpha}, {beta})',
|
|
285
|
+
syntax: 'BETA_FUNCTION(x, alpha, beta)',
|
|
286
|
+
parameters: ['x - 변수 (0 ≤ x ≤ 1)', 'alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
|
|
287
|
+
returnType: 'number',
|
|
288
|
+
help: '베타 분포 함수를 계산합니다. t^(α-1) × (1-t)^(β-1)',
|
|
289
|
+
examples: ['BETA_FUNCTION(0.5, 2, 3)', 'BETA_FUNCTION([품질지수], 3, 2)']
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
name: 'INCOMPLETE_BETA()',
|
|
293
|
+
description: '불완전 베타 함수',
|
|
294
|
+
template: 'INCOMPLETE_BETA({x}, {alpha}, {beta})',
|
|
295
|
+
syntax: 'INCOMPLETE_BETA(x, alpha, beta)',
|
|
296
|
+
parameters: ['x - 상한값 (0 ≤ x ≤ 1)', 'alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
|
|
297
|
+
returnType: 'number',
|
|
298
|
+
help: '불완전 베타 함수를 수치 적분으로 계산합니다.',
|
|
299
|
+
examples: ['INCOMPLETE_BETA(0.7, 2, 3)', 'INCOMPLETE_BETA([목표달성률]/100, 2, 3)']
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
name: 'COMPLETE_BETA()',
|
|
303
|
+
description: '완전 베타 함수',
|
|
304
|
+
template: 'COMPLETE_BETA({alpha}, {beta})',
|
|
305
|
+
syntax: 'COMPLETE_BETA(alpha, beta)',
|
|
306
|
+
parameters: ['alpha - 첫 번째 모수', 'beta - 두 번째 모수'],
|
|
307
|
+
returnType: 'number',
|
|
308
|
+
help: '완전 베타 함수 B(α,β)를 계산합니다.',
|
|
309
|
+
examples: ['COMPLETE_BETA(2, 3)', 'COMPLETE_BETA(3, 2)']
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
name: 'PERFORMANCE_INDEX()',
|
|
313
|
+
description: '성과 지수',
|
|
314
|
+
template: 'PERFORMANCE_INDEX({x}, {alpha1}, {beta1}, {alpha2}, {beta2})',
|
|
315
|
+
syntax: 'PERFORMANCE_INDEX(x, alpha1, beta1, alpha2, beta2)',
|
|
316
|
+
parameters: [
|
|
317
|
+
'x - 성과 값 (0 ≤ x ≤ 1)',
|
|
318
|
+
'alpha1, beta1 - 분자 베타 함수 모수',
|
|
319
|
+
'alpha2, beta2 - 분모 베타 함수 모수'
|
|
320
|
+
],
|
|
321
|
+
returnType: 'number',
|
|
322
|
+
help: '성과 지수를 계산합니다: 1 - (불완전 베타 / 완전 베타)',
|
|
323
|
+
examples: ['PERFORMANCE_INDEX(0.8, 2, 3, 2, 3)', 'PERFORMANCE_INDEX([성과점수]/100, 2, 3, 2, 3)']
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
name: 'EXP()',
|
|
327
|
+
description: '지수 함수',
|
|
328
|
+
template: 'EXP({x})',
|
|
329
|
+
syntax: 'EXP(x)',
|
|
330
|
+
parameters: ['x - 지수'],
|
|
331
|
+
returnType: 'number',
|
|
332
|
+
help: '자연상수 e의 x제곱을 계산합니다.',
|
|
333
|
+
examples: ['EXP(1)', 'EXP([효율성])']
|
|
334
|
+
},
|
|
335
|
+
{
|
|
336
|
+
name: 'LOG()',
|
|
337
|
+
description: '자연 로그',
|
|
338
|
+
template: 'LOG({x})',
|
|
339
|
+
syntax: 'LOG(x)',
|
|
340
|
+
parameters: ['x - 로그를 취할 값'],
|
|
341
|
+
returnType: 'number',
|
|
342
|
+
help: '자연 로그 ln(x)를 계산합니다.',
|
|
343
|
+
examples: ['LOG(2.718)', 'LOG([성과점수])']
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
name: 'POW()',
|
|
347
|
+
description: '거듭제곱',
|
|
348
|
+
template: 'POW({x}, {y})',
|
|
349
|
+
syntax: 'POW(x, y)',
|
|
350
|
+
parameters: ['x - 밑수', 'y - 지수'],
|
|
351
|
+
returnType: 'number',
|
|
352
|
+
help: 'x의 y제곱을 계산합니다.',
|
|
353
|
+
examples: ['POW(2, 3)', 'POW([효율성], 2)']
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
name: 'EXPONENTIAL_DECAY()',
|
|
357
|
+
description: '지수 감쇠',
|
|
358
|
+
template: 'EXPONENTIAL_DECAY({value}, {scale}, {power})',
|
|
359
|
+
syntax: 'EXPONENTIAL_DECAY(value, scale, power)',
|
|
360
|
+
parameters: ['value - 입력 값', 'scale - 스케일 파라미터', 'power - 지수 파라미터'],
|
|
361
|
+
returnType: 'number',
|
|
362
|
+
help: '지수 감쇠 함수 exp(-(value/scale)^power)를 계산합니다.',
|
|
363
|
+
examples: ['EXPONENTIAL_DECAY(50, 100, 2)', 'EXPONENTIAL_DECAY([목표달성률], 50, 2)']
|
|
364
|
+
}
|
|
365
|
+
]
|
|
366
|
+
},
|
|
367
|
+
width: 200
|
|
368
|
+
},
|
|
239
369
|
{
|
|
240
370
|
type: 'string',
|
|
241
371
|
name: 'grades',
|
|
242
|
-
header: '
|
|
372
|
+
header: '성과지수 Lookup',
|
|
243
373
|
record: {
|
|
244
374
|
editable: false,
|
|
245
375
|
renderer: (v, c, r) => {
|
|
@@ -354,11 +484,13 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
354
484
|
name
|
|
355
485
|
description
|
|
356
486
|
active
|
|
487
|
+
formula
|
|
488
|
+
periodType
|
|
489
|
+
scoreFormula
|
|
357
490
|
grades
|
|
358
491
|
vizType
|
|
359
492
|
vizMeta
|
|
360
493
|
weight
|
|
361
|
-
formula
|
|
362
494
|
schedule
|
|
363
495
|
scheduleId
|
|
364
496
|
timezone
|
|
@@ -599,6 +731,32 @@ let KpiListPage = class KpiListPage extends connect(store)(localize(i18next)(Sco
|
|
|
599
731
|
});
|
|
600
732
|
}
|
|
601
733
|
}
|
|
734
|
+
async _calculateKpiValue(kpi) {
|
|
735
|
+
try {
|
|
736
|
+
const response = await client.mutate({
|
|
737
|
+
mutation: gql `
|
|
738
|
+
mutation ($kpiId: String!) {
|
|
739
|
+
calculateKpiValue(kpiId: $kpiId) {
|
|
740
|
+
id
|
|
741
|
+
value
|
|
742
|
+
valueDate
|
|
743
|
+
group
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
`,
|
|
747
|
+
variables: {
|
|
748
|
+
kpiId: kpi.id
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
if (!response.errors) {
|
|
752
|
+
notify({ message: 'KPI 실적값이 성공적으로 계산되었습니다.' });
|
|
753
|
+
this.grist.fetch();
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
catch (error) {
|
|
757
|
+
notify({ message: 'KPI 실적값 계산 중 오류가 발생했습니다.' });
|
|
758
|
+
}
|
|
759
|
+
}
|
|
602
760
|
};
|
|
603
761
|
__decorate([
|
|
604
762
|
property({ type: Object }),
|