@things-factory/kpi 9.0.31 → 9.0.32
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/README.md +1 -2
- package/client/charts/kpi-boxplot-chart.ts +182 -42
- package/client/charts/kpi-radar-chart.ts +9 -9
- package/client/pages/kpi/kpi-list-page.ts +196 -32
- package/client/pages/kpi/kpi-overview.ts +9 -11
- package/client/pages/kpi/kpi-tree-page.ts +409 -0
- package/client/pages/kpi/kpi-view.ts +187 -0
- package/client/pages/kpi-dashboard/cards/kpi-level1-card.ts +1 -1
- package/client/pages/kpi-dashboard/cards/kpi-level2-comparison.ts +1 -1
- package/client/pages/kpi-dashboard/cards/kpi-level3-comparison.ts +1 -1
- package/client/pages/kpi-dashboard/components/kpi-left-panel.ts +198 -160
- package/client/pages/kpi-dashboard/components/kpi-map-panel.ts +133 -0
- package/client/pages/kpi-dashboard/components/kpi-region-popup.ts +3 -2
- package/client/pages/kpi-dashboard/kpi-dashboard-map.ts +4 -3
- package/client/pages/kpi-dashboard/kpi-dashboard.ts +28 -30
- package/client/pages/kpi-history/kpi-history-list-page.ts +11 -11
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +10 -2
- package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +7 -7
- package/client/pages/kpi-metric-value/kpi-metric-value-importer.ts +2 -2
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +16 -8
- package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +5 -5
- package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +1 -2
- package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +10 -2
- package/client/pages/kpi-value/kpi-value-editor-page.ts +11 -7
- package/client/pages/kpi-value/kpi-value-list-page.ts +31 -7
- package/client/route.ts +2 -9
- package/design-entities.md +8 -12
- package/dist-client/charts/kpi-boxplot-chart.d.ts +2 -0
- package/dist-client/charts/kpi-boxplot-chart.js +168 -42
- package/dist-client/charts/kpi-boxplot-chart.js.map +1 -1
- package/dist-client/charts/kpi-radar-chart.js +9 -9
- package/dist-client/charts/kpi-radar-chart.js.map +1 -1
- package/dist-client/pages/kpi/kpi-list-page.d.ts +19 -3
- package/dist-client/pages/kpi/kpi-list-page.js +188 -32
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi/kpi-overview.js +9 -11
- package/dist-client/pages/kpi/kpi-overview.js.map +1 -1
- package/dist-client/pages/kpi/kpi-tree-page.d.ts +59 -0
- package/dist-client/pages/kpi/kpi-tree-page.js +403 -0
- package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
- package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
- package/dist-client/pages/kpi/kpi-view.js +191 -0
- package/dist-client/pages/kpi/kpi-view.js.map +1 -0
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +1 -1
- package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +1 -1
- package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +1 -1
- package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +3 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +197 -161
- package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +5 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +146 -0
- package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +3 -2
- package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +4 -3
- package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +28 -30
- package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
- package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +6 -1
- package/dist-client/pages/kpi-history/kpi-history-list-page.js +11 -11
- package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +5 -0
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +10 -2
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +8 -8
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +2 -2
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +16 -8
- 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.d.ts +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +6 -6
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
- package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +1 -2
- package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +5 -0
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +10 -2
- package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +2 -1
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js +16 -8
- package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
- package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +5 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +31 -7
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +2 -8
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/controllers/kpi-metric-value-provider.d.ts +1 -1
- package/dist-server/controllers/kpi-metric-value-provider.js +4 -4
- package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -1
- package/dist-server/controllers/kpi-value-provider.d.ts +1 -1
- package/dist-server/controllers/kpi-value-provider.js +3 -3
- package/dist-server/controllers/kpi-value-provider.js.map +1 -1
- package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
- package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +101 -0
- package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
- package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
- package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
- package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
- package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
- package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
- package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
- package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
- package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
- package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
- package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
- package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
- package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
- package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
- package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
- package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
- package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
- package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
- package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
- package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
- package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
- package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
- package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
- package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
- package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
- package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
- package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
- package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
- package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
- package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
- package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
- package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
- package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
- package/dist-server/migrations/seed-data/kpi-metrics-seed.json +454 -0
- package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
- package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
- package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
- package/dist-server/service/index.d.ts +3 -7
- package/dist-server/service/index.js +5 -12
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/kpi/aggregate-kpi.js +30 -13
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
- package/dist-server/service/kpi/kpi-formula.service.d.ts +15 -0
- package/dist-server/service/kpi/kpi-formula.service.js +90 -0
- package/dist-server/service/kpi/kpi-formula.service.js.map +1 -1
- package/dist-server/service/kpi/kpi-history.d.ts +0 -3
- package/dist-server/service/kpi/kpi-history.js +0 -10
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.d.ts +1 -1
- package/dist-server/service/kpi/kpi-mutation.js +57 -20
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-query.d.ts +7 -3
- package/dist-server/service/kpi/kpi-query.js +126 -10
- package/dist-server/service/kpi/kpi-query.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +4 -2
- package/dist-server/service/kpi/kpi-type.js +12 -4
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +4 -3
- package/dist-server/service/kpi/kpi.js +20 -8
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +46 -11
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -6
- 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-type.d.ts +2 -2
- package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +4 -4
- package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -3
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
- package/dist-server/service/kpi-org-scope/index.d.ts +9 -0
- package/dist-server/service/kpi-org-scope/index.js +14 -0
- package/dist-server/service/kpi-org-scope/index.js.map +1 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
- package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
- package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +1 -0
- package/dist-server/service/kpi-statistic/kpi-statistic.js +11 -0
- package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +71 -7
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +4 -2
- package/dist-server/service/kpi-value/kpi-value-type.js +12 -4
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +3 -1
- package/dist-server/service/kpi-value/kpi-value.js +11 -5
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/service/utils/value-date-util.d.ts +1 -0
- package/dist-server/service/utils/value-date-util.js +41 -0
- package/dist-server/service/utils/value-date-util.js.map +1 -1
- package/dist-server/tsconfig.json +10 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/server/@types/index.d.ts +11 -0
- package/server/controllers/kpi-metric-value-provider.ts +5 -5
- package/server/controllers/kpi-value-provider.ts +4 -4
- package/server/migrations/1752190849680-seed-kpi-metrics.ts +124 -0
- package/server/migrations/1752190849681-seed-kpi.ts +356 -0
- package/server/migrations/1752192090123-add-grades-to-kpi.ts +67 -0
- package/server/migrations/1752192090124-add-kpi-statistics.ts +719 -0
- package/server/migrations/1752192090128-seed-kpi-org-scope.ts +132 -0
- package/server/migrations/1752192090129-seed-kpi-values.ts +207 -0
- package/server/migrations/grade-data/x11-performance-table.json +962 -0
- package/server/migrations/grade-data/x12-performance-table.json +611 -0
- package/server/migrations/grade-data/x14-performance-table.json +42 -0
- package/server/migrations/grade-data/x21-performance-table.json +889 -0
- package/server/migrations/grade-data/x22-performance-table.json +1064 -0
- package/server/migrations/grade-data/x23-performance-table.json +42 -0
- package/server/migrations/grade-data/x31-performance-table.json +644 -0
- package/server/migrations/grade-data/x32-performance-table.json +993 -0
- package/server/migrations/grade-data/x33-performance-table.json +195 -0
- package/server/migrations/grade-data/x34-performance-table.json +12 -0
- package/server/migrations/grade-data/x35-performance-table.json +42 -0
- package/server/migrations/grade-data/x41-performance-table.json +825 -0
- package/server/migrations/grade-data/x42-performance-table.json +786 -0
- package/server/migrations/grade-data/x43-performance-table.json +12 -0
- package/server/migrations/grade-data/x44-performance-table.json +42 -0
- package/server/migrations/grade-data/x51-performance-table.json +924 -0
- package/server/migrations/grade-data/x52-performance-table.json +42 -0
- package/server/migrations/grade-data/x61-performance-table.json +261 -0
- package/server/migrations/grade-data/x62-performance-table.json +42 -0
- package/server/migrations/seed-data/kpi-metrics-seed.json +454 -0
- package/server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
- package/server/migrations/seed-data/kpi-values-seed.json +402 -0
- package/server/migrations/seed-data/kpis-seed.json +488 -0
- package/server/service/index.ts +5 -12
- package/server/service/kpi/aggregate-kpi.ts +31 -13
- package/server/service/kpi/kpi-formula.service.ts +101 -0
- package/server/service/kpi/kpi-history.ts +0 -8
- package/server/service/kpi/kpi-mutation.ts +59 -19
- package/server/service/kpi/kpi-query.ts +118 -8
- package/server/service/kpi/kpi-type.ts +10 -4
- package/server/service/kpi/kpi.ts +17 -7
- package/server/service/kpi-metric/aggregate-kpi-metric.ts +55 -11
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +6 -6
- package/server/service/kpi-metric-value/kpi-metric-value-type.ts +4 -4
- package/server/service/kpi-metric-value/kpi-metric-value.ts +3 -3
- package/server/service/kpi-org-scope/index.ts +11 -0
- package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +173 -0
- package/server/service/kpi-org-scope/kpi-org-scope-query.ts +127 -0
- package/server/service/kpi-org-scope/kpi-org-scope-type.ts +68 -0
- package/server/service/kpi-org-scope/kpi-org-scope.ts +123 -0
- package/server/service/kpi-statistic/kpi-statistic.ts +10 -0
- package/server/service/kpi-value/kpi-value-mutation.ts +73 -7
- package/server/service/kpi-value/kpi-value-type.ts +10 -4
- package/server/service/kpi-value/kpi-value.ts +10 -5
- package/server/service/utils/value-date-util.ts +47 -0
- package/server/types/global.d.ts +8 -0
- package/things-factory.config.js +1 -0
- package/translations/en.json +15 -3
- package/translations/ja.json +13 -3
- package/translations/ko.json +15 -3
- package/translations/ms.json +13 -3
- package/translations/zh.json +13 -3
- package/client/pages/kpi-category/kpi-category-importer.ts +0 -90
- package/client/pages/kpi-category/kpi-category-list-page.ts +0 -537
- package/client/pages/kpi-category/kpi-category-value-calculator.ts +0 -233
- package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +0 -404
- package/dist-client/pages/kpi-category/kpi-category-importer.d.ts +0 -23
- package/dist-client/pages/kpi-category/kpi-category-importer.js +0 -92
- package/dist-client/pages/kpi-category/kpi-category-importer.js.map +0 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +0 -74
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +0 -517
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +0 -1
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +0 -13
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +0 -256
- package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +0 -1
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +0 -63
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +0 -393
- package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +0 -1
- package/dist-server/service/kpi-category/index.d.ts +0 -6
- package/dist-server/service/kpi-category/index.js +0 -10
- package/dist-server/service/kpi-category/index.js.map +0 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +0 -9
- package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -221
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +0 -1
- package/dist-server/service/kpi-category/kpi-category-query.d.ts +0 -18
- package/dist-server/service/kpi-category/kpi-category-query.js +0 -115
- package/dist-server/service/kpi-category/kpi-category-query.js.map +0 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +0 -24
- package/dist-server/service/kpi-category/kpi-category-type.js +0 -100
- package/dist-server/service/kpi-category/kpi-category-type.js.map +0 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +0 -22
- package/dist-server/service/kpi-category/kpi-category.js +0 -106
- package/dist-server/service/kpi-category/kpi-category.js.map +0 -1
- package/dist-server/service/kpi-category-value/index.d.ts +0 -6
- package/dist-server/service/kpi-category-value/index.js +0 -10
- package/dist-server/service/kpi-category-value/index.js.map +0 -1
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +0 -8
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +0 -102
- package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +0 -1
- package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +0 -13
- package/dist-server/service/kpi-category-value/kpi-category-value-query.js +0 -91
- package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +0 -1
- package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +0 -19
- package/dist-server/service/kpi-category-value/kpi-category-value-type.js +0 -73
- package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +0 -1
- package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +0 -19
- package/dist-server/service/kpi-category-value/kpi-category-value.js +0 -91
- package/dist-server/service/kpi-category-value/kpi-category-value.js.map +0 -1
- package/helps/kpi/kpi-category.md +0 -160
- package/server/service/kpi-category/index.ts +0 -7
- package/server/service/kpi-category/kpi-category-mutation.ts +0 -217
- package/server/service/kpi-category/kpi-category-query.ts +0 -87
- package/server/service/kpi-category/kpi-category-type.ts +0 -73
- package/server/service/kpi-category/kpi-category.ts +0 -95
- package/server/service/kpi-category-value/index.ts +0 -7
- package/server/service/kpi-category-value/kpi-category-value-mutation.ts +0 -88
- package/server/service/kpi-category-value/kpi-category-value-query.ts +0 -62
- package/server/service/kpi-category-value/kpi-category-value-type.ts +0 -48
- package/server/service/kpi-category-value/kpi-category-value.ts +0 -79
|
@@ -20,13 +20,13 @@ class KpiMetricValueProvider {
|
|
|
20
20
|
const value = await valueRepo.findOne({
|
|
21
21
|
where: {
|
|
22
22
|
metric: { id: metric.id },
|
|
23
|
-
|
|
23
|
+
org: this.options.org ?? '',
|
|
24
24
|
domain: { id: this.options.domainId }
|
|
25
25
|
},
|
|
26
26
|
order: { createdAt: 'DESC' }
|
|
27
27
|
});
|
|
28
28
|
if (!value) {
|
|
29
|
-
throw new Error(`Metric value not found: metric='${name}',
|
|
29
|
+
throw new Error(`Metric value not found: metric='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`);
|
|
30
30
|
}
|
|
31
31
|
return value.value;
|
|
32
32
|
}
|
|
@@ -49,12 +49,12 @@ class KpiMetricValueProvider {
|
|
|
49
49
|
where: {
|
|
50
50
|
metric: { id: metric.id },
|
|
51
51
|
valueDate,
|
|
52
|
-
|
|
52
|
+
org: this.options.org ?? '',
|
|
53
53
|
domain: { id: this.options.domainId }
|
|
54
54
|
}
|
|
55
55
|
});
|
|
56
56
|
if (!value) {
|
|
57
|
-
throw new Error(`Metric value not found: metric='${name}',
|
|
57
|
+
throw new Error(`Metric value not found: metric='${name}', org='${this.options.org ?? ''}', valueDate='${valueDate}', periodType='${metric.periodType}'`);
|
|
58
58
|
}
|
|
59
59
|
return value.value;
|
|
60
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-metric-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-metric-value-provider.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,iEAA4D;AAC5D,mFAA6E;AAE7E,sEAAsE;AAEtE,MAAa,sBAAsB;IACjC,YACU,OAKP;QALO,YAAO,GAAP,OAAO,CAKd;IACA,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sBAAS,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QACnG,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAA;QAEzD,wCAAwC;QACxC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,IAAA,qBAAa,EAAC,iCAAc,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACpC,KAAK,EAAE;oBACL,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;oBACzB,
|
|
1
|
+
{"version":3,"file":"kpi-metric-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-metric-value-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { KpiMetric } from '../service/kpi-metric/kpi-metric'\nimport { KpiMetricValue } from '../service/kpi-metric-value/kpi-metric-value'\nimport { ValueProvider } from '../calculator/provider'\nimport { getDefaultValueDate } from '../service/utils/value-date-util'\n\nexport class KpiMetricValueProvider implements ValueProvider {\n constructor(\n private options: {\n valueDate: string\n org?: string\n domainId: string\n tx?: any\n }\n ) {}\n\n async get(name: string) {\n const metricRepo = getRepository(KpiMetric, this.options.tx)\n const metric = await metricRepo.findOne({ where: { name, domain: { id: this.options.domainId } } })\n if (!metric) throw new Error(`Metric not found: ${name}`)\n\n // ALLTIME 타입인 경우 valueDate 무시하고 최신 값 조회\n if (metric.periodType === 'ALLTIME') {\n const valueRepo = getRepository(KpiMetricValue, this.options.tx)\n const value = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId }\n },\n order: { createdAt: 'DESC' }\n })\n if (!value) {\n throw new Error(`Metric value not found: metric='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`)\n }\n return value.value\n }\n\n // metric의 periodType에 맞게 valueDate 보정\n let valueDate = this.options.valueDate\n if (!valueDate) {\n valueDate = getDefaultValueDate(metric.periodType, 'current')\n } else {\n // valueDate가 metric.periodType에 맞는 포맷인지 검사, 아니면 보정\n // (간단히: 길이로 구분, 실제는 정규식 등으로 더 정교하게 가능)\n if (metric.periodType === 'MONTH' && valueDate.length > 7) valueDate = valueDate.slice(0, 7)\n if (metric.periodType === 'DAY' && valueDate.length > 10) valueDate = valueDate.slice(0, 10)\n // 기타 periodType별 보정 추가 가능\n }\n const valueRepo = getRepository(KpiMetricValue, this.options.tx)\n const value = await valueRepo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n org: this.options.org ?? '',\n domain: { id: this.options.domainId }\n }\n })\n if (!value) {\n throw new Error(\n `Metric value not found: metric='${name}', org='${this.options.org ?? ''}', valueDate='${valueDate}', periodType='${metric.periodType}'`\n )\n }\n return value.value\n }\n}\n"]}
|
|
@@ -17,7 +17,7 @@ class KpiValueProvider {
|
|
|
17
17
|
// SINGLE 타입인 경우 valueDate 무시하고 최신 값 조회
|
|
18
18
|
const whereCondition = {
|
|
19
19
|
kpi: { id: kpi.id },
|
|
20
|
-
|
|
20
|
+
org: this.options.org ?? '',
|
|
21
21
|
domain: { id: this.options.domainId }
|
|
22
22
|
};
|
|
23
23
|
if (kpi.periodType === 'ALLTIME') {
|
|
@@ -27,7 +27,7 @@ class KpiValueProvider {
|
|
|
27
27
|
order: { createdAt: 'DESC' }
|
|
28
28
|
});
|
|
29
29
|
if (!value) {
|
|
30
|
-
throw new Error(`KPI value not found: kpi='${name}',
|
|
30
|
+
throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`);
|
|
31
31
|
}
|
|
32
32
|
return value.value;
|
|
33
33
|
}
|
|
@@ -36,7 +36,7 @@ class KpiValueProvider {
|
|
|
36
36
|
whereCondition.valueDate = this.options.valueDate;
|
|
37
37
|
const value = await valueRepo.findOne({ where: whereCondition });
|
|
38
38
|
if (!value) {
|
|
39
|
-
throw new Error(`KPI value not found: kpi='${name}',
|
|
39
|
+
throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}', valueDate='${this.options.valueDate}'`);
|
|
40
40
|
}
|
|
41
41
|
return value.value;
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-value-provider.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,4CAAwC;AACxC,8DAAyD;AAGzD,MAAa,gBAAgB;IAC3B,YACU,OAKP;QALO,YAAO,GAAP,OAAO,CAKd;IACA,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,IAAA,qBAAa,EAAC,oBAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1D,uCAAuC;QACvC,MAAM,cAAc,GAAQ;YAC1B,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;YACnB,
|
|
1
|
+
{"version":3,"file":"kpi-value-provider.js","sourceRoot":"","sources":["../../server/controllers/kpi-value-provider.ts"],"names":[],"mappings":";;;AAAA,iDAAqD;AACrD,4CAAwC;AACxC,8DAAyD;AAGzD,MAAa,gBAAgB;IAC3B,YACU,OAKP;QALO,YAAO,GAAP,OAAO,CAKd;IACA,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,OAAO,GAAG,IAAA,qBAAa,EAAC,SAAG,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAA;QACnD,MAAM,SAAS,GAAG,IAAA,qBAAa,EAAC,oBAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1D,uCAAuC;QACvC,MAAM,cAAc,GAAQ;YAC1B,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE;YACnB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE;YAC3B,MAAM,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;SACtC,CAAA;QAED,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACjC,qCAAqC;YACrC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;gBACpC,KAAK,EAAE,cAAc;gBACrB,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;aAC7B,CAAC,CAAA;YACF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,kBAAkB,CAAC,CAAA;YACvG,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAA;QACpB,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,cAAc,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAA;YACjD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;YAChE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,iBAAiB,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAC7G,CAAA;YACH,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAA;QACpB,CAAC;IACH,CAAC;CACF;AA7CD,4CA6CC","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { Kpi } from '../service/kpi/kpi'\nimport { KpiValue } from '../service/kpi-value/kpi-value'\nimport { ValueProvider } from '../calculator/provider'\n\nexport class KpiValueProvider implements ValueProvider {\n constructor(\n private options: {\n valueDate: string\n org?: string\n domainId: string\n tx?: any\n }\n ) {}\n\n async get(name: string) {\n const kpiRepo = getRepository(Kpi, this.options.tx)\n const kpi = await kpiRepo.findOne({ where: { name, domain: { id: this.options.domainId } } })\n if (!kpi) throw new Error(`KPI not found: ${name}`)\n const valueRepo = getRepository(KpiValue, this.options.tx)\n\n // SINGLE 타입인 경우 valueDate 무시하고 최신 값 조회\n const whereCondition: any = {\n kpi: { id: kpi.id },\n org: this.options.org ?? '',\n domain: { id: this.options.domainId }\n }\n\n if (kpi.periodType === 'ALLTIME') {\n // ALLTIME 타입은 valueDate 무시하고 최신 값 사용\n const value = await valueRepo.findOne({\n where: whereCondition,\n order: { createdAt: 'DESC' }\n })\n if (!value) {\n throw new Error(`KPI value not found: kpi='${name}', org='${this.options.org ?? ''}' (ALLTIME type)`)\n }\n return value.value\n } else {\n // 기존 로직: 특정 날짜의 값 조회\n whereCondition.valueDate = this.options.valueDate\n const value = await valueRepo.findOne({ where: whereCondition })\n if (!value) {\n throw new Error(\n `KPI value not found: kpi='${name}', org='${this.options.org ?? ''}', valueDate='${this.options.valueDate}'`\n )\n }\n return value.value\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SeedKpiMetrics1752190849680 = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const shell_1 = require("@things-factory/shell");
|
|
6
|
+
const kpi_1 = require("../service/kpi/kpi");
|
|
7
|
+
const kpi_metric_1 = require("../service/kpi-metric/kpi-metric");
|
|
8
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
9
|
+
const path = tslib_1.__importStar(require("path"));
|
|
10
|
+
class SeedKpiMetrics1752190849680 {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.name = 'SeedKpiMetrics1752190849680';
|
|
13
|
+
}
|
|
14
|
+
async up(queryRunner) {
|
|
15
|
+
try {
|
|
16
|
+
const repository = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
|
|
17
|
+
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
18
|
+
// SYSTEM 도메인 확인
|
|
19
|
+
const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
|
|
20
|
+
if (!domain) {
|
|
21
|
+
console.log('❌ SYSTEM domain not found');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// JSON 파일 읽기
|
|
25
|
+
const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json');
|
|
26
|
+
const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
|
|
27
|
+
console.log(`📊 Processing ${seedData.length} KPI metrics from JSON seed`);
|
|
28
|
+
for (const metricData of seedData) {
|
|
29
|
+
try {
|
|
30
|
+
const existingMetric = await repository.findOne({
|
|
31
|
+
where: { name: metricData.name, domain: { id: domain.id } }
|
|
32
|
+
});
|
|
33
|
+
if (existingMetric) {
|
|
34
|
+
console.log(`⚠️ KPI Metric already exists: ${metricData.name}`);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const metric = await repository.save({
|
|
38
|
+
name: metricData.name,
|
|
39
|
+
description: metricData.description,
|
|
40
|
+
unit: metricData.unit,
|
|
41
|
+
source: metricData.source,
|
|
42
|
+
fieldName: metricData.field_name,
|
|
43
|
+
active: metricData.active,
|
|
44
|
+
scheduleId: metricData.schedule_id,
|
|
45
|
+
timezone: metricData.timezone,
|
|
46
|
+
dataSetId: metricData.data_set_id,
|
|
47
|
+
periodType: kpi_1.KpiPeriodType[metricData.period_type],
|
|
48
|
+
collectType: kpi_metric_1.KpiMetricCollectType[metricData.collect_type],
|
|
49
|
+
schedule: metricData.schedule,
|
|
50
|
+
domain
|
|
51
|
+
});
|
|
52
|
+
console.log(`✅ Created KPI Metric: ${metric.name}`);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`❌ Error creating KPI Metric "${metricData.name}":`, error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
console.log(`🎉 Successfully processed KPI metrics from JSON seed`);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error('❌ Error seeding KPI metrics from JSON:', error);
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async down(queryRunner) {
|
|
66
|
+
try {
|
|
67
|
+
const repository = (0, shell_1.getRepository)(kpi_metric_1.KpiMetric);
|
|
68
|
+
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
69
|
+
const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
|
|
70
|
+
if (!domain) {
|
|
71
|
+
console.log('⚠️ SYSTEM domain not found. Nothing to delete.');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// JSON 파일 읽기
|
|
75
|
+
const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json');
|
|
76
|
+
const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
|
|
77
|
+
console.log(`🗑️ Cleaning up ${seedData.length} KPI metrics`);
|
|
78
|
+
for (const metricData of seedData.reverse()) {
|
|
79
|
+
try {
|
|
80
|
+
const metric = await repository.findOne({
|
|
81
|
+
where: { name: metricData.name, domain: { id: domain.id } }
|
|
82
|
+
});
|
|
83
|
+
if (metric) {
|
|
84
|
+
await repository.delete(metric.id);
|
|
85
|
+
console.log(`✅ Deleted KPI Metric: ${metricData.name}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error(`❌ Error deleting KPI Metric "${metricData.name}":`, error);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
console.log(`🎉 Successfully cleaned up KPI metrics`);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error('❌ Error cleaning up KPI metrics:', error);
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.SeedKpiMetrics1752190849680 = SeedKpiMetrics1752190849680;
|
|
101
|
+
//# sourceMappingURL=1752190849680-seed-kpi-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1752190849680-seed-kpi-metrics.js","sourceRoot":"","sources":["../../server/migrations/1752190849680-seed-kpi-metrics.ts"],"names":[],"mappings":"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","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { KpiPeriodType } from '../service/kpi/kpi'\nimport { KpiMetric, KpiMetricCollectType } from '../service/kpi-metric/kpi-metric'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\ninterface KpiMetricSeedData {\n name: string\n description: string\n unit?: string | null\n source?: string | null\n field_name?: string | null\n active: boolean\n schedule_id?: string | null\n timezone: string\n data_set_id?: string | null\n period_type: string\n collect_type: string\n schedule?: string | null\n created_at?: string\n updated_at?: string\n}\n\nexport class SeedKpiMetrics1752190849680 implements MigrationInterface {\n name = 'SeedKpiMetrics1752190849680'\n\n public async up(queryRunner: QueryRunner): Promise<void> {\n try {\n const repository = getRepository(KpiMetric)\n const domainRepository = getRepository(Domain)\n\n // SYSTEM 도메인 확인\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('❌ SYSTEM domain not found')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json')\n const seedData: KpiMetricSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n console.log(`📊 Processing ${seedData.length} KPI metrics from JSON seed`)\n\n for (const metricData of seedData) {\n try {\n const existingMetric = await repository.findOne({\n where: { name: metricData.name, domain: { id: domain.id } }\n })\n\n if (existingMetric) {\n console.log(`⚠️ KPI Metric already exists: ${metricData.name}`)\n continue\n }\n\n const metric = await repository.save({\n name: metricData.name,\n description: metricData.description,\n unit: metricData.unit,\n source: metricData.source,\n fieldName: metricData.field_name,\n active: metricData.active,\n scheduleId: metricData.schedule_id,\n timezone: metricData.timezone,\n dataSetId: metricData.data_set_id,\n periodType: KpiPeriodType[metricData.period_type as keyof typeof KpiPeriodType],\n collectType: KpiMetricCollectType[metricData.collect_type as keyof typeof KpiMetricCollectType],\n schedule: metricData.schedule,\n domain\n })\n\n console.log(`✅ Created KPI Metric: ${metric.name}`)\n } catch (error) {\n console.error(`❌ Error creating KPI Metric \"${metricData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully processed KPI metrics from JSON seed`)\n } catch (error) {\n console.error('❌ Error seeding KPI metrics from JSON:', error)\n throw error\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n try {\n const repository = getRepository(KpiMetric)\n const domainRepository = getRepository(Domain)\n\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('⚠️ SYSTEM domain not found. Nothing to delete.')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpi-metrics-seed.json')\n const seedData: KpiMetricSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n console.log(`🗑️ Cleaning up ${seedData.length} KPI metrics`)\n\n for (const metricData of seedData.reverse()) {\n try {\n const metric = await repository.findOne({\n where: { name: metricData.name, domain: { id: domain.id } }\n })\n\n if (metric) {\n await repository.delete(metric.id)\n console.log(`✅ Deleted KPI Metric: ${metricData.name}`)\n }\n } catch (error) {\n console.error(`❌ Error deleting KPI Metric \"${metricData.name}\":`, error)\n }\n }\n\n console.log(`🎉 Successfully cleaned up KPI metrics`)\n } catch (error) {\n console.error('❌ Error cleaning up KPI metrics:', error)\n throw error\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SeedKpi1752190849681 = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const shell_1 = require("@things-factory/shell");
|
|
6
|
+
const kpi_1 = require("../service/kpi/kpi");
|
|
7
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
8
|
+
const path = tslib_1.__importStar(require("path"));
|
|
9
|
+
const SEED = [
|
|
10
|
+
// 일정성과 (Y1) - Schedule Performance
|
|
11
|
+
{
|
|
12
|
+
name: '연면적 대비 공사기간',
|
|
13
|
+
description: '연면적 대비 공사기간 평가',
|
|
14
|
+
categoryName: '일정성과',
|
|
15
|
+
formula: 'Eq. 활용',
|
|
16
|
+
scoreType: 'equation',
|
|
17
|
+
dataType: 'ratio'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: '설계변경에 따른 공기 증감률',
|
|
21
|
+
description: '설계변경에 따른 공기 증감률 평가',
|
|
22
|
+
categoryName: '일정성과',
|
|
23
|
+
formula: 'Eq. 활용',
|
|
24
|
+
scoreType: 'equation',
|
|
25
|
+
dataType: 'ratio'
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: '일정 이탈 수준',
|
|
29
|
+
description: '프로젝트 일정 이탈 수준 평가',
|
|
30
|
+
categoryName: '일정성과',
|
|
31
|
+
formula: 'Table(DART 등) 활용(1~5점)',
|
|
32
|
+
scoreType: 'table',
|
|
33
|
+
dataType: 'score'
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: '일정성과 수준 평가',
|
|
37
|
+
description: '일정성과 종합 평가',
|
|
38
|
+
categoryName: '일정성과',
|
|
39
|
+
formula: '감리자 1~5점 척도',
|
|
40
|
+
scoreType: 'inspector',
|
|
41
|
+
dataType: 'score'
|
|
42
|
+
},
|
|
43
|
+
// 비용성과 (Y2) - Cost Performance
|
|
44
|
+
{
|
|
45
|
+
name: '연면적 대비 공사비',
|
|
46
|
+
description: '연면적 대비 공사비 평가',
|
|
47
|
+
categoryName: '비용성과',
|
|
48
|
+
formula: 'Eq. 활용',
|
|
49
|
+
scoreType: 'equation',
|
|
50
|
+
dataType: 'ratio'
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: '설계변경에 따른 공사비 증감률',
|
|
54
|
+
description: '설계변경에 따른 공사비 증감률 평가',
|
|
55
|
+
categoryName: '비용성과',
|
|
56
|
+
formula: 'Eq. 활용',
|
|
57
|
+
scoreType: 'equation',
|
|
58
|
+
dataType: 'ratio'
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: '비용성과 수준 평가',
|
|
62
|
+
description: '비용성과 종합 평가',
|
|
63
|
+
categoryName: '비용성과',
|
|
64
|
+
formula: '감리자 1~5점 척도',
|
|
65
|
+
scoreType: 'inspector',
|
|
66
|
+
dataType: 'score'
|
|
67
|
+
},
|
|
68
|
+
// 품질성과 (Y3) - Quality Performance
|
|
69
|
+
{
|
|
70
|
+
name: '품질시험 불합격률',
|
|
71
|
+
description: '품질시험 불합격률 평가',
|
|
72
|
+
categoryName: '품질성과',
|
|
73
|
+
formula: 'Eq. 활용',
|
|
74
|
+
scoreType: 'equation',
|
|
75
|
+
dataType: 'ratio'
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: '검수자재 불합격률',
|
|
79
|
+
description: '검수자재 불합격률 평가',
|
|
80
|
+
categoryName: '품질성과',
|
|
81
|
+
formula: 'Eq. 활용',
|
|
82
|
+
scoreType: 'equation',
|
|
83
|
+
dataType: 'ratio'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: '검측 불합격률',
|
|
87
|
+
description: '검측 불합격률 평가',
|
|
88
|
+
categoryName: '품질성과',
|
|
89
|
+
formula: 'Table 활용',
|
|
90
|
+
scoreType: 'table',
|
|
91
|
+
dataType: 'score'
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
name: '품질 SL-PA 결과값',
|
|
95
|
+
description: '품질 SL-PA 결과',
|
|
96
|
+
categoryName: '품질성과',
|
|
97
|
+
formula: 'Python 활용(1~5점)',
|
|
98
|
+
scoreType: 'python',
|
|
99
|
+
dataType: 'score'
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: '품질성과 수준 평가',
|
|
103
|
+
description: '품질성과 종합 평가',
|
|
104
|
+
categoryName: '품질성과',
|
|
105
|
+
formula: '감리자 1~5점 척도',
|
|
106
|
+
scoreType: 'inspector',
|
|
107
|
+
dataType: 'score'
|
|
108
|
+
},
|
|
109
|
+
// 안전성과 (Y4) - Safety Performance
|
|
110
|
+
{
|
|
111
|
+
name: '재해율',
|
|
112
|
+
description: '재해율 평가',
|
|
113
|
+
categoryName: '안전성과',
|
|
114
|
+
formula: 'Eq. 활용',
|
|
115
|
+
scoreType: 'equation',
|
|
116
|
+
dataType: 'ratio'
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: '재해강도율',
|
|
120
|
+
description: '재해강도율 평가',
|
|
121
|
+
categoryName: '안전성과',
|
|
122
|
+
formula: 'Table 활용',
|
|
123
|
+
scoreType: 'table',
|
|
124
|
+
dataType: 'score'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: '안전 SL-PA 결과값',
|
|
128
|
+
description: '안전 SL-PA 결과',
|
|
129
|
+
categoryName: '안전성과',
|
|
130
|
+
formula: 'Python 활용(1~5점)',
|
|
131
|
+
scoreType: 'python',
|
|
132
|
+
dataType: 'score'
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: '안전성과 수준 평가',
|
|
136
|
+
description: '안전성과 종합 평가',
|
|
137
|
+
categoryName: '안전성과',
|
|
138
|
+
formula: '감리자 1~5점 척도',
|
|
139
|
+
scoreType: 'inspector',
|
|
140
|
+
dataType: 'score'
|
|
141
|
+
},
|
|
142
|
+
// 환경성과 (Y5) - Environmental Performance
|
|
143
|
+
{
|
|
144
|
+
name: '건설폐기물 발생량',
|
|
145
|
+
description: '건설폐기물 발생량 평가',
|
|
146
|
+
categoryName: '환경성과',
|
|
147
|
+
formula: 'Table 활용',
|
|
148
|
+
scoreType: 'table',
|
|
149
|
+
dataType: 'score'
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: '환경성과 수준 평가',
|
|
153
|
+
description: '환경성과 종합 평가',
|
|
154
|
+
categoryName: '환경성과',
|
|
155
|
+
formula: '감리자 1~5점 척도',
|
|
156
|
+
scoreType: 'inspector',
|
|
157
|
+
dataType: 'score'
|
|
158
|
+
},
|
|
159
|
+
// 생산성성과 (Y6) - Productivity Performance
|
|
160
|
+
{
|
|
161
|
+
name: '투입인력 생산성',
|
|
162
|
+
description: '투입인력 생산성 평가',
|
|
163
|
+
categoryName: '생산성과',
|
|
164
|
+
formula: 'Eq. 활용',
|
|
165
|
+
scoreType: 'equation',
|
|
166
|
+
dataType: 'ratio'
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: '생산성성과 수준 평가',
|
|
170
|
+
description: '생산성과 종합 평가',
|
|
171
|
+
categoryName: '생산성과',
|
|
172
|
+
formula: '감리자 1~5점 척도',
|
|
173
|
+
scoreType: 'inspector',
|
|
174
|
+
dataType: 'score'
|
|
175
|
+
}
|
|
176
|
+
];
|
|
177
|
+
class SeedKpi1752190849681 {
|
|
178
|
+
async up(queryRunner) {
|
|
179
|
+
try {
|
|
180
|
+
const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
|
|
181
|
+
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
182
|
+
// SYSTEM 도메인 확인
|
|
183
|
+
const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
|
|
184
|
+
if (!domain) {
|
|
185
|
+
console.log('❌ SYSTEM domain not found');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// JSON 파일 읽기
|
|
189
|
+
const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json');
|
|
190
|
+
const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
|
|
191
|
+
// 이름으로 KPI를 찾을 수 있는 맵 생성
|
|
192
|
+
const kpiNameMap = new Map();
|
|
193
|
+
// 1단계: parent_name이 null인 루트 KPI들 먼저 생성
|
|
194
|
+
const rootKpis = seedData.filter(kpi => kpi.parent_name === null);
|
|
195
|
+
for (const kpiData of rootKpis) {
|
|
196
|
+
const existingKpi = await repository.findOne({
|
|
197
|
+
where: { name: kpiData.name, domain: { id: domain.id } }
|
|
198
|
+
});
|
|
199
|
+
if (existingKpi) {
|
|
200
|
+
console.log(`⚠️ KPI already exists: ${kpiData.name}`);
|
|
201
|
+
kpiNameMap.set(kpiData.name, existingKpi);
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const kpi = await repository.save({
|
|
205
|
+
name: kpiData.name,
|
|
206
|
+
description: kpiData.description,
|
|
207
|
+
formula: kpiData.formula,
|
|
208
|
+
active: kpiData.active,
|
|
209
|
+
state: kpiData.state ? kpi_1.KpiStatus[kpiData.state] : kpi_1.KpiStatus.DRAFT,
|
|
210
|
+
vizType: kpiData.viz_type ? kpi_1.KpiVizType[kpiData.viz_type] : null,
|
|
211
|
+
vizMeta: kpiData.viz_meta,
|
|
212
|
+
schedule: kpiData.schedule,
|
|
213
|
+
scheduleId: kpiData.schedule_id,
|
|
214
|
+
timezone: kpiData.timezone,
|
|
215
|
+
grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
|
|
216
|
+
periodType: kpi_1.KpiPeriodType[kpiData.period_type],
|
|
217
|
+
weight: kpiData.weight,
|
|
218
|
+
scoreFormula: kpiData.score_formula,
|
|
219
|
+
isLeaf: kpiData.is_leaf,
|
|
220
|
+
parent: null,
|
|
221
|
+
domain
|
|
222
|
+
});
|
|
223
|
+
kpiNameMap.set(kpi.name, kpi);
|
|
224
|
+
console.log(`✅ Created root KPI: ${kpi.name}`);
|
|
225
|
+
}
|
|
226
|
+
// 2단계: 자식 KPI들 생성 (parent_name이 있는 KPI들)
|
|
227
|
+
const childKpis = seedData.filter(kpi => kpi.parent_name !== null);
|
|
228
|
+
for (const kpiData of childKpis) {
|
|
229
|
+
const existingKpi = await repository.findOne({
|
|
230
|
+
where: { name: kpiData.name, domain: { id: domain.id } }
|
|
231
|
+
});
|
|
232
|
+
if (existingKpi) {
|
|
233
|
+
console.log(`⚠️ KPI already exists: ${kpiData.name}`);
|
|
234
|
+
continue;
|
|
235
|
+
}
|
|
236
|
+
// 부모 KPI 찾기
|
|
237
|
+
const parentKpi = kpiNameMap.get(kpiData.parent_name);
|
|
238
|
+
if (!parentKpi) {
|
|
239
|
+
console.log(`❌ Parent KPI not found: ${kpiData.parent_name} for ${kpiData.name}`);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const kpi = await repository.save({
|
|
243
|
+
name: kpiData.name,
|
|
244
|
+
description: kpiData.description,
|
|
245
|
+
formula: kpiData.formula,
|
|
246
|
+
active: kpiData.active,
|
|
247
|
+
state: kpiData.state ? kpi_1.KpiStatus[kpiData.state] : kpi_1.KpiStatus.DRAFT,
|
|
248
|
+
vizType: kpiData.viz_type ? kpi_1.KpiVizType[kpiData.viz_type] : null,
|
|
249
|
+
vizMeta: kpiData.viz_meta,
|
|
250
|
+
schedule: kpiData.schedule,
|
|
251
|
+
scheduleId: kpiData.schedule_id,
|
|
252
|
+
timezone: kpiData.timezone,
|
|
253
|
+
grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,
|
|
254
|
+
periodType: kpi_1.KpiPeriodType[kpiData.period_type],
|
|
255
|
+
weight: kpiData.weight,
|
|
256
|
+
scoreFormula: kpiData.score_formula,
|
|
257
|
+
isLeaf: kpiData.is_leaf,
|
|
258
|
+
parent: parentKpi,
|
|
259
|
+
domain
|
|
260
|
+
});
|
|
261
|
+
kpiNameMap.set(kpi.name, kpi);
|
|
262
|
+
console.log(`✅ Created child KPI: ${kpi.name} (parent: ${parentKpi.name})`);
|
|
263
|
+
}
|
|
264
|
+
console.log(`🎉 Successfully processed ${seedData.length} KPIs from JSON seed`);
|
|
265
|
+
}
|
|
266
|
+
catch (error) {
|
|
267
|
+
console.error('❌ Error seeding KPIs from JSON:', error);
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
async down(queryRunner) {
|
|
272
|
+
try {
|
|
273
|
+
const repository = (0, shell_1.getRepository)(kpi_1.Kpi);
|
|
274
|
+
const domainRepository = (0, shell_1.getRepository)(shell_1.Domain);
|
|
275
|
+
const domain = await domainRepository.findOneBy({ name: 'SYSTEM' });
|
|
276
|
+
if (!domain) {
|
|
277
|
+
console.log('⚠️ SYSTEM domain not found. Nothing to delete.');
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// JSON 파일 읽기
|
|
281
|
+
const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json');
|
|
282
|
+
const seedData = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'));
|
|
283
|
+
// 자식부터 삭제 (역순으로)
|
|
284
|
+
const childKpis = seedData.filter(kpi => kpi.parent_name !== null).reverse();
|
|
285
|
+
const rootKpis = seedData.filter(kpi => kpi.parent_name === null).reverse();
|
|
286
|
+
// 자식 KPI들 먼저 삭제
|
|
287
|
+
for (const kpiData of childKpis) {
|
|
288
|
+
const kpi = await repository.findOne({
|
|
289
|
+
where: { name: kpiData.name, domain: { id: domain.id } }
|
|
290
|
+
});
|
|
291
|
+
if (kpi) {
|
|
292
|
+
await repository.delete(kpi.id);
|
|
293
|
+
console.log(`✅ Deleted child KPI: ${kpiData.name}`);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// 루트 KPI들 삭제
|
|
297
|
+
for (const kpiData of rootKpis) {
|
|
298
|
+
const kpi = await repository.findOne({
|
|
299
|
+
where: { name: kpiData.name, domain: { id: domain.id } }
|
|
300
|
+
});
|
|
301
|
+
if (kpi) {
|
|
302
|
+
await repository.delete(kpi.id);
|
|
303
|
+
console.log(`✅ Deleted root KPI: ${kpiData.name}`);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
console.log(`🎉 Successfully cleaned up KPIs from JSON seed`);
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
console.error('❌ Error cleaning up KPIs:', error);
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
exports.SeedKpi1752190849681 = SeedKpi1752190849681;
|
|
315
|
+
//# sourceMappingURL=1752190849681-seed-kpi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"1752190849681-seed-kpi.js","sourceRoot":"","sources":["../../server/migrations/1752190849681-seed-kpi.ts"],"names":[],"mappings":"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","sourcesContent":["import { MigrationInterface, QueryRunner } from 'typeorm'\nimport { Domain, getRepository } from '@things-factory/shell'\nimport { Kpi, KpiStatus, KpiPeriodType, KpiVizType } from '../service/kpi/kpi'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nconst SEED = [\n // 일정성과 (Y1) - Schedule Performance\n {\n name: '연면적 대비 공사기간',\n description: '연면적 대비 공사기간 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공기 증감률',\n description: '설계변경에 따른 공기 증감률 평가',\n categoryName: '일정성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '일정 이탈 수준',\n description: '프로젝트 일정 이탈 수준 평가',\n categoryName: '일정성과',\n formula: 'Table(DART 등) 활용(1~5점)',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '일정성과 수준 평가',\n description: '일정성과 종합 평가',\n categoryName: '일정성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 비용성과 (Y2) - Cost Performance\n {\n name: '연면적 대비 공사비',\n description: '연면적 대비 공사비 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '설계변경에 따른 공사비 증감률',\n description: '설계변경에 따른 공사비 증감률 평가',\n categoryName: '비용성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '비용성과 수준 평가',\n description: '비용성과 종합 평가',\n categoryName: '비용성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 품질성과 (Y3) - Quality Performance\n {\n name: '품질시험 불합격률',\n description: '품질시험 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검수자재 불합격률',\n description: '검수자재 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '검측 불합격률',\n description: '검측 불합격률 평가',\n categoryName: '품질성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '품질 SL-PA 결과값',\n description: '품질 SL-PA 결과',\n categoryName: '품질성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '품질성과 수준 평가',\n description: '품질성과 종합 평가',\n categoryName: '품질성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 안전성과 (Y4) - Safety Performance\n {\n name: '재해율',\n description: '재해율 평가',\n categoryName: '안전성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '재해강도율',\n description: '재해강도율 평가',\n categoryName: '안전성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '안전 SL-PA 결과값',\n description: '안전 SL-PA 결과',\n categoryName: '안전성과',\n formula: 'Python 활용(1~5점)',\n scoreType: 'python',\n dataType: 'score'\n },\n {\n name: '안전성과 수준 평가',\n description: '안전성과 종합 평가',\n categoryName: '안전성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 환경성과 (Y5) - Environmental Performance\n {\n name: '건설폐기물 발생량',\n description: '건설폐기물 발생량 평가',\n categoryName: '환경성과',\n formula: 'Table 활용',\n scoreType: 'table',\n dataType: 'score'\n },\n {\n name: '환경성과 수준 평가',\n description: '환경성과 종합 평가',\n categoryName: '환경성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n },\n\n // 생산성성과 (Y6) - Productivity Performance\n {\n name: '투입인력 생산성',\n description: '투입인력 생산성 평가',\n categoryName: '생산성과',\n formula: 'Eq. 활용',\n scoreType: 'equation',\n dataType: 'ratio'\n },\n {\n name: '생산성성과 수준 평가',\n description: '생산성과 종합 평가',\n categoryName: '생산성과',\n formula: '감리자 1~5점 척도',\n scoreType: 'inspector',\n dataType: 'score'\n }\n]\n\ninterface KpiSeedData {\n name: string\n description: string\n formula?: string | null\n active: boolean\n state?: string | null\n viz_type?: string | null\n viz_meta?: any | null\n schedule?: string | null\n schedule_id?: string | null\n timezone?: string | null\n grades?: any | null\n period_type: string\n weight: number\n score_formula?: string | null\n is_leaf: boolean\n parent_name?: string | null\n}\n\nexport class SeedKpi1752190849681 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<any> {\n try {\n const repository = getRepository(Kpi)\n const domainRepository = getRepository(Domain)\n\n // SYSTEM 도메인 확인\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('❌ SYSTEM domain not found')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')\n const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n // 이름으로 KPI를 찾을 수 있는 맵 생성\n const kpiNameMap = new Map<string, Kpi>()\n\n // 1단계: parent_name이 null인 루트 KPI들 먼저 생성\n const rootKpis = seedData.filter(kpi => kpi.parent_name === null)\n\n for (const kpiData of rootKpis) {\n const existingKpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n\n if (existingKpi) {\n console.log(`⚠️ KPI already exists: ${kpiData.name}`)\n kpiNameMap.set(kpiData.name, existingKpi)\n continue\n }\n\n const kpi = await repository.save({\n name: kpiData.name,\n description: kpiData.description,\n formula: kpiData.formula,\n active: kpiData.active,\n state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,\n vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,\n vizMeta: kpiData.viz_meta,\n schedule: kpiData.schedule,\n scheduleId: kpiData.schedule_id,\n timezone: kpiData.timezone,\n grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,\n periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],\n weight: kpiData.weight,\n scoreFormula: kpiData.score_formula,\n isLeaf: kpiData.is_leaf,\n parent: null,\n domain\n })\n\n kpiNameMap.set(kpi.name, kpi)\n console.log(`✅ Created root KPI: ${kpi.name}`)\n }\n\n // 2단계: 자식 KPI들 생성 (parent_name이 있는 KPI들)\n const childKpis = seedData.filter(kpi => kpi.parent_name !== null)\n\n for (const kpiData of childKpis) {\n const existingKpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n\n if (existingKpi) {\n console.log(`⚠️ KPI already exists: ${kpiData.name}`)\n continue\n }\n\n // 부모 KPI 찾기\n const parentKpi = kpiNameMap.get(kpiData.parent_name!)\n if (!parentKpi) {\n console.log(`❌ Parent KPI not found: ${kpiData.parent_name} for ${kpiData.name}`)\n continue\n }\n\n const kpi = await repository.save({\n name: kpiData.name,\n description: kpiData.description,\n formula: kpiData.formula,\n active: kpiData.active,\n state: kpiData.state ? KpiStatus[kpiData.state as keyof typeof KpiStatus] : KpiStatus.DRAFT,\n vizType: kpiData.viz_type ? KpiVizType[kpiData.viz_type as keyof typeof KpiVizType] : null,\n vizMeta: kpiData.viz_meta,\n schedule: kpiData.schedule,\n scheduleId: kpiData.schedule_id,\n timezone: kpiData.timezone,\n grades: kpiData.grades ? JSON.parse(kpiData.grades) : null,\n periodType: KpiPeriodType[kpiData.period_type as keyof typeof KpiPeriodType],\n weight: kpiData.weight,\n scoreFormula: kpiData.score_formula,\n isLeaf: kpiData.is_leaf,\n parent: parentKpi,\n domain\n })\n\n kpiNameMap.set(kpi.name, kpi)\n console.log(`✅ Created child KPI: ${kpi.name} (parent: ${parentKpi.name})`)\n }\n\n console.log(`🎉 Successfully processed ${seedData.length} KPIs from JSON seed`)\n } catch (error) {\n console.error('❌ Error seeding KPIs from JSON:', error)\n throw error\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<any> {\n try {\n const repository = getRepository(Kpi)\n const domainRepository = getRepository(Domain)\n\n const domain: Domain = await domainRepository.findOneBy({ name: 'SYSTEM' })\n if (!domain) {\n console.log('⚠️ SYSTEM domain not found. Nothing to delete.')\n return\n }\n\n // JSON 파일 읽기\n const seedFilePath = path.join(__dirname, 'seed-data', 'kpis-seed.json')\n const seedData: KpiSeedData[] = JSON.parse(fs.readFileSync(seedFilePath, 'utf8'))\n\n // 자식부터 삭제 (역순으로)\n const childKpis = seedData.filter(kpi => kpi.parent_name !== null).reverse()\n const rootKpis = seedData.filter(kpi => kpi.parent_name === null).reverse()\n\n // 자식 KPI들 먼저 삭제\n for (const kpiData of childKpis) {\n const kpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n if (kpi) {\n await repository.delete(kpi.id)\n console.log(`✅ Deleted child KPI: ${kpiData.name}`)\n }\n }\n\n // 루트 KPI들 삭제\n for (const kpiData of rootKpis) {\n const kpi = await repository.findOne({\n where: { name: kpiData.name, domain: { id: domain.id } }\n })\n if (kpi) {\n await repository.delete(kpi.id)\n console.log(`✅ Deleted root KPI: ${kpiData.name}`)\n }\n }\n\n console.log(`🎉 Successfully cleaned up KPIs from JSON seed`)\n } catch (error) {\n console.error('❌ Error cleaning up KPIs:', error)\n throw error\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm';
|
|
2
|
+
export declare class AddGradesToKpi1752192090123 implements MigrationInterface {
|
|
3
|
+
name: string;
|
|
4
|
+
up(queryRunner: QueryRunner): Promise<void>;
|
|
5
|
+
down(queryRunner: QueryRunner): Promise<void>;
|
|
6
|
+
private loadGradeDataToKpi;
|
|
7
|
+
}
|