@things-factory/kpi 1.0.0-alpha.5 → 9.0.9

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.
Files changed (309) hide show
  1. package/README.md +74 -0
  2. package/client/pages/kpi/kpi-list-page.ts +97 -47
  3. package/client/pages/kpi/kpi-overview-sample.ts +260 -0
  4. package/client/pages/kpi/kpi-overview.ts +271 -0
  5. package/client/pages/kpi-category/kpi-category-list-page.ts +39 -50
  6. package/client/pages/kpi-dashboard/kpi-alert-panel.ts +114 -0
  7. package/client/pages/kpi-dashboard/kpi-dashboard.ts +285 -0
  8. package/client/pages/kpi-dashboard/kpi-grade-visualization.ts +75 -0
  9. package/client/pages/kpi-dashboard/kpi-history-viewer.ts +58 -0
  10. package/client/pages/kpi-dashboard/kpi-list-summary.ts +100 -0
  11. package/client/pages/kpi-dashboard/kpi-performance-summary.ts +124 -0
  12. package/client/pages/kpi-dashboard/kpi-value-entry.ts +78 -0
  13. package/client/pages/kpi-grade/kpi-grade-list-page.ts +58 -68
  14. package/client/pages/kpi-history/kpi-history-list-page.ts +146 -0
  15. package/client/pages/kpi-metric/kpi-metric-list-page.ts +67 -63
  16. package/client/pages/kpi-value/kpi-value-list-page.ts +73 -72
  17. package/client/pages/kpi-value/kpi-value-manual-entry-form.ts +168 -0
  18. package/client/pages/kpi-value/kpi-value-manual-entry-page.ts +173 -0
  19. package/client/route.ts +35 -0
  20. package/dist-client/pages/kpi/kpi-importer.js +16 -17
  21. package/dist-client/pages/kpi/kpi-importer.js.map +1 -1
  22. package/dist-client/pages/kpi/kpi-list-page.js +128 -68
  23. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  24. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
  25. package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
  26. package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
  27. package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
  28. package/dist-client/pages/kpi/kpi-overview.js +290 -0
  29. package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
  30. package/dist-client/pages/kpi-category/kpi-category-importer.js +16 -17
  31. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +1 -1
  32. package/dist-client/pages/kpi-category/kpi-category-list-page.js +70 -71
  33. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
  34. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  35. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
  36. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  37. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +24 -0
  38. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +305 -0
  39. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  40. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  41. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  42. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  43. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  44. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  45. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  46. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  47. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  48. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  49. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  50. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +139 -0
  51. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  52. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  53. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  54. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  55. package/dist-client/pages/kpi-grade/kpi-grade-importer.js +16 -17
  56. package/dist-client/pages/kpi-grade/kpi-grade-importer.js.map +1 -1
  57. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js +89 -89
  58. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js.map +1 -1
  59. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +16 -0
  60. package/dist-client/pages/kpi-history/kpi-history-list-page.js +155 -0
  61. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
  62. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +16 -17
  63. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -1
  64. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +98 -84
  65. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  66. package/dist-client/pages/kpi-value/kpi-value-importer.js +16 -17
  67. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -1
  68. package/dist-client/pages/kpi-value/kpi-value-list-page.js +104 -93
  69. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  70. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.d.ts +14 -0
  71. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js +201 -0
  72. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +1 -0
  73. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.d.ts +41 -0
  74. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js +180 -0
  75. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js.map +1 -0
  76. package/dist-client/route.d.ts +1 -1
  77. package/dist-client/route.js +27 -0
  78. package/dist-client/route.js.map +1 -1
  79. package/dist-client/tsconfig.tsbuildinfo +1 -1
  80. package/dist-server/index.d.ts +2 -1
  81. package/dist-server/index.js +2 -1
  82. package/dist-server/index.js.map +1 -1
  83. package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +5 -0
  84. package/dist-server/migrations/1752188906708-SeedKpiCategory.js +56 -0
  85. package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +1 -0
  86. package/dist-server/migrations/1752190849681-SeedKpi.d.ts +5 -0
  87. package/dist-server/migrations/1752190849681-SeedKpi.js +107 -0
  88. package/dist-server/migrations/1752190849681-SeedKpi.js.map +1 -0
  89. package/dist-server/migrations/1752191090459-SeedKpiGrade.d.ts +5 -0
  90. package/dist-server/migrations/1752191090459-SeedKpiGrade.js +271 -0
  91. package/dist-server/migrations/1752191090459-SeedKpiGrade.js.map +1 -0
  92. package/dist-server/migrations/index.d.ts +1 -0
  93. package/dist-server/migrations/index.js +12 -0
  94. package/dist-server/migrations/index.js.map +1 -0
  95. package/dist-server/routes.d.ts +1 -0
  96. package/dist-server/routes.js +48 -0
  97. package/dist-server/routes.js.map +1 -1
  98. package/dist-server/service/index.d.ts +3 -4
  99. package/dist-server/service/index.js +4 -6
  100. package/dist-server/service/index.js.map +1 -1
  101. package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
  102. package/dist-server/service/kpi/aggregate-kpi.js +88 -0
  103. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
  104. package/dist-server/service/kpi/event-subscriber.d.ts +2 -0
  105. package/dist-server/service/kpi/event-subscriber.js +10 -0
  106. package/dist-server/service/kpi/event-subscriber.js.map +1 -1
  107. package/dist-server/service/kpi/index.d.ts +2 -1
  108. package/dist-server/service/kpi/kpi-formula.service.d.ts +24 -0
  109. package/dist-server/service/kpi/kpi-formula.service.js +64 -0
  110. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
  111. package/dist-server/service/kpi/kpi-history.d.ts +6 -2
  112. package/dist-server/service/kpi/kpi-history.js +29 -11
  113. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  114. package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
  115. package/dist-server/service/kpi/kpi-mutation.js +215 -10
  116. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  117. package/dist-server/service/kpi/kpi-query.d.ts +10 -0
  118. package/dist-server/service/kpi/kpi-query.js +87 -3
  119. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  120. package/dist-server/service/kpi/kpi-type.d.ts +14 -3
  121. package/dist-server/service/kpi/kpi-type.js +81 -18
  122. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  123. package/dist-server/service/kpi/kpi.d.ts +14 -3
  124. package/dist-server/service/kpi/kpi.js +96 -19
  125. package/dist-server/service/kpi/kpi.js.map +1 -1
  126. package/dist-server/service/kpi-alert/index.d.ts +2 -0
  127. package/dist-server/service/kpi-alert/index.js +6 -0
  128. package/dist-server/service/kpi-alert/index.js.map +1 -0
  129. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
  130. package/dist-server/service/kpi-alert/kpi-alert-query.js +71 -0
  131. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
  132. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
  133. package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
  134. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
  135. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
  136. package/dist-server/service/kpi-category/kpi-category-mutation.js +36 -10
  137. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
  138. package/dist-server/service/kpi-category/kpi-category-query.d.ts +2 -0
  139. package/dist-server/service/kpi-category/kpi-category-query.js +18 -2
  140. package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
  141. package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -5
  142. package/dist-server/service/kpi-category/kpi-category-type.js +16 -20
  143. package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
  144. package/dist-server/service/kpi-category/kpi-category.d.ts +7 -9
  145. package/dist-server/service/kpi-category/kpi-category.js +40 -38
  146. package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
  147. package/dist-server/service/kpi-grade/index.d.ts +1 -2
  148. package/dist-server/service/kpi-grade/index.js +2 -4
  149. package/dist-server/service/kpi-grade/index.js.map +1 -1
  150. package/dist-server/service/kpi-grade/kpi-grade-mutation.d.ts +1 -1
  151. package/dist-server/service/kpi-grade/kpi-grade-mutation.js +33 -10
  152. package/dist-server/service/kpi-grade/kpi-grade-mutation.js.map +1 -1
  153. package/dist-server/service/kpi-grade/kpi-grade-query.js +2 -2
  154. package/dist-server/service/kpi-grade/kpi-grade-query.js.map +1 -1
  155. package/dist-server/service/kpi-grade/kpi-grade-type.d.ts +13 -4
  156. package/dist-server/service/kpi-grade/kpi-grade-type.js +54 -18
  157. package/dist-server/service/kpi-grade/kpi-grade-type.js.map +1 -1
  158. package/dist-server/service/kpi-grade/kpi-grade.d.ts +8 -8
  159. package/dist-server/service/kpi-grade/kpi-grade.js +48 -40
  160. package/dist-server/service/kpi-grade/kpi-grade.js.map +1 -1
  161. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
  162. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +134 -0
  163. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
  164. package/dist-server/service/kpi-metric/index.d.ts +1 -2
  165. package/dist-server/service/kpi-metric/index.js +2 -4
  166. package/dist-server/service/kpi-metric/index.js.map +1 -1
  167. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +1 -1
  168. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +139 -13
  169. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
  170. package/dist-server/service/kpi-metric/kpi-metric-query.js +3 -3
  171. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -1
  172. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +17 -4
  173. package/dist-server/service/kpi-metric/kpi-metric-type.js +69 -11
  174. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
  175. package/dist-server/service/kpi-metric/kpi-metric.d.ts +11 -8
  176. package/dist-server/service/kpi-metric/kpi-metric.js +62 -37
  177. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
  178. package/dist-server/service/kpi-value/kpi-value-mutation.js +66 -11
  179. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  180. package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -0
  181. package/dist-server/service/kpi-value/kpi-value-query.js +15 -2
  182. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  183. package/dist-server/service/kpi-value/kpi-value-type.d.ts +19 -10
  184. package/dist-server/service/kpi-value/kpi-value-type.js +87 -24
  185. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  186. package/dist-server/service/kpi-value/kpi-value.d.ts +15 -9
  187. package/dist-server/service/kpi-value/kpi-value.js +86 -32
  188. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  189. package/dist-server/tsconfig.tsbuildinfo +1 -1
  190. package/implement-plan/01-entity-type-resolver.md +57 -0
  191. package/implement-plan/02-dataset-integration.md +35 -0
  192. package/implement-plan/03-kpivalue-automation.md +34 -0
  193. package/implement-plan/04-version-history.md +33 -0
  194. package/implement-plan/05-grade-visualization.md +33 -0
  195. package/implement-plan/06-graphql-frontend.md +30 -0
  196. package/implement-plan/07-test-docs.md +35 -0
  197. package/implement-plan/TODO.md +41 -0
  198. package/package.json +18 -6
  199. package/server/index.ts +2 -1
  200. package/server/migrations/1752188906708-SeedKpiCategory.ts +61 -0
  201. package/server/migrations/1752190849681-SeedKpi.ts +112 -0
  202. package/server/migrations/1752191090459-SeedKpiGrade.ts +270 -0
  203. package/server/migrations/index.ts +9 -0
  204. package/server/routes.ts +55 -0
  205. package/server/service/index.ts +4 -6
  206. package/server/service/kpi/aggregate-kpi.ts +82 -0
  207. package/server/service/kpi/event-subscriber.ts +12 -0
  208. package/server/service/kpi/kpi-formula.service.ts +63 -0
  209. package/server/service/kpi/kpi-history.ts +29 -21
  210. package/server/service/kpi/kpi-mutation.ts +194 -12
  211. package/server/service/kpi/kpi-query.ts +57 -2
  212. package/server/service/kpi/kpi-type.ts +72 -19
  213. package/server/service/kpi/kpi.ts +96 -20
  214. package/server/service/kpi-alert/index.ts +3 -0
  215. package/server/service/kpi-alert/kpi-alert-query.ts +59 -0
  216. package/server/service/kpi-alert/kpi-alert-type.ts +20 -0
  217. package/server/service/kpi-category/kpi-category-mutation.ts +17 -4
  218. package/server/service/kpi-category/kpi-category-query.ts +20 -3
  219. package/server/service/kpi-category/kpi-category-type.ts +17 -19
  220. package/server/service/kpi-category/kpi-category.ts +39 -37
  221. package/server/service/kpi-grade/index.ts +2 -4
  222. package/server/service/kpi-grade/kpi-grade-mutation.ts +13 -4
  223. package/server/service/kpi-grade/kpi-grade-query.ts +5 -2
  224. package/server/service/kpi-grade/kpi-grade-type.ts +46 -19
  225. package/server/service/kpi-grade/kpi-grade.ts +44 -38
  226. package/server/service/kpi-metric/aggregate-kpi-metric.ts +128 -0
  227. package/server/service/kpi-metric/index.ts +2 -4
  228. package/server/service/kpi-metric/kpi-metric-mutation.ts +123 -7
  229. package/server/service/kpi-metric/kpi-metric-query.ts +9 -3
  230. package/server/service/kpi-metric/kpi-metric-type.ts +56 -13
  231. package/server/service/kpi-metric/kpi-metric.ts +55 -35
  232. package/server/service/kpi-value/kpi-value-mutation.ts +52 -14
  233. package/server/service/kpi-value/kpi-value-query.ts +12 -2
  234. package/server/service/kpi-value/kpi-value-type.ts +80 -25
  235. package/server/service/kpi-value/kpi-value.ts +81 -29
  236. package/things-factory.config.js +12 -4
  237. package/translations/en.json +12 -1
  238. package/translations/ja.json +12 -1
  239. package/translations/ko.json +12 -1
  240. package/translations/ms.json +12 -1
  241. package/translations/zh.json +12 -1
  242. package/client/pages/kpe-metric/kpe-metric-importer.ts +0 -90
  243. package/client/pages/kpe-metric/kpe-metric-list-page.ts +0 -398
  244. package/client/pages/kpi-formula/kpi-formula-importer.ts +0 -90
  245. package/client/pages/kpi-formula/kpi-formula-list-page.ts +0 -398
  246. package/client/pages/metric/metric-importer.ts +0 -90
  247. package/client/pages/metric/metric-list-page.ts +0 -398
  248. package/dist-client/pages/kpe-metric/kpe-metric-importer.d.ts +0 -23
  249. package/dist-client/pages/kpe-metric/kpe-metric-importer.js +0 -93
  250. package/dist-client/pages/kpe-metric/kpe-metric-importer.js.map +0 -1
  251. package/dist-client/pages/kpe-metric/kpe-metric-list-page.d.ts +0 -66
  252. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js +0 -370
  253. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js.map +0 -1
  254. package/dist-client/pages/kpi-formula/kpi-formula-importer.d.ts +0 -23
  255. package/dist-client/pages/kpi-formula/kpi-formula-importer.js +0 -93
  256. package/dist-client/pages/kpi-formula/kpi-formula-importer.js.map +0 -1
  257. package/dist-client/pages/kpi-formula/kpi-formula-list-page.d.ts +0 -66
  258. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js +0 -370
  259. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js.map +0 -1
  260. package/dist-client/pages/metric/metric-importer.d.ts +0 -23
  261. package/dist-client/pages/metric/metric-importer.js +0 -93
  262. package/dist-client/pages/metric/metric-importer.js.map +0 -1
  263. package/dist-client/pages/metric/metric-list-page.d.ts +0 -66
  264. package/dist-client/pages/metric/metric-list-page.js +0 -370
  265. package/dist-client/pages/metric/metric-list-page.js.map +0 -1
  266. package/dist-server/service/kpi-formula/event-subscriber.d.ts +0 -7
  267. package/dist-server/service/kpi-formula/event-subscriber.js +0 -21
  268. package/dist-server/service/kpi-formula/event-subscriber.js.map +0 -1
  269. package/dist-server/service/kpi-formula/index.d.ts +0 -7
  270. package/dist-server/service/kpi-formula/index.js +0 -12
  271. package/dist-server/service/kpi-formula/index.js.map +0 -1
  272. package/dist-server/service/kpi-formula/kpi-formula-history.d.ts +0 -25
  273. package/dist-server/service/kpi-formula/kpi-formula-history.js +0 -128
  274. package/dist-server/service/kpi-formula/kpi-formula-history.js.map +0 -1
  275. package/dist-server/service/kpi-formula/kpi-formula-mutation.d.ts +0 -10
  276. package/dist-server/service/kpi-formula/kpi-formula-mutation.js +0 -128
  277. package/dist-server/service/kpi-formula/kpi-formula-mutation.js.map +0 -1
  278. package/dist-server/service/kpi-formula/kpi-formula-query.d.ts +0 -11
  279. package/dist-server/service/kpi-formula/kpi-formula-query.js +0 -79
  280. package/dist-server/service/kpi-formula/kpi-formula-query.js.map +0 -1
  281. package/dist-server/service/kpi-formula/kpi-formula-type.d.ts +0 -20
  282. package/dist-server/service/kpi-formula/kpi-formula-type.js +0 -77
  283. package/dist-server/service/kpi-formula/kpi-formula-type.js.map +0 -1
  284. package/dist-server/service/kpi-formula/kpi-formula.d.ts +0 -24
  285. package/dist-server/service/kpi-formula/kpi-formula.js +0 -109
  286. package/dist-server/service/kpi-formula/kpi-formula.js.map +0 -1
  287. package/dist-server/service/kpi-grade/event-subscriber.d.ts +0 -7
  288. package/dist-server/service/kpi-grade/event-subscriber.js +0 -21
  289. package/dist-server/service/kpi-grade/event-subscriber.js.map +0 -1
  290. package/dist-server/service/kpi-grade/kpi-grade-history.d.ts +0 -25
  291. package/dist-server/service/kpi-grade/kpi-grade-history.js +0 -128
  292. package/dist-server/service/kpi-grade/kpi-grade-history.js.map +0 -1
  293. package/dist-server/service/kpi-metric/event-subscriber.d.ts +0 -7
  294. package/dist-server/service/kpi-metric/event-subscriber.js +0 -21
  295. package/dist-server/service/kpi-metric/event-subscriber.js.map +0 -1
  296. package/dist-server/service/kpi-metric/kpi-metric-history.d.ts +0 -25
  297. package/dist-server/service/kpi-metric/kpi-metric-history.js +0 -128
  298. package/dist-server/service/kpi-metric/kpi-metric-history.js.map +0 -1
  299. package/server/service/kpi-formula/event-subscriber.ts +0 -17
  300. package/server/service/kpi-formula/index.ts +0 -9
  301. package/server/service/kpi-formula/kpi-formula-history.ts +0 -116
  302. package/server/service/kpi-formula/kpi-formula-mutation.ts +0 -137
  303. package/server/service/kpi-formula/kpi-formula-query.ts +0 -48
  304. package/server/service/kpi-formula/kpi-formula-type.ts +0 -55
  305. package/server/service/kpi-formula/kpi-formula.ts +0 -95
  306. package/server/service/kpi-grade/event-subscriber.ts +0 -17
  307. package/server/service/kpi-grade/kpi-grade-history.ts +0 -116
  308. package/server/service/kpi-metric/event-subscriber.ts +0 -17
  309. package/server/service/kpi-metric/kpi-metric-history.ts +0 -116
@@ -0,0 +1,285 @@
1
+ import { html, css, nothing } from 'lit'
2
+ import { customElement } from 'lit/decorators.js'
3
+ import { PageView } from '@operato/shell'
4
+ import { ScrollbarStyles } from '@operato/styles'
5
+ import { client } from '@operato/graphql'
6
+ import gql from 'graphql-tag'
7
+ import { state } from 'lit/decorators.js'
8
+
9
+ import './kpi-performance-summary'
10
+ import './kpi-grade-visualization'
11
+ import './kpi-history-viewer'
12
+ import './kpi-list-summary'
13
+ import './kpi-value-entry'
14
+ import './kpi-alert-panel'
15
+
16
+ @customElement('kpi-dashboard')
17
+ export class KpiDashboardPage extends PageView {
18
+ static styles = [
19
+ ScrollbarStyles,
20
+ css`
21
+ :host {
22
+ display: flex;
23
+ flex-direction: column;
24
+ overflow-y: auto;
25
+ }
26
+ .dashboard-root {
27
+ flex: 1;
28
+ padding: 24px;
29
+ }
30
+ .category-section {
31
+ margin-bottom: 40px;
32
+ }
33
+ .category-title {
34
+ font-size: 1.3rem;
35
+ font-weight: bold;
36
+ margin-bottom: 16px;
37
+ }
38
+ .kpi-cards {
39
+ display: flex;
40
+ gap: 24px;
41
+ flex-wrap: wrap;
42
+ }
43
+ .kpi-card {
44
+ background: #fff;
45
+ border-radius: 12px;
46
+ padding: 24px 32px;
47
+ min-width: 220px;
48
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
49
+ display: flex;
50
+ flex-direction: column;
51
+ align-items: flex-start;
52
+ margin-bottom: 8px;
53
+ border: 1px solid #ececec;
54
+ }
55
+ .kpi-name {
56
+ font-size: 1.1rem;
57
+ font-weight: 500;
58
+ margin-bottom: 8px;
59
+ }
60
+ .kpi-value {
61
+ font-size: 2.2rem;
62
+ font-weight: bold;
63
+ color: #3a3ad6;
64
+ margin-bottom: 4px;
65
+ }
66
+ .kpi-target {
67
+ font-size: 1rem;
68
+ color: #888;
69
+ }
70
+ `
71
+ ]
72
+
73
+ @state() categories: any[] = []
74
+ @state() loading = true
75
+ @state() error = ''
76
+ @state() alerts: any[] = []
77
+ @state() showHistoryModal: boolean = false
78
+ @state() modalHistories: any[] = []
79
+ @state() modalKpiName: string = ''
80
+
81
+ connectedCallback() {
82
+ super.connectedCallback()
83
+ this.fetchCategories()
84
+ }
85
+
86
+ async fetchCategories() {
87
+ this.loading = true
88
+ this.error = ''
89
+ try {
90
+ const response = await client.query({
91
+ query: gql`
92
+ query {
93
+ kpiCategories {
94
+ items {
95
+ id
96
+ name
97
+ kpis {
98
+ id
99
+ name
100
+ value {
101
+ value
102
+ valueDate
103
+ }
104
+ targetValue
105
+ unit
106
+ grades {
107
+ name
108
+ minValue
109
+ maxValue
110
+ score
111
+ color
112
+ }
113
+ histories(limit: 1) {
114
+ version
115
+ updatedAt
116
+ updater {
117
+ name
118
+ }
119
+ }
120
+ }
121
+ }
122
+ }
123
+ kpiAlerts {
124
+ id
125
+ kpi {
126
+ id
127
+ }
128
+ message
129
+ level
130
+ createdAt
131
+ }
132
+ }
133
+ `
134
+ })
135
+ this.categories = response.data.kpiCategories.items || []
136
+ this.alerts = response.data.kpiAlerts || []
137
+ } catch (e) {
138
+ this.error = 'KPI 카테고리 데이터를 불러오지 못했습니다.'
139
+ } finally {
140
+ this.loading = false
141
+ }
142
+ }
143
+
144
+ async openHistoryModal(kpi) {
145
+ // 전체 이력 fetch (limit 없이)
146
+ try {
147
+ const response = await client.query({
148
+ query: gql`
149
+ query ($kpiId: String!) {
150
+ kpi(id: $kpiId) {
151
+ name
152
+ histories {
153
+ version
154
+ updatedAt
155
+ updater {
156
+ name
157
+ }
158
+ }
159
+ }
160
+ }
161
+ `,
162
+ variables: { kpiId: kpi.id }
163
+ })
164
+ this.modalHistories = response.data.kpi.histories || []
165
+ this.modalKpiName = response.data.kpi.name || ''
166
+ this.showHistoryModal = true
167
+ } catch (e) {
168
+ alert('이력 데이터를 불러오지 못했습니다.')
169
+ }
170
+ }
171
+ closeHistoryModal() {
172
+ this.showHistoryModal = false
173
+ this.modalHistories = []
174
+ this.modalKpiName = ''
175
+ }
176
+
177
+ get context() {
178
+ return {
179
+ title: 'KPI 대시보드',
180
+ description: '조직 KPI 실적, 등급, 이력, 시각화 등 KPI 전용 대시보드'
181
+ } as any
182
+ }
183
+
184
+ render() {
185
+ if (this.loading) return nothing
186
+ if (this.error) return html`<div>${this.error}</div>`
187
+ return html`
188
+ <div class="dashboard-root">
189
+ ${this.showHistoryModal
190
+ ? html`
191
+ <div
192
+ style="position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.25);z-index:1000;display:flex;align-items:center;justify-content:center;"
193
+ >
194
+ <div
195
+ style="background:#fff;padding:32px 40px;border-radius:16px;min-width:340px;max-width:90vw;max-height:80vh;overflow:auto;box-shadow:0 4px 24px rgba(0,0,0,0.15);"
196
+ >
197
+ <div style="font-size:1.2rem;font-weight:bold;margin-bottom:16px;">
198
+ ${this.modalKpiName} 변경 이력
199
+ </div>
200
+ <ul style="padding:0;list-style:none;">
201
+ ${this.modalHistories.length === 0
202
+ ? html`<li style="color:#bbb;">이력이 없습니다.</li>`
203
+ : this.modalHistories.map(
204
+ h =>
205
+ html`<li style="margin-bottom:8px;">
206
+ v${h.version} (${h.updatedAt?.slice(0, 10) ?? ''} ${h.updater?.name ?? ''})
207
+ </li>`
208
+ )}
209
+ </ul>
210
+ <button style="margin-top:16px;padding:6px 18px;" @click=${() => this.closeHistoryModal()}>
211
+ 닫기
212
+ </button>
213
+ </div>
214
+ </div>
215
+ `
216
+ : nothing}
217
+ ${this.categories.map(
218
+ cat => html`
219
+ <div class="category-section">
220
+ <div class="category-title">${cat.name}</div>
221
+ <div class="kpi-cards">
222
+ ${(cat.kpis || []).map(
223
+ kpi => html`
224
+ <div class="kpi-card">
225
+ <div class="kpi-name">${kpi.name}</div>
226
+ <div class="kpi-value">${kpi.value?.value ?? '데이터 없음'}${kpi.unit ?? ''}</div>
227
+ <div class="kpi-target">목표: ${kpi.targetValue ?? '-'}${kpi.unit ?? ''}</div>
228
+ <!-- 등급 시각화 -->
229
+ <div style="margin-top:8px;">
230
+ <b>등급:</b>
231
+ ${(kpi.grades || []).map(
232
+ g =>
233
+ html`<span
234
+ style="display:inline-block;margin-right:8px;padding:2px 8px;border-radius:8px;background:${g.color ??
235
+ '#eee'};color:#222;font-size:0.95em;"
236
+ >${g.name}(${g.minValue}~${g.maxValue}${kpi.unit ?? ''}, ${g.score ?? ''}점)</span
237
+ >`
238
+ )}
239
+ </div>
240
+ <!-- 최근 변경 이력(1건만) -->
241
+ <div style="margin-top:8px;font-size:0.95em;color:#888;">
242
+ <b>최근 변경:</b>
243
+ ${kpi.histories && kpi.histories.length > 0
244
+ ? html`<span style="margin-right:8px;"
245
+ >v${kpi.histories[0].version} (${kpi.histories[0].updatedAt?.slice(0, 10) ?? ''}
246
+ ${kpi.histories[0].updater?.name ?? ''})</span
247
+ >`
248
+ : html`<span style="color:#bbb">없음</span>`}
249
+ <button
250
+ style="margin-left:8px;font-size:0.95em;padding:2px 8px;"
251
+ @click=${() => this.openHistoryModal(kpi)}
252
+ >
253
+ 더보기
254
+ </button>
255
+ </div>
256
+ <!-- 경고/알림 -->
257
+ <div style="margin-top:8px;">
258
+ ${this.alerts.filter(a => a.kpi?.id === kpi.id).length > 0
259
+ ? this.alerts
260
+ .filter(a => a.kpi?.id === kpi.id)
261
+ .map(
262
+ a =>
263
+ html`<span
264
+ style="display:inline-block;margin-right:8px;padding:2px 8px;border-radius:8px;background:${a.level ===
265
+ 'critical'
266
+ ? '#ffb3b3'
267
+ : a.level === 'warning'
268
+ ? '#ffe082'
269
+ : '#e0e0e0'};color:#b71c1c;font-size:0.95em;"
270
+ >${a.message}</span
271
+ >`
272
+ )
273
+ : html`<span style="color:#4caf50;font-size:0.95em;">이상/경고 없음</span>`}
274
+ </div>
275
+ </div>
276
+ `
277
+ )}
278
+ </div>
279
+ </div>
280
+ `
281
+ )}
282
+ </div>
283
+ `
284
+ }
285
+ }
@@ -0,0 +1,75 @@
1
+ import { html, css, LitElement } from 'lit'
2
+ import { customElement, state } from 'lit/decorators.js'
3
+
4
+ @customElement('kpi-grade-visualization')
5
+ export class KpiGradeVisualization extends LitElement {
6
+ static styles = css`
7
+ .grade-container {
8
+ background: #fff;
9
+ border-radius: 16px;
10
+ padding: 32px;
11
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
12
+ margin-bottom: 16px;
13
+ }
14
+ .grade-title {
15
+ font-size: 1.5rem;
16
+ font-weight: bold;
17
+ margin-bottom: 16px;
18
+ }
19
+ .grade-cards {
20
+ display: flex;
21
+ gap: 24px;
22
+ flex-wrap: wrap;
23
+ }
24
+ .grade-card {
25
+ background: #f0f7fa;
26
+ border-radius: 12px;
27
+ padding: 20px 28px;
28
+ min-width: 180px;
29
+ flex: 1;
30
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03);
31
+ display: flex;
32
+ flex-direction: column;
33
+ align-items: flex-start;
34
+ }
35
+ .grade-label {
36
+ font-size: 1.1rem;
37
+ font-weight: 500;
38
+ margin-bottom: 8px;
39
+ }
40
+ .grade-value {
41
+ font-size: 2rem;
42
+ font-weight: bold;
43
+ margin-bottom: 4px;
44
+ }
45
+ .grade-desc {
46
+ font-size: 1rem;
47
+ color: #888;
48
+ }
49
+ `
50
+
51
+ @state() grades = [
52
+ { kpi: '불량률', grade: 'A', color: '#4caf50', desc: '우수', value: 0.8 },
53
+ { kpi: '불량률', grade: 'B', color: '#ff9800', desc: '양호', value: 1.5 },
54
+ { kpi: '불량률', grade: 'C', color: '#f44336', desc: '주의', value: 2.7 }
55
+ ]
56
+
57
+ render() {
58
+ return html`
59
+ <div class="grade-container">
60
+ <div class="grade-title">KPI 등급/구간 시각화</div>
61
+ <div class="grade-cards">
62
+ ${this.grades.map(
63
+ g => html`
64
+ <div class="grade-card" style="border-left: 8px solid ${g.color}">
65
+ <div class="grade-label">${g.kpi} - ${g.grade}등급</div>
66
+ <div class="grade-value" style="color:${g.color}">${g.value}</div>
67
+ <div class="grade-desc">${g.desc}</div>
68
+ </div>
69
+ `
70
+ )}
71
+ </div>
72
+ </div>
73
+ `
74
+ }
75
+ }
@@ -0,0 +1,58 @@
1
+ import { html, css, LitElement } from 'lit'
2
+ import { customElement, state } from 'lit/decorators.js'
3
+
4
+ @customElement('kpi-history-viewer')
5
+ export class KpiHistoryViewer extends LitElement {
6
+ static styles = css`
7
+ .history-container {
8
+ background: #fff;
9
+ border-radius: 16px;
10
+ padding: 32px;
11
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
12
+ margin-bottom: 16px;
13
+ }
14
+ .history-title {
15
+ font-size: 1.5rem;
16
+ font-weight: bold;
17
+ margin-bottom: 16px;
18
+ }
19
+ .history-list {
20
+ list-style: none;
21
+ padding: 0;
22
+ margin: 0;
23
+ }
24
+ .history-item {
25
+ padding: 12px 0;
26
+ border-bottom: 1px solid #eee;
27
+ font-size: 1.1rem;
28
+ }
29
+ .history-meta {
30
+ color: #888;
31
+ font-size: 0.95rem;
32
+ }
33
+ `
34
+
35
+ @state() histories = [
36
+ { date: '2024-06-01', action: 'Release', user: '홍길동', desc: '불량률 KPI 산식 변경 및 버전 Release' },
37
+ { date: '2024-05-15', action: 'Revert', user: '김감리', desc: '불량률 KPI 이전 버전 복원' },
38
+ { date: '2024-05-01', action: 'Release', user: '홍길동', desc: '불량률 KPI 신규 등록 및 Release' }
39
+ ]
40
+
41
+ render() {
42
+ return html`
43
+ <div class="history-container">
44
+ <div class="history-title">KPI 이력/버전 관리</div>
45
+ <ul class="history-list">
46
+ ${this.histories.map(
47
+ h => html`
48
+ <li class="history-item">
49
+ <div>${h.action} - ${h.desc}</div>
50
+ <div class="history-meta">${h.date} / ${h.user}</div>
51
+ </li>
52
+ `
53
+ )}
54
+ </ul>
55
+ </div>
56
+ `
57
+ }
58
+ }
@@ -0,0 +1,100 @@
1
+ import { html, css, LitElement } from 'lit'
2
+ import { customElement, state } from 'lit/decorators.js'
3
+ import { client } from '@operato/graphql'
4
+ import gql from 'graphql-tag'
5
+
6
+ @customElement('kpi-list-summary')
7
+ export class KpiListSummary extends LitElement {
8
+ static styles = css`
9
+ .list-container {
10
+ background: #fff;
11
+ border-radius: 16px;
12
+ padding: 32px;
13
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
14
+ margin-bottom: 16px;
15
+ }
16
+ .list-title {
17
+ font-size: 1.5rem;
18
+ font-weight: bold;
19
+ margin-bottom: 16px;
20
+ }
21
+ .kpi-list {
22
+ list-style: none;
23
+ padding: 0;
24
+ margin: 0;
25
+ }
26
+ .kpi-item {
27
+ padding: 10px 0;
28
+ border-bottom: 1px solid #eee;
29
+ font-size: 1.1rem;
30
+ cursor: pointer;
31
+ transition: background 0.2s;
32
+ }
33
+ .kpi-item:hover {
34
+ background: #f0f0f0;
35
+ }
36
+ `
37
+
38
+ @state() kpis: Array<{ name: string; desc: string }> = []
39
+ @state() loading = true
40
+ @state() error = ''
41
+
42
+ connectedCallback() {
43
+ super.connectedCallback()
44
+ this.fetchKpis()
45
+ }
46
+
47
+ async fetchKpis() {
48
+ this.loading = true
49
+ this.error = ''
50
+ try {
51
+ const response = await client.query({
52
+ query: gql`
53
+ query {
54
+ kpis {
55
+ items {
56
+ id
57
+ name
58
+ description
59
+ formula
60
+ }
61
+ total
62
+ }
63
+ }
64
+ `
65
+ })
66
+ this.kpis = (response.data.kpis.items || []).map(kpi => ({
67
+ name: kpi.name,
68
+ desc: kpi.formula || kpi.description || ''
69
+ }))
70
+ } catch (e) {
71
+ this.error = 'KPI 목록을 불러오지 못했습니다.'
72
+ } finally {
73
+ this.loading = false
74
+ }
75
+ }
76
+
77
+ render() {
78
+ if (this.loading) {
79
+ return html`<div class="list-container">로딩 중...</div>`
80
+ }
81
+ if (this.error) {
82
+ return html`<div class="list-container">${this.error}</div>`
83
+ }
84
+ return html`
85
+ <div class="list-container">
86
+ <div class="list-title">KPI 목록/검색/상세</div>
87
+ <ul class="kpi-list">
88
+ ${this.kpis.map(
89
+ kpi => html`
90
+ <li class="kpi-item">
91
+ <div><b>${kpi.name}</b></div>
92
+ <div style="font-size:0.95rem;color:#888;">${kpi.desc}</div>
93
+ </li>
94
+ `
95
+ )}
96
+ </ul>
97
+ </div>
98
+ `
99
+ }
100
+ }
@@ -0,0 +1,124 @@
1
+ import { html, css, LitElement } from 'lit'
2
+ import { customElement, state } from 'lit/decorators.js'
3
+ import { client } from '@operato/graphql'
4
+ import gql from 'graphql-tag'
5
+
6
+ @customElement('kpi-performance-summary')
7
+ export class KpiPerformanceSummary extends LitElement {
8
+ static styles = css`
9
+ .summary-container {
10
+ background: #fff;
11
+ border-radius: 16px;
12
+ padding: 32px;
13
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
14
+ margin-bottom: 16px;
15
+ }
16
+ .summary-title {
17
+ font-size: 1.5rem;
18
+ font-weight: bold;
19
+ margin-bottom: 16px;
20
+ }
21
+ .kpi-cards {
22
+ display: flex;
23
+ gap: 24px;
24
+ flex-wrap: wrap;
25
+ }
26
+ .kpi-card {
27
+ background: #f7f7fa;
28
+ border-radius: 12px;
29
+ padding: 24px 32px;
30
+ min-width: 220px;
31
+ flex: 1;
32
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03);
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: flex-start;
36
+ }
37
+ .kpi-name {
38
+ font-size: 1.1rem;
39
+ font-weight: 500;
40
+ margin-bottom: 8px;
41
+ }
42
+ .kpi-value {
43
+ font-size: 2.2rem;
44
+ font-weight: bold;
45
+ color: #3a3ad6;
46
+ margin-bottom: 4px;
47
+ }
48
+ .kpi-target {
49
+ font-size: 1rem;
50
+ color: #888;
51
+ }
52
+ `
53
+
54
+ @state() kpis: Array<{ name: string; value: string | number; target: string | number; unit: string }> = []
55
+ @state() loading = true
56
+ @state() error = ''
57
+
58
+ connectedCallback() {
59
+ super.connectedCallback()
60
+ this.fetchKpis()
61
+ }
62
+
63
+ async fetchKpis() {
64
+ this.loading = true
65
+ this.error = ''
66
+ try {
67
+ const response = await client.query({
68
+ query: gql`
69
+ query {
70
+ kpis {
71
+ items {
72
+ id
73
+ name
74
+ description
75
+ value {
76
+ value
77
+ valueDate
78
+ }
79
+ targetValue
80
+ unit
81
+ }
82
+ total
83
+ }
84
+ }
85
+ `
86
+ })
87
+ this.kpis = (response.data.kpis.items || []).map(kpi => ({
88
+ name: kpi.name,
89
+ value: kpi.value?.value ?? '-',
90
+ target: kpi.targetValue ?? '-',
91
+ unit: kpi.unit ?? ''
92
+ }))
93
+ } catch (e) {
94
+ this.error = 'KPI 데이터를 불러오지 못했습니다.'
95
+ } finally {
96
+ this.loading = false
97
+ }
98
+ }
99
+
100
+ render() {
101
+ if (this.loading) {
102
+ return html`<div class="summary-container">로딩 중...</div>`
103
+ }
104
+ if (this.error) {
105
+ return html`<div class="summary-container">${this.error}</div>`
106
+ }
107
+ return html`
108
+ <div class="summary-container">
109
+ <div class="summary-title">KPI 실적 현황</div>
110
+ <div class="kpi-cards">
111
+ ${this.kpis.map(
112
+ kpi => html`
113
+ <div class="kpi-card">
114
+ <div class="kpi-name">${kpi.name}</div>
115
+ <div class="kpi-value">${kpi.value}${kpi.unit}</div>
116
+ <div class="kpi-target">목표: ${kpi.target}${kpi.unit}</div>
117
+ </div>
118
+ `
119
+ )}
120
+ </div>
121
+ </div>
122
+ `
123
+ }
124
+ }