@things-factory/ops-master 10.0.19 โ†’ 10.1.0

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 (247) hide show
  1. package/dist-client/bootstrap.d.ts +18 -0
  2. package/dist-client/bootstrap.js +36 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +15 -1
  5. package/dist-client/index.js +18 -1
  6. package/dist-client/index.js.map +1 -1
  7. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  8. package/dist-client/pages/master/equipment-class.js +42 -0
  9. package/dist-client/pages/master/equipment-class.js.map +1 -0
  10. package/dist-client/pages/master/equipment.d.ts +12 -0
  11. package/dist-client/pages/master/equipment.js +57 -0
  12. package/dist-client/pages/master/equipment.js.map +1 -0
  13. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  14. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  15. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  16. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  17. package/dist-client/pages/master/grist-reference.js +419 -0
  18. package/dist-client/pages/master/grist-reference.js.map +1 -0
  19. package/dist-client/pages/master/import-rows.d.ts +35 -0
  20. package/dist-client/pages/master/import-rows.js +66 -0
  21. package/dist-client/pages/master/import-rows.js.map +1 -0
  22. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  23. package/dist-client/pages/master/iso-duration.js +76 -0
  24. package/dist-client/pages/master/iso-duration.js.map +1 -0
  25. package/dist-client/pages/master/master-options.d.ts +33 -0
  26. package/dist-client/pages/master/master-options.js +47 -0
  27. package/dist-client/pages/master/master-options.js.map +1 -0
  28. package/dist-client/pages/master/master-page-base.d.ts +357 -0
  29. package/dist-client/pages/master/master-page-base.js +626 -0
  30. package/dist-client/pages/master/master-page-base.js.map +1 -0
  31. package/dist-client/pages/master/material-class.d.ts +12 -0
  32. package/dist-client/pages/master/material-class.js +42 -0
  33. package/dist-client/pages/master/material-class.js.map +1 -0
  34. package/dist-client/pages/master/material-definition.d.ts +12 -0
  35. package/dist-client/pages/master/material-definition.js +62 -0
  36. package/dist-client/pages/master/material-definition.js.map +1 -0
  37. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  38. package/dist-client/pages/master/operation-definition.js +49 -0
  39. package/dist-client/pages/master/operation-definition.js.map +1 -0
  40. package/dist-client/pages/master/operational-location.d.ts +84 -0
  41. package/dist-client/pages/master/operational-location.js +426 -0
  42. package/dist-client/pages/master/operational-location.js.map +1 -0
  43. package/dist-client/pages/master/person.d.ts +12 -0
  44. package/dist-client/pages/master/person.js +41 -0
  45. package/dist-client/pages/master/person.js.map +1 -0
  46. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  47. package/dist-client/pages/master/personnel-class.js +43 -0
  48. package/dist-client/pages/master/personnel-class.js.map +1 -0
  49. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  50. package/dist-client/pages/master/physical-asset-class.js +40 -0
  51. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  52. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  53. package/dist-client/pages/master/physical-asset.js +41 -0
  54. package/dist-client/pages/master/physical-asset.js.map +1 -0
  55. package/dist-client/pages/master/recipe-definition.d.ts +136 -0
  56. package/dist-client/pages/master/recipe-definition.js +404 -0
  57. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  58. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  59. package/dist-client/pages/master/reference-targets.js +82 -0
  60. package/dist-client/pages/master/reference-targets.js.map +1 -0
  61. package/dist-client/pages/master/route-definition.d.ts +19 -0
  62. package/dist-client/pages/master/route-definition.js +40 -0
  63. package/dist-client/pages/master/route-definition.js.map +1 -0
  64. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  65. package/dist-client/pages/master/stop-reason.js +48 -0
  66. package/dist-client/pages/master/stop-reason.js.map +1 -0
  67. package/dist-client/pages/master/test-specification.d.ts +93 -0
  68. package/dist-client/pages/master/test-specification.js +449 -0
  69. package/dist-client/pages/master/test-specification.js.map +1 -0
  70. package/dist-client/pages/master-axes.d.ts +20 -29
  71. package/dist-client/pages/master-axes.js +32 -182
  72. package/dist-client/pages/master-axes.js.map +1 -1
  73. package/dist-client/route.d.ts +1 -1
  74. package/dist-client/route.js +76 -3
  75. package/dist-client/route.js.map +1 -1
  76. package/dist-client/tsconfig.tsbuildinfo +1 -1
  77. package/dist-server/service/asset/asset-lifecycle.d.ts +30 -7
  78. package/dist-server/service/asset/asset-lifecycle.js +33 -6
  79. package/dist-server/service/asset/asset-lifecycle.js.map +1 -1
  80. package/dist-server/service/asset/asset-master-resolver.d.ts +9 -0
  81. package/dist-server/service/asset/asset-master-resolver.js +41 -0
  82. package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
  83. package/dist-server/service/asset/asset-master.js +1 -1
  84. package/dist-server/service/asset/asset-master.js.map +1 -1
  85. package/dist-server/service/asset/asset-query.d.ts +9 -1
  86. package/dist-server/service/asset/asset-query.js +28 -6
  87. package/dist-server/service/asset/asset-query.js.map +1 -1
  88. package/dist-server/service/asset/physical-asset-class.js +1 -1
  89. package/dist-server/service/asset/physical-asset-class.js.map +1 -1
  90. package/dist-server/service/asset/physical-asset.d.ts +17 -4
  91. package/dist-server/service/asset/physical-asset.js +6 -6
  92. package/dist-server/service/asset/physical-asset.js.map +1 -1
  93. package/dist-server/service/equipment/equipment-class.js +1 -1
  94. package/dist-server/service/equipment/equipment-class.js.map +1 -1
  95. package/dist-server/service/equipment/equipment-master-resolver.d.ts +9 -0
  96. package/dist-server/service/equipment/equipment-master-resolver.js +58 -0
  97. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
  98. package/dist-server/service/equipment/equipment-master.d.ts +3 -2
  99. package/dist-server/service/equipment/equipment-master.js +21 -4
  100. package/dist-server/service/equipment/equipment-master.js.map +1 -1
  101. package/dist-server/service/equipment/equipment-query.d.ts +9 -1
  102. package/dist-server/service/equipment/equipment-query.js +28 -6
  103. package/dist-server/service/equipment/equipment-query.js.map +1 -1
  104. package/dist-server/service/equipment/equipment.d.ts +27 -1
  105. package/dist-server/service/equipment/equipment.js +8 -3
  106. package/dist-server/service/equipment/equipment.js.map +1 -1
  107. package/dist-server/service/equipment/state-period-rules.d.ts +19 -0
  108. package/dist-server/service/equipment/state-period-rules.js +35 -1
  109. package/dist-server/service/equipment/state-period-rules.js.map +1 -1
  110. package/dist-server/service/index.d.ts +4 -1
  111. package/dist-server/service/index.js +11 -2
  112. package/dist-server/service/index.js.map +1 -1
  113. package/dist-server/service/location/location-master-resolver.d.ts +29 -0
  114. package/dist-server/service/location/location-master-resolver.js +228 -1
  115. package/dist-server/service/location/location-master-resolver.js.map +1 -1
  116. package/dist-server/service/location/location-query.d.ts +9 -1
  117. package/dist-server/service/location/location-query.js +24 -9
  118. package/dist-server/service/location/location-query.js.map +1 -1
  119. package/dist-server/service/location/operational-location.d.ts +37 -0
  120. package/dist-server/service/location/operational-location.js +22 -2
  121. package/dist-server/service/location/operational-location.js.map +1 -1
  122. package/dist-server/service/master-axis.js +2 -2
  123. package/dist-server/service/master-axis.js.map +1 -1
  124. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  125. package/dist-server/service/master-conformance-resolver.js +143 -0
  126. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  127. package/dist-server/service/master-conformance.d.ts +80 -0
  128. package/dist-server/service/master-conformance.js +266 -0
  129. package/dist-server/service/master-conformance.js.map +1 -0
  130. package/dist-server/service/master-page-query.d.ts +33 -0
  131. package/dist-server/service/master-page-query.js +55 -0
  132. package/dist-server/service/master-page-query.js.map +1 -0
  133. package/dist-server/service/master-page.d.ts +85 -0
  134. package/dist-server/service/master-page.js +104 -0
  135. package/dist-server/service/master-page.js.map +1 -0
  136. package/dist-server/service/material/material-class.js +1 -1
  137. package/dist-server/service/material/material-class.js.map +1 -1
  138. package/dist-server/service/material/material-definition.js +2 -2
  139. package/dist-server/service/material/material-definition.js.map +1 -1
  140. package/dist-server/service/material/material-master-resolver.d.ts +62 -0
  141. package/dist-server/service/material/material-master-resolver.js +213 -0
  142. package/dist-server/service/material/material-master-resolver.js.map +1 -1
  143. package/dist-server/service/material/material-query.d.ts +9 -1
  144. package/dist-server/service/material/material-query.js +28 -6
  145. package/dist-server/service/material/material-query.js.map +1 -1
  146. package/dist-server/service/material/recipe-index.d.ts +23 -0
  147. package/dist-server/service/material/recipe-index.js +44 -0
  148. package/dist-server/service/material/recipe-index.js.map +1 -0
  149. package/dist-server/service/operation/operation-definition.d.ts +1 -1
  150. package/dist-server/service/operation/operation-definition.js +4 -4
  151. package/dist-server/service/operation/operation-definition.js.map +1 -1
  152. package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
  153. package/dist-server/service/operation/operation-master-resolver.js +107 -0
  154. package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
  155. package/dist-server/service/operation/operation-query.d.ts +10 -2
  156. package/dist-server/service/operation/operation-query.js +25 -10
  157. package/dist-server/service/operation/operation-query.js.map +1 -1
  158. package/dist-server/service/personnel/person.js +3 -3
  159. package/dist-server/service/personnel/person.js.map +1 -1
  160. package/dist-server/service/personnel/personnel-class.d.ts +1 -1
  161. package/dist-server/service/personnel/personnel-class.js +2 -2
  162. package/dist-server/service/personnel/personnel-class.js.map +1 -1
  163. package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
  164. package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
  165. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
  166. package/dist-server/service/personnel/personnel-master.js +1 -1
  167. package/dist-server/service/personnel/personnel-master.js.map +1 -1
  168. package/dist-server/service/personnel/personnel-query.d.ts +9 -1
  169. package/dist-server/service/personnel/personnel-query.js +28 -6
  170. package/dist-server/service/personnel/personnel-query.js.map +1 -1
  171. package/dist-server/service/recipe/recipe-definition.d.ts +3 -3
  172. package/dist-server/service/recipe/recipe-definition.js +3 -3
  173. package/dist-server/service/recipe/recipe-definition.js.map +1 -1
  174. package/dist-server/service/recipe/recipe-master-resolver.d.ts +1 -1
  175. package/dist-server/service/recipe/recipe-master-resolver.js +1 -1
  176. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -1
  177. package/dist-server/service/recipe/recipe-master.d.ts +1 -1
  178. package/dist-server/service/recipe/recipe-master.js +2 -2
  179. package/dist-server/service/recipe/recipe-master.js.map +1 -1
  180. package/dist-server/service/recipe/recipe-query.d.ts +11 -3
  181. package/dist-server/service/recipe/recipe-query.js +30 -9
  182. package/dist-server/service/recipe/recipe-query.js.map +1 -1
  183. package/dist-server/service/recipe/route-definition.d.ts +6 -6
  184. package/dist-server/service/recipe/route-definition.js +6 -6
  185. package/dist-server/service/recipe/route-definition.js.map +1 -1
  186. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  187. package/dist-server/service/resource/class-lineage.js +80 -0
  188. package/dist-server/service/resource/class-lineage.js.map +1 -0
  189. package/dist-server/service/resource/class-members.d.ts +36 -0
  190. package/dist-server/service/resource/class-members.js +50 -0
  191. package/dist-server/service/resource/class-members.js.map +1 -0
  192. package/dist-server/service/resource/referrers.d.ts +54 -0
  193. package/dist-server/service/resource/referrers.js +99 -0
  194. package/dist-server/service/resource/referrers.js.map +1 -0
  195. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  196. package/dist-server/service/test-spec/criteria-check.js +142 -0
  197. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  198. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  199. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  200. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  201. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
  202. package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
  203. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
  204. package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
  205. package/dist-server/service/test-spec/test-spec-query.js +23 -9
  206. package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
  207. package/dist-server/service/test-spec/test-specification.js +1 -1
  208. package/dist-server/service/test-spec/test-specification.js.map +1 -1
  209. package/dist-server/tsconfig.tsbuildinfo +1 -1
  210. package/helps/ops-master/equipment-class.ko.md +11 -0
  211. package/helps/ops-master/equipment-class.md +11 -0
  212. package/helps/ops-master/equipment.ko.md +11 -0
  213. package/helps/ops-master/equipment.md +11 -0
  214. package/helps/ops-master/material-class.ko.md +11 -0
  215. package/helps/ops-master/material-class.md +11 -0
  216. package/helps/ops-master/material-definition.ko.md +11 -0
  217. package/helps/ops-master/material-definition.md +11 -0
  218. package/helps/ops-master/operation-definition.ko.md +11 -0
  219. package/helps/ops-master/operation-definition.md +11 -0
  220. package/helps/ops-master/operational-location.ko.md +11 -0
  221. package/helps/ops-master/operational-location.md +11 -0
  222. package/helps/ops-master/person.ko.md +11 -0
  223. package/helps/ops-master/person.md +11 -0
  224. package/helps/ops-master/personnel-class.ko.md +11 -0
  225. package/helps/ops-master/personnel-class.md +11 -0
  226. package/helps/ops-master/physical-asset-class.ko.md +11 -0
  227. package/helps/ops-master/physical-asset-class.md +11 -0
  228. package/helps/ops-master/physical-asset.ko.md +11 -0
  229. package/helps/ops-master/physical-asset.md +11 -0
  230. package/helps/ops-master/recipe-definition.ko.md +11 -0
  231. package/helps/ops-master/recipe-definition.md +11 -0
  232. package/helps/ops-master/route-definition.ko.md +11 -0
  233. package/helps/ops-master/route-definition.md +11 -0
  234. package/helps/ops-master/stop-reason.ko.md +11 -0
  235. package/helps/ops-master/stop-reason.md +11 -0
  236. package/helps/ops-master/test-specification.ko.md +11 -0
  237. package/helps/ops-master/test-specification.md +11 -0
  238. package/package.json +5 -5
  239. package/things-factory.config.js +22 -2
  240. package/translations/en.json +86 -3
  241. package/translations/ja.json +92 -1
  242. package/translations/ko.json +93 -10
  243. package/translations/ms.json +92 -1
  244. package/translations/zh.json +92 -1
  245. package/dist-client/pages/master-list.d.ts +0 -68
  246. package/dist-client/pages/master-list.js +0 -239
  247. package/dist-client/pages/master-list.js.map +0 -1
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ์ œ์กฐ๋ฒ•์„ **ํ’ˆ๋ชฉ์—์„œ ๋˜์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ** ๋’ค์ง‘๋Š”๋‹ค.
3
+ *
4
+ * ์ œ์กฐ๋ฒ•์€ ใ€Œ์ด ํ’ˆ๋ชฉ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋ฌด์—‡์ด ๋“œ๋‚˜ใ€๋ฅผ ๋งํ•œ๋‹ค. ํ’ˆ๋ชฉ ํ™”๋ฉด์ด ๋ฌป๋Š” ๊ฒƒ์€ ๊ทธ ๋ฐ˜๋Œ€๋‹ค โ€” ใ€Œ์ด
5
+ * ํ’ˆ๋ชฉ์„ ๋งŒ๋“œ๋Š” ์ œ์กฐ๋ฒ•์€ ๋ฌด์—‡์ด๊ณ , ์ด ํ’ˆ๋ชฉ์€ ์–ด๋””์— ์“ฐ์ด๋‚˜ใ€. ๊ทธ ๋’ค์ง‘๊ธฐ๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋‹ค.
6
+ *
7
+ * ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋–ผ์–ด ๋‘๋Š” ๊ฒƒ์€ **์‹œํ—˜ ๋•Œ๋ฌธ**์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€๋ฅด๋Š” ๊ฒƒ(๊ฐ™์€ ์ œ์กฐ๋ฒ•์ด ํ•œ
8
+ * ํ’ˆ๋ชฉ์„ ๋‘ ๊ณต์ •์—์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ ยท ์ด๋ฆ„์ด ๋นˆ ์ค„)์€ ์‹ค์ œ ์ž๋ฃŒ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด๊ณ , ์„œ๋ฒ„๋ฅผ ๋„์šฐ์ง€ ์•Š๊ณ 
9
+ * ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
10
+ */
11
+ /** ์ œ์กฐ๋ฒ• ํ•œ ์ค„์—์„œ ์ด ๋’ค์ง‘๊ธฐ๊ฐ€ ๋ณด๋Š” ๊ฒƒ๋งŒ. */
12
+ export interface RecipeShape {
13
+ name: string;
14
+ materialDefinitionName?: string;
15
+ inputs?: Record<string, unknown>[];
16
+ }
17
+ export interface RecipeIndex {
18
+ /** ๋งŒ๋“œ๋Š” ํ’ˆ๋ชฉ โ†’ ์ œ์กฐ๋ฒ• ์ด๋ฆ„๋“ค. */
19
+ makes: Map<string, string[]>;
20
+ /** ํˆฌ์ž… ํ’ˆ๋ชฉ โ†’ ์ œ์กฐ๋ฒ• ์ด๋ฆ„๋“ค. */
21
+ uses: Map<string, string[]>;
22
+ }
23
+ export declare function indexRecipes(rows: readonly RecipeShape[]): RecipeIndex;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * ์ œ์กฐ๋ฒ•์„ **ํ’ˆ๋ชฉ์—์„œ ๋˜์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ** ๋’ค์ง‘๋Š”๋‹ค.
4
+ *
5
+ * ์ œ์กฐ๋ฒ•์€ ใ€Œ์ด ํ’ˆ๋ชฉ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋ฌด์—‡์ด ๋“œ๋‚˜ใ€๋ฅผ ๋งํ•œ๋‹ค. ํ’ˆ๋ชฉ ํ™”๋ฉด์ด ๋ฌป๋Š” ๊ฒƒ์€ ๊ทธ ๋ฐ˜๋Œ€๋‹ค โ€” ใ€Œ์ด
6
+ * ํ’ˆ๋ชฉ์„ ๋งŒ๋“œ๋Š” ์ œ์กฐ๋ฒ•์€ ๋ฌด์—‡์ด๊ณ , ์ด ํ’ˆ๋ชฉ์€ ์–ด๋””์— ์“ฐ์ด๋‚˜ใ€. ๊ทธ ๋’ค์ง‘๊ธฐ๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋‹ค.
7
+ *
8
+ * ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋–ผ์–ด ๋‘๋Š” ๊ฒƒ์€ **์‹œํ—˜ ๋•Œ๋ฌธ**์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€๋ฅด๋Š” ๊ฒƒ(๊ฐ™์€ ์ œ์กฐ๋ฒ•์ด ํ•œ
9
+ * ํ’ˆ๋ชฉ์„ ๋‘ ๊ณต์ •์—์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ ยท ์ด๋ฆ„์ด ๋นˆ ์ค„)์€ ์‹ค์ œ ์ž๋ฃŒ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด๊ณ , ์„œ๋ฒ„๋ฅผ ๋„์šฐ์ง€ ์•Š๊ณ 
10
+ * ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.indexRecipes = indexRecipes;
14
+ function indexRecipes(rows) {
15
+ const makes = new Map();
16
+ const uses = new Map();
17
+ const add = (map, key, recipe) => {
18
+ const name = String(key ?? '').trim();
19
+ /* ์ด๋ฆ„์ด ๋นˆ ์ค„์€ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค. ๋นˆ ์ด๋ฆ„์œผ๋กœ ๋ฌถ์œผ๋ฉด ์—†๋Š” ํ’ˆ๋ชฉ ํ•˜๋‚˜๊ฐ€ ์ƒ๊ธด๋‹ค. */
20
+ if (!name || !recipe) {
21
+ return;
22
+ }
23
+ const list = map.get(name);
24
+ if (!list) {
25
+ map.set(name, [recipe]);
26
+ return;
27
+ }
28
+ /*
29
+ * ๊ฐ™์€ ์ œ์กฐ๋ฒ•์ด ๊ฐ™์€ ํ’ˆ๋ชฉ์„ ๋‘ ๊ณต์ •์—์„œ ์“ฐ๋ฉด **ํ•œ ๋ฒˆ๋งŒ** ์ ๋Š”๋‹ค. ใ€Œ์–ด๋””์— ์“ฐ์ด๋‚˜ใ€์˜ ๋‹ต์€
30
+ * ์ œ์กฐ๋ฒ•์ด์ง€ ํˆฌ์ž… ์ค„์ด ์•„๋‹ˆ๋‹ค โ€” ๋‘ ๋ฒˆ ์ ์œผ๋ฉด ใ€Œ๋‘ ๊ตฐ๋ฐ ์“ฐ์ธ๋‹คใ€๋กœ ์ฝํžŒ๋‹ค.
31
+ */
32
+ if (!list.includes(recipe)) {
33
+ list.push(recipe);
34
+ }
35
+ };
36
+ for (const row of rows) {
37
+ add(makes, row.materialDefinitionName, row.name);
38
+ for (const part of row.inputs ?? []) {
39
+ add(uses, part?.material, row.name);
40
+ }
41
+ }
42
+ return { makes, uses };
43
+ }
44
+ //# sourceMappingURL=recipe-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-index.js","sourceRoot":"","sources":["../../../server/service/material/recipe-index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAgBH,oCAqCC;AArCD,SAAgB,YAAY,CAAC,IAA4B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAA;IAExC,MAAM,GAAG,GAAG,CAAC,GAA0B,EAAE,GAAY,EAAE,MAAc,EAAE,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAErC,uDAAuD;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QAED;;;WAGG;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QAEhD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC","sourcesContent":["/**\n * ์ œ์กฐ๋ฒ•์„ **ํ’ˆ๋ชฉ์—์„œ ๋˜์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ** ๋’ค์ง‘๋Š”๋‹ค.\n *\n * ์ œ์กฐ๋ฒ•์€ ใ€Œ์ด ํ’ˆ๋ชฉ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋ฌด์—‡์ด ๋“œ๋‚˜ใ€๋ฅผ ๋งํ•œ๋‹ค. ํ’ˆ๋ชฉ ํ™”๋ฉด์ด ๋ฌป๋Š” ๊ฒƒ์€ ๊ทธ ๋ฐ˜๋Œ€๋‹ค โ€” ใ€Œ์ด\n * ํ’ˆ๋ชฉ์„ ๋งŒ๋“œ๋Š” ์ œ์กฐ๋ฒ•์€ ๋ฌด์—‡์ด๊ณ , ์ด ํ’ˆ๋ชฉ์€ ์–ด๋””์— ์“ฐ์ด๋‚˜ใ€. ๊ทธ ๋’ค์ง‘๊ธฐ๊ฐ€ ์—ฌ๊ธฐ ์žˆ๋‹ค.\n *\n * ํ™”๋ฉด๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋–ผ์–ด ๋‘๋Š” ๊ฒƒ์€ **์‹œํ—˜ ๋•Œ๋ฌธ**์ด๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ€๋ฅด๋Š” ๊ฒƒ(๊ฐ™์€ ์ œ์กฐ๋ฒ•์ด ํ•œ\n * ํ’ˆ๋ชฉ์„ ๋‘ ๊ณต์ •์—์„œ ์“ฐ๋Š” ๊ฒฝ์šฐ ยท ์ด๋ฆ„์ด ๋นˆ ์ค„)์€ ์‹ค์ œ ์ž๋ฃŒ์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด๊ณ , ์„œ๋ฒ„๋ฅผ ๋„์šฐ์ง€ ์•Š๊ณ \n * ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.\n */\n\n/** ์ œ์กฐ๋ฒ• ํ•œ ์ค„์—์„œ ์ด ๋’ค์ง‘๊ธฐ๊ฐ€ ๋ณด๋Š” ๊ฒƒ๋งŒ. */\nexport interface RecipeShape {\n name: string\n materialDefinitionName?: string\n inputs?: Record<string, unknown>[]\n}\n\nexport interface RecipeIndex {\n /** ๋งŒ๋“œ๋Š” ํ’ˆ๋ชฉ โ†’ ์ œ์กฐ๋ฒ• ์ด๋ฆ„๋“ค. */\n makes: Map<string, string[]>\n /** ํˆฌ์ž… ํ’ˆ๋ชฉ โ†’ ์ œ์กฐ๋ฒ• ์ด๋ฆ„๋“ค. */\n uses: Map<string, string[]>\n}\n\nexport function indexRecipes(rows: readonly RecipeShape[]): RecipeIndex {\n const makes = new Map<string, string[]>()\n const uses = new Map<string, string[]>()\n\n const add = (map: Map<string, string[]>, key: unknown, recipe: string) => {\n const name = String(key ?? '').trim()\n\n /* ์ด๋ฆ„์ด ๋นˆ ์ค„์€ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๋Š”๋‹ค. ๋นˆ ์ด๋ฆ„์œผ๋กœ ๋ฌถ์œผ๋ฉด ์—†๋Š” ํ’ˆ๋ชฉ ํ•˜๋‚˜๊ฐ€ ์ƒ๊ธด๋‹ค. */\n if (!name || !recipe) {\n return\n }\n\n const list = map.get(name)\n\n if (!list) {\n map.set(name, [recipe])\n return\n }\n\n /*\n * ๊ฐ™์€ ์ œ์กฐ๋ฒ•์ด ๊ฐ™์€ ํ’ˆ๋ชฉ์„ ๋‘ ๊ณต์ •์—์„œ ์“ฐ๋ฉด **ํ•œ ๋ฒˆ๋งŒ** ์ ๋Š”๋‹ค. ใ€Œ์–ด๋””์— ์“ฐ์ด๋‚˜ใ€์˜ ๋‹ต์€\n * ์ œ์กฐ๋ฒ•์ด์ง€ ํˆฌ์ž… ์ค„์ด ์•„๋‹ˆ๋‹ค โ€” ๋‘ ๋ฒˆ ์ ์œผ๋ฉด ใ€Œ๋‘ ๊ตฐ๋ฐ ์“ฐ์ธ๋‹คใ€๋กœ ์ฝํžŒ๋‹ค.\n */\n if (!list.includes(recipe)) {\n list.push(recipe)\n }\n }\n\n for (const row of rows) {\n add(makes, row.materialDefinitionName, row.name)\n\n for (const part of row.inputs ?? []) {\n add(uses, part?.material, row.name)\n }\n }\n\n return { makes, uses }\n}\n"]}
@@ -14,7 +14,7 @@ export declare class OperationDefinition {
14
14
  readonly id: string;
15
15
  domain?: Domain;
16
16
  domainId?: string;
17
- /** ๊ณต์ • ํ‚ค โ€” ๋ผ์šฐํŠธ์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
17
+ /** ๊ณต์ • ํ‚ค โ€” ๋ผ์šฐํŒ…์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
18
18
  name: string;
19
19
  description?: string;
20
20
  /** ๋ฌด์—‡์„ ํ•˜๋Š” ๊ณต์ •์ธ๊ฐ€ โ€” `transport` ยท `process` ยท `dwell`. */
@@ -70,22 +70,22 @@ tslib_1.__decorate([
70
70
  ], OperationDefinition.prototype, "duration", void 0);
71
71
  tslib_1.__decorate([
72
72
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
73
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'DurationVariability as JSON text' }),
73
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'DurationVariability' }),
74
74
  tslib_1.__metadata("design:type", Object)
75
75
  ], OperationDefinition.prototype, "variability", void 0);
76
76
  tslib_1.__decorate([
77
77
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
78
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'OperationParameter[] as JSON text' }),
78
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'OperationParameter[]' }),
79
79
  tslib_1.__metadata("design:type", Array)
80
80
  ], OperationDefinition.prototype, "parameters", void 0);
81
81
  tslib_1.__decorate([
82
82
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
83
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'PersonnelSpecification[] as JSON text' }),
83
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PersonnelSpecification[]' }),
84
84
  tslib_1.__metadata("design:type", Array)
85
85
  ], OperationDefinition.prototype, "personnelSpecification", void 0);
86
86
  tslib_1.__decorate([
87
87
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
88
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'PhysicalAssetSpecification[] as JSON text' }),
88
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PhysicalAssetSpecification[]' }),
89
89
  tslib_1.__metadata("design:type", Array)
90
90
  ], OperationDefinition.prototype, "physicalAssetSpecification", void 0);
91
91
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"operation-definition.js","sourceRoot":"","sources":["../../../server/service/operation/operation-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ๊ณต์ • ์ •์˜ โ€” **ISA-95 `OperationsSegment`**(`OperationsDefinition` ์†Œ์†).\n *\n * ์ด ์ž๋ฆฌ๊ฐ€ ๋‹ตํ•˜๋Š” ๊ฒƒ์€ ใ€Œ์ด ๊ณต์ •์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๊ณ  ๋ฌด์—‡์„ ํ•„์š”๋กœ ํ•˜๋Š”๊ฐ€ใ€๋‹ค. ์˜ˆ์ธก์ด ์“ฐ๋Š” ์†Œ์š”์‹œ๊ฐ„์˜\n * ๊ทผ๊ฑฐ์ด๊ณ , ์ •์ƒ์ƒํƒœ ์ƒํ•œ๊ณผ ๋ณ‘๋ชฉ์„ ๊ณต์ •๋ณ„๋กœ ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฐ’์ด๋‹ค.\n *\n * โ”€โ”€ ํ•„์š” ์ž์›์„ ์ ์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ์ด ์—†๋Š” ๊ณต์žฅ์ด ๋œ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์› ๋ช…์„ธ๊ฐ€ ์—†์œผ๋ฉด ์‚ฌ๋žŒ์€ ์˜ˆ์ธก์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ค๋น„๋งŒ ์žˆ์œผ๋ฉด ์–ธ์ œ๋‚˜ ๊ฐ€๋™๋˜๋Š” ๊ณต์žฅ์ด ๋˜๊ณ , ํ˜„์žฅ์—์„œ\n * ๊ฐ€์žฅ ์ž์ฃผ ๋ชจ์ž๋ผ๋Š” ์ž์›์ด ๋งŒ๋“œ๋Š” ์ค„์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„๋‹ค. ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค โ€” ใ€Œ์šฉ์ ‘ ์ž๊ฒฉ์ž 2๋ช…ใ€.\n */\n@Entity({ name: 'ops_operation_definition' })\n@Index('ix_ops_operation_definition_0', (operation: OperationDefinition) => [operation.domain, operation.name], {\n unique: true\n})\n@ObjectType({ description: 'ISA-95 OperationsSegment โ€” what an operation takes and requires' })\nexport class OperationDefinition {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((operation: OperationDefinition) => operation.domain)\n domainId?: string\n\n /** ๊ณต์ • ํ‚ค โ€” ๋ผ์šฐํŠธ์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** ๋ฌด์—‡์„ ํ•˜๋Š” ๊ณต์ •์ธ๊ฐ€ โ€” `transport` ยท `process` ยท `dwell`. */\n @Column()\n @Field()\n intent: string\n\n /** ์ด ๊ณต์ •์ด ๋ฒŒ์–ด์ง€๋Š” ์ž๋ฆฌ ํƒ€์ž…. ์—†์œผ๋ฉด ์ปค๋„์ด ์–ด๋””์„œ ์ผํ•˜๋Š”์ง€ ์ •ํ•  ์ˆ˜ ์—†๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n locationType?: string\n\n /** ํ•„์š”ํ•œ ์„ค๋น„ ์ข…๋ฅ˜. `dwell` ์€ ์ž์›์„ ์žก์ง€ ์•Š๋Š”๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n resourceType?: string\n\n /** ๋ฐฉ์ถœํ•  CBV bizStep URN. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n bizStep?: string\n\n /** ์†Œ์š”์‹œ๊ฐ„ โ€” ํ‘œ์ค€ `Duration`. ISO 8601 ๊ธฐ๊ฐ„ ํ‘œ๊ธฐ๋‹ค. ์—†์œผ๋ฉด ์ปค๋„์ด ๊ธฐ๋ณธ๊ฐ’์„ ์“ด๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n duration?: string\n\n /** ์†Œ์š”์‹œ๊ฐ„ ๋ณ€๋™ โ€” ํ‘œ์ค€ ๋ฐ– ํ™•์žฅ. ์—†์œผ๋ฉด ์ƒ์ˆ˜๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'DurationVariability as JSON text' })\n variability?: Record<string, unknown>\n\n /** ๊ณต์ • ๋ชจ์ˆ˜ โ€” ํ‘œ์ค€ `ParameterSpecification`. ์ˆ˜์œจ ยท ์…‹์—… ์‹œ๊ฐ„ ยท ์˜จ๋„๊ฐ€ ์—ฌ๊ธฐ ์˜จ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'OperationParameter[] as JSON text' })\n parameters?: Record<string, unknown>[]\n\n /** ํ•„์š” ์ธ์› โ€” ํ‘œ์ค€ `PersonnelSpecification`(๋“ฑ๊ธ‰ + ์ˆ˜๋Ÿ‰). */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'PersonnelSpecification[] as JSON text' })\n personnelSpecification?: Record<string, unknown>[]\n\n /** ํ•„์š” ๋ฌผ๋ฆฌ ์ž์‚ฐ โ€” ํ‘œ์ค€ `PhysicalAssetSpecification`. ๋นˆ ํŒ”๋ ˆํŠธ๊ฐ€ ์—†์–ด ์ถœ๊ณ ๊ฐ€ ๋ชป ๋‚˜๊ฐ€๋Š” ์ผ์€ ์žฆ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'PhysicalAssetSpecification[] as JSON text' })\n physicalAssetSpecification?: Record<string, unknown>[]\n\n /** ์–ธ์ œ๋ถ€ํ„ฐ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveStartDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /**\n * ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveEndDate`.\n *\n * **์—†์•จ ๋•Œ ํ–‰์„ ์ง€์šฐ์ง€ ์•Š๊ณ  ์ด ์นธ์„ ์ฑ„์šด๋‹ค.** ์ง€์šฐ๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€๋‚œ ๊ธฐ๋ก์ด ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์„ ์žƒ๋Š”๋‹ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((operation: OperationDefinition) => operation.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((operation: OperationDefinition) => operation.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"operation-definition.js","sourceRoot":"","sources":["../../../server/service/operation/operation-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ๊ณต์ • ์ •์˜ โ€” **ISA-95 `OperationsSegment`**(`OperationsDefinition` ์†Œ์†).\n *\n * ์ด ์ž๋ฆฌ๊ฐ€ ๋‹ตํ•˜๋Š” ๊ฒƒ์€ ใ€Œ์ด ๊ณต์ •์ด ์–ผ๋งˆ๋‚˜ ๊ฑธ๋ฆฌ๊ณ  ๋ฌด์—‡์„ ํ•„์š”๋กœ ํ•˜๋Š”๊ฐ€ใ€๋‹ค. ์˜ˆ์ธก์ด ์“ฐ๋Š” ์†Œ์š”์‹œ๊ฐ„์˜\n * ๊ทผ๊ฑฐ์ด๊ณ , ์ •์ƒ์ƒํƒœ ์ƒํ•œ๊ณผ ๋ณ‘๋ชฉ์„ ๊ณต์ •๋ณ„๋กœ ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฐ’์ด๋‹ค.\n *\n * โ”€โ”€ ํ•„์š” ์ž์›์„ ์ ์ง€ ์•Š์œผ๋ฉด ์‚ฌ๋žŒ์ด ์—†๋Š” ๊ณต์žฅ์ด ๋œ๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์› ๋ช…์„ธ๊ฐ€ ์—†์œผ๋ฉด ์‚ฌ๋žŒ์€ ์˜ˆ์ธก์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์„ค๋น„๋งŒ ์žˆ์œผ๋ฉด ์–ธ์ œ๋‚˜ ๊ฐ€๋™๋˜๋Š” ๊ณต์žฅ์ด ๋˜๊ณ , ํ˜„์žฅ์—์„œ\n * ๊ฐ€์žฅ ์ž์ฃผ ๋ชจ์ž๋ผ๋Š” ์ž์›์ด ๋งŒ๋“œ๋Š” ์ค„์ด ํ†ต์งธ๋กœ ์‚ฌ๋ผ์ง„๋‹ค. ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค โ€” ใ€Œ์šฉ์ ‘ ์ž๊ฒฉ์ž 2๋ช…ใ€.\n */\n@Entity({ name: 'ops_operation_definition' })\n@Index('ix_ops_operation_definition_0', (operation: OperationDefinition) => [operation.domain, operation.name], {\n unique: true\n})\n@ObjectType({ description: 'ISA-95 OperationsSegment โ€” what an operation takes and requires' })\nexport class OperationDefinition {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((operation: OperationDefinition) => operation.domain)\n domainId?: string\n\n /** ๊ณต์ • ํ‚ค โ€” ๋ผ์šฐํŒ…์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** ๋ฌด์—‡์„ ํ•˜๋Š” ๊ณต์ •์ธ๊ฐ€ โ€” `transport` ยท `process` ยท `dwell`. */\n @Column()\n @Field()\n intent: string\n\n /** ์ด ๊ณต์ •์ด ๋ฒŒ์–ด์ง€๋Š” ์ž๋ฆฌ ํƒ€์ž…. ์—†์œผ๋ฉด ์ปค๋„์ด ์–ด๋””์„œ ์ผํ•˜๋Š”์ง€ ์ •ํ•  ์ˆ˜ ์—†๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n locationType?: string\n\n /** ํ•„์š”ํ•œ ์„ค๋น„ ์ข…๋ฅ˜. `dwell` ์€ ์ž์›์„ ์žก์ง€ ์•Š๋Š”๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n resourceType?: string\n\n /** ๋ฐฉ์ถœํ•  CBV bizStep URN. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n bizStep?: string\n\n /** ์†Œ์š”์‹œ๊ฐ„ โ€” ํ‘œ์ค€ `Duration`. ISO 8601 ๊ธฐ๊ฐ„ ํ‘œ๊ธฐ๋‹ค. ์—†์œผ๋ฉด ์ปค๋„์ด ๊ธฐ๋ณธ๊ฐ’์„ ์“ด๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n duration?: string\n\n /** ์†Œ์š”์‹œ๊ฐ„ ๋ณ€๋™ โ€” ํ‘œ์ค€ ๋ฐ– ํ™•์žฅ. ์—†์œผ๋ฉด ์ƒ์ˆ˜๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'DurationVariability' })\n variability?: Record<string, unknown>\n\n /** ๊ณต์ • ๋ชจ์ˆ˜ โ€” ํ‘œ์ค€ `ParameterSpecification`. ์ˆ˜์œจ ยท ์…‹์—… ์‹œ๊ฐ„ ยท ์˜จ๋„๊ฐ€ ์—ฌ๊ธฐ ์˜จ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'OperationParameter[]' })\n parameters?: Record<string, unknown>[]\n\n /** ํ•„์š” ์ธ์› โ€” ํ‘œ์ค€ `PersonnelSpecification`(๋“ฑ๊ธ‰ + ์ˆ˜๋Ÿ‰). */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'PersonnelSpecification[]' })\n personnelSpecification?: Record<string, unknown>[]\n\n /** ํ•„์š” ๋ฌผ๋ฆฌ ์ž์‚ฐ โ€” ํ‘œ์ค€ `PhysicalAssetSpecification`. ๋นˆ ํŒ”๋ ˆํŠธ๊ฐ€ ์—†์–ด ์ถœ๊ณ ๊ฐ€ ๋ชป ๋‚˜๊ฐ€๋Š” ์ผ์€ ์žฆ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'PhysicalAssetSpecification[]' })\n physicalAssetSpecification?: Record<string, unknown>[]\n\n /** ์–ธ์ œ๋ถ€ํ„ฐ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveStartDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /**\n * ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveEndDate`.\n *\n * **์—†์•จ ๋•Œ ํ–‰์„ ์ง€์šฐ์ง€ ์•Š๊ณ  ์ด ์นธ์„ ์ฑ„์šด๋‹ค.** ์ง€์šฐ๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€๋‚œ ๊ธฐ๋ก์ด ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์„ ์žƒ๋Š”๋‹ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((operation: OperationDefinition) => operation.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((operation: OperationDefinition) => operation.updater)\n updaterId?: string\n}\n"]}
@@ -17,6 +17,30 @@ export declare class OperationDefinitionList {
17
17
  }
18
18
  export declare class OperationDefinitionResolver {
19
19
  operationDefinitions(params: ListParam, context: ResolverContext): Promise<OperationDefinitionList>;
20
+ /**
21
+ * ์ด ๊ณต์ •์„ ๋‹จ๊ณ„๋กœ ๊ฐ–๋Š” **๋ผ์šฐํŒ…๋“ค.**
22
+ *
23
+ * ๊ณต์ •์„ ๊ณ ์น˜๊ธฐ ์ „์— ๋ฌด์—‡์ด ๋”ธ๋ ค ์˜ค๋Š”์ง€ ์—ฌ๊ธฐ์„œ ๋ณธ๋‹ค. ์—ฌ๋Ÿฟ์ผ ์ˆ˜ ์žˆ๋‹ค โ€” ๊ฐ™์€ ๊ณต์ •์„ ์—ฌ๋Ÿฌ ๋ผ์šฐํŒ…์ด
24
+ * ์ง€๋‚œ๋‹ค(์ ˆ๋‹จ์€ ํ‘œ์ค€์—๋„ ๋น ๋ฅธ ๊ฒƒ์—๋„ ์žˆ๋‹ค).
25
+ *
26
+ * ์•„๋ฌด๋„ ์•ˆ ์“ฐ๋ฉด ๋นˆ ๋ชฉ๋ก์ด๋‹ค. ๋‹ค๋งŒ ๊ทธ๊ฒƒ์ด ใ€Œ์•ˆ ์“ด๋‹คใ€์ธ์ง€ ใ€Œ๋‹ค ๋ชป ๋ดค๋‹คใ€์ธ์ง€๋Š”
27
+ * `referrerScanCapped` ๊ฐ€ ๋งํ•œ๋‹ค.
28
+ */
29
+ usedInRoutes(operation: OperationDefinition, context: ResolverContext): Promise<string[]>;
30
+ /**
31
+ * ์ด ๊ณต์ •์—์„œ ์ž์žฌ๋ฅผ ๋„ฃ๋Š” **์ œ์กฐ๋ฒ•๋“ค.**
32
+ *
33
+ * ๋ผ์šฐํŒ…์€ ใ€Œ์–ด๋””๋ฅผ ์ง€๋‚˜๋‚˜ใ€์ด๊ณ  ์ด๊ฒƒ์€ ใ€Œ๊ฑฐ๊ธฐ์„œ ๋ฌด์—‡์ด ๋น ์ง€๋‚˜ใ€๋‹ค. ๊ณต์ •์„ ์—†์• ๋ฉด ๊ทธ ์ž์žฌ๊ฐ€
34
+ * ๋น ์งˆ ์ž๋ฆฌ๋ฅผ ์žƒ๋Š”๋‹ค.
35
+ */
36
+ consumedAt(operation: OperationDefinition, context: ResolverContext): Promise<string[]>;
37
+ /**
38
+ * ๋ผ์šฐํŒ…ยท์ œ์กฐ๋ฒ•์„ ๋‹ค ๋ณด์ง€ ๋ชปํ–ˆ๋‚˜.
39
+ *
40
+ * **์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค.** ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ์œ„์˜ ๋‘ ์นธ์ด ๋œ ์ฐฌ ๋‹ต์ด๊ณ , ๊ทธ๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด
41
+ * ใ€Œ์“ฐ๋Š” ๋ฐ๊ฐ€ ์—†๋‹คใ€์™€ ใ€Œ๋ชป ๋ดค๋‹คใ€๊ฐ€ ๊ฐ™์•„ ๋ณด์ธ๋‹ค.
42
+ */
43
+ referrerScanCapped(operation: OperationDefinition, context: ResolverContext): Promise<boolean>;
20
44
  /**
21
45
  * ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋ณด๋‚ธ ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•œ๋‹ค.
22
46
  *
@@ -8,6 +8,9 @@ const master_crud_1 = require("../master-crud");
8
8
  const master_axis_1 = require("../master-axis");
9
9
  const master_list_1 = require("../master-list");
10
10
  const operation_definition_1 = require("./operation-definition");
11
+ const recipe_definition_1 = require("../recipe/recipe-definition");
12
+ const route_definition_1 = require("../recipe/route-definition");
13
+ const referrers_1 = require("../resource/referrers");
11
14
  /**
12
15
  * ๊ณต์ • ์ถ•์„ ์ฑ„์šฐ๊ณ  ๊ณ ์นœ๋‹ค.
13
16
  *
@@ -32,12 +35,92 @@ tslib_1.__decorate([
32
35
  exports.OperationDefinitionList = OperationDefinitionList = tslib_1.__decorate([
33
36
  (0, type_graphql_1.ObjectType)({ description: 'A page of operation definitions' })
34
37
  ], OperationDefinitionList);
38
+ /**
39
+ * **์ด ๊ณต์ •์„ ๋ˆ„๊ฐ€ ์“ฐ๋‚˜** โ€” ๋“ค์–ด์˜ค๋Š” ๊ด€๊ณ„.
40
+ *
41
+ * โ”€โ”€ ์™œ ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
42
+ * ๊ณต์ • ํ•˜๋‚˜๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ์—†์•จ ๋•Œ ๋ฌด์—‡์ด ๋”ธ๋ ค ๋ฌด๋„ˆ์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋ผ์šฐํŒ…๊ณผ ์ œ์กฐ๋ฒ•์„ ํ•˜๋‚˜์”ฉ ์—ด์–ด
43
+ * ๋‹จ๊ณ„ ๋ชฉ๋ก์„ ๋ˆˆ์œผ๋กœ ํ›‘๋Š” ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค. ์ง€๊ธˆ miratek ์€ ๋ผ์šฐํŒ… ๋‹ค์„ฏ์— ์ œ์กฐ๋ฒ• ๋‹ค์„ฏ์ด๋ผ ๊ทธ๊ฒƒ์ด
44
+ * ๋˜์ง€๋งŒ, ์ œํ’ˆ์ด ๋Š˜๋ฉด ์•ˆ ๋œ๋‹ค.
45
+ *
46
+ * โ”€โ”€ ๋ฐฐ์—ด ์นธ์ด๋ผ ํ›‘๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
47
+ * `RouteDefinition.steps` ์™€ `RecipeDefinition.inputs[].operation` ์€ `simple-json` ์ด๋‹ค.
48
+ * ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ทธ ์•ˆ์„ ๋ชป ๋ณด๋ฏ€๋กœ `IN` ์œผ๋กœ ๋ชป ์ขํžŒ๋‹ค. ํ‘œ๋ฅผ ํ›‘์–ด ๋’ค์ง‘๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค.
49
+ *
50
+ * **๊ทธ๋ž˜์„œ ์ƒํ•œ์ด ์žˆ๊ณ , ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ๋งํ•œ๋‹ค**(`referrerScanCapped`). ์กฐ์šฉํžˆ ์ž๋ฅด๋ฉด ใ€Œ์ด ๊ณต์ •์„
51
+ * ์•„๋ฌด๋„ ์•ˆ ์“ด๋‹คใ€์™€ ใ€Œ๋„ˆ๋ฌด ๋งŽ์•„ ๋‹ค ๋ชป ๋ดค๋‹คใ€๊ฐ€ ๊ฐ™์•„ ๋ณด์ธ๋‹ค. ์•ž์—ฃ๊ฒƒ์€ ์ง€์›Œ๋„ ๋˜๋Š” ๊ณต์ •์ด๊ณ 
52
+ * ๋’ค์—ฃ๊ฒƒ์€ ์ง€์šฐ๋ฉด ๋ผ์ธ์ด ์„ ๋‹ค. ํ’ˆ๋ชฉ์˜ ์ œ์กฐ๋ฒ• ํ›‘๊ธฐ๊ฐ€ ๊ฐ™์€ ์ž๋ฆฌ์— ๊ฐ™์€ ๊ฒƒ์„ ๋‘”๋‹ค.
53
+ */
54
+ const OPERATION_SCAN_LIMIT = 2000;
55
+ async function scanOperationUse(domain) {
56
+ const routeRepo = (0, shell_1.getRepository)(route_definition_1.RouteDefinition);
57
+ const recipeRepo = (0, shell_1.getRepository)(recipe_definition_1.RecipeDefinition);
58
+ const [routeTotal, recipeTotal] = await Promise.all([
59
+ routeRepo.count({ where: { domain: { id: domain.id } } }),
60
+ recipeRepo.count({ where: { domain: { id: domain.id } } })
61
+ ]);
62
+ const [routeRows, recipeRows] = await Promise.all([
63
+ /*
64
+ * `id` ๋ฅผ ํ•จ๊ป˜ ๋ฝ‘๋Š”๋‹ค. ๋นผ๋ฉด TypeORM ์ด ใ€Œno such column: distinctAlias.โ€ฆ_idใ€๋กœ ํ„ฐ์ง„๋‹ค โ€”
65
+ * `take` ๋ฅผ ์“ฐ๋ฉด ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ํ‚ค๋กœ ํ•œ ๋ฒˆ ๋” ๊ฐ์‹ธ๋Š”๋ฐ, ๊ทธ ํ‚ค๋ฅผ ์•ˆ ๋ฝ‘์œผ๋ฉด ๊ฐ์Œ€ ๊ฒƒ์ด ์—†๋‹ค.
66
+ */
67
+ routeRepo.find({
68
+ where: { domain: { id: domain.id } },
69
+ select: ['id', 'name', 'steps'],
70
+ take: OPERATION_SCAN_LIMIT
71
+ }),
72
+ recipeRepo.find({
73
+ where: { domain: { id: domain.id } },
74
+ select: ['id', 'name', 'inputs'],
75
+ take: OPERATION_SCAN_LIMIT
76
+ })
77
+ ]);
78
+ const routes = (0, referrers_1.indexMultiReferrers)(routeRows, one => one.steps ?? [], one => one.name);
79
+ const recipes = (0, referrers_1.indexMultiReferrers)(recipeRows, one => (one.inputs ?? []).map((part) => part?.operation), one => one.name);
80
+ return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length };
81
+ }
82
+ /** ์š”์ฒญ ์•ˆ์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ›‘๋Š”๋‹ค. **์•ฝ์†์„ ๋‹ด๋Š”๋‹ค** โ€” ์ค„๋“ค์ด ๊ฑฐ์˜ ๋™์‹œ์— ๋ฌป๋Š”๋‹ค. */
83
+ function operationUseOf(context) {
84
+ const state = context.state;
85
+ state.operationUse = state.operationUse || scanOperationUse(state.domain);
86
+ return state.operationUse;
87
+ }
35
88
  let OperationDefinitionResolver = class OperationDefinitionResolver {
36
89
  async operationDefinitions(params, context) {
37
90
  const { domain } = context.state;
38
91
  const { items, total } = await (0, master_list_1.listMaster)('operationDefinition', params, domain);
39
92
  return { items: items, total };
40
93
  }
94
+ /**
95
+ * ์ด ๊ณต์ •์„ ๋‹จ๊ณ„๋กœ ๊ฐ–๋Š” **๋ผ์šฐํŒ…๋“ค.**
96
+ *
97
+ * ๊ณต์ •์„ ๊ณ ์น˜๊ธฐ ์ „์— ๋ฌด์—‡์ด ๋”ธ๋ ค ์˜ค๋Š”์ง€ ์—ฌ๊ธฐ์„œ ๋ณธ๋‹ค. ์—ฌ๋Ÿฟ์ผ ์ˆ˜ ์žˆ๋‹ค โ€” ๊ฐ™์€ ๊ณต์ •์„ ์—ฌ๋Ÿฌ ๋ผ์šฐํŒ…์ด
98
+ * ์ง€๋‚œ๋‹ค(์ ˆ๋‹จ์€ ํ‘œ์ค€์—๋„ ๋น ๋ฅธ ๊ฒƒ์—๋„ ์žˆ๋‹ค).
99
+ *
100
+ * ์•„๋ฌด๋„ ์•ˆ ์“ฐ๋ฉด ๋นˆ ๋ชฉ๋ก์ด๋‹ค. ๋‹ค๋งŒ ๊ทธ๊ฒƒ์ด ใ€Œ์•ˆ ์“ด๋‹คใ€์ธ์ง€ ใ€Œ๋‹ค ๋ชป ๋ดค๋‹คใ€์ธ์ง€๋Š”
101
+ * `referrerScanCapped` ๊ฐ€ ๋งํ•œ๋‹ค.
102
+ */
103
+ async usedInRoutes(operation, context) {
104
+ return (await operationUseOf(context)).routes.get(operation.name) ?? [];
105
+ }
106
+ /**
107
+ * ์ด ๊ณต์ •์—์„œ ์ž์žฌ๋ฅผ ๋„ฃ๋Š” **์ œ์กฐ๋ฒ•๋“ค.**
108
+ *
109
+ * ๋ผ์šฐํŒ…์€ ใ€Œ์–ด๋””๋ฅผ ์ง€๋‚˜๋‚˜ใ€์ด๊ณ  ์ด๊ฒƒ์€ ใ€Œ๊ฑฐ๊ธฐ์„œ ๋ฌด์—‡์ด ๋น ์ง€๋‚˜ใ€๋‹ค. ๊ณต์ •์„ ์—†์• ๋ฉด ๊ทธ ์ž์žฌ๊ฐ€
110
+ * ๋น ์งˆ ์ž๋ฆฌ๋ฅผ ์žƒ๋Š”๋‹ค.
111
+ */
112
+ async consumedAt(operation, context) {
113
+ return (await operationUseOf(context)).recipes.get(operation.name) ?? [];
114
+ }
115
+ /**
116
+ * ๋ผ์šฐํŒ…ยท์ œ์กฐ๋ฒ•์„ ๋‹ค ๋ณด์ง€ ๋ชปํ–ˆ๋‚˜.
117
+ *
118
+ * **์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค.** ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ์œ„์˜ ๋‘ ์นธ์ด ๋œ ์ฐฌ ๋‹ต์ด๊ณ , ๊ทธ๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด
119
+ * ใ€Œ์“ฐ๋Š” ๋ฐ๊ฐ€ ์—†๋‹คใ€์™€ ใ€Œ๋ชป ๋ดค๋‹คใ€๊ฐ€ ๊ฐ™์•„ ๋ณด์ธ๋‹ค.
120
+ */
121
+ async referrerScanCapped(operation, context) {
122
+ return (await operationUseOf(context)).capped;
123
+ }
41
124
  /**
42
125
  * ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋ณด๋‚ธ ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•œ๋‹ค.
43
126
  *
@@ -64,6 +147,30 @@ tslib_1.__decorate([
64
147
  tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
65
148
  tslib_1.__metadata("design:returntype", Promise)
66
149
  ], OperationDefinitionResolver.prototype, "operationDefinitions", null);
150
+ tslib_1.__decorate([
151
+ (0, type_graphql_1.FieldResolver)(type => [String], { description: 'Routes that include this operation as a step' }),
152
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
153
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
154
+ tslib_1.__metadata("design:type", Function),
155
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
156
+ tslib_1.__metadata("design:returntype", Promise)
157
+ ], OperationDefinitionResolver.prototype, "usedInRoutes", null);
158
+ tslib_1.__decorate([
159
+ (0, type_graphql_1.FieldResolver)(type => [String], { description: 'Recipes that consume materials at this operation' }),
160
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
161
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
162
+ tslib_1.__metadata("design:type", Function),
163
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
164
+ tslib_1.__metadata("design:returntype", Promise)
165
+ ], OperationDefinitionResolver.prototype, "consumedAt", null);
166
+ tslib_1.__decorate([
167
+ (0, type_graphql_1.FieldResolver)(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' }),
168
+ tslib_1.__param(0, (0, type_graphql_1.Root)()),
169
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
170
+ tslib_1.__metadata("design:type", Function),
171
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
172
+ tslib_1.__metadata("design:returntype", Promise)
173
+ ], OperationDefinitionResolver.prototype, "referrerScanCapped", null);
67
174
  tslib_1.__decorate([
68
175
  (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
69
176
  (0, type_graphql_1.Directive)('@transaction'),
@@ -1 +1 @@
1
- {"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2G;AAE3G,iDAA+D;AAE/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,iEAA4D;AAE5D;;;;;;;;;GASG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAMnC,CAAA;AANY,0DAAuB;AAElC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;;sDACT;AAG5B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;sDACN;kCALF,uBAAuB;IADnC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;GAClD,uBAAuB,CAMnC;AAGM,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGhC,AAAN,KAAK,CAAC,oBAAoB,CAA0B,MAAiB,EAAS,OAAwB;QACpG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAEhF,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,iCAAiC,CACG,OAAsB,EACvD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,qBAAqB,CAAC,CAAA;QAEhD,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC5E,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QAEF,OAAO,KAA8B,CAAA;IACvC,CAAC;CACF,CAAA;AAjCY,kEAA2B;AAGhC;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IACjE,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;uEAKpE;AAYK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;IAE9G,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oFAUP;sCAhCU,2BAA2B;IADvC,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,2BAA2B,CAiCvC","sourcesContent":["import { Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { OperationDefinition } from './operation-definition'\n\n/**\n * ๊ณต์ • ์ถ•์„ ์ฑ„์šฐ๊ณ  ๊ณ ์นœ๋‹ค.\n *\n * โ”€โ”€ ์™œ ๋งˆ์Šคํ„ฐ๋Š” ๊ทธ๋ฆฌ๋“œ์—์„œ ๊ณ ์น  ์ˆ˜ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—…๋ฌด ๊ธฐ๋ก๊ณผ ๋‹ฌ๋ฆฌ ๋งˆ์Šคํ„ฐ๋Š” **์„ ์–ธ**์ด๋‹ค. ใ€Œ์ด ์‚ฌ๋žŒ์ด ์šฉ์ ‘ ์ž๊ฒฉ์„ ๊ฐ–๋Š”๋‹คใ€๋Š” ์ผ์–ด๋‚œ ์ผ์ด ์•„๋‹ˆ๋ผ ์ง€๊ธˆ์˜\n * ๊ทœ์ •์ด๊ณ , ๊ทœ์ •์€ ๋ฐ”๋€๋‹ค. ์—†์•จ ๋•Œ ํ–‰์„ ์ง€์šฐ์ง€ ์•Š๊ณ  ์œ ํšจ ๊ธฐ๊ฐ„์˜ ๋์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด ๊ทธ๋ž˜์„œ๋‹ค โ€”\n * ์ง€์šฐ๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€๋‚œ ๊ธฐ๋ก์ด ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์„ ์žƒ๋Š”๋‹ค.\n *\n * ๊ทœ์น™์€ `master-crud.ts` ํ•œ ๊ณณ์— ์žˆ๋‹ค. ์—ฌ๊ธฐ๋Š” ์ถ•์˜ ์ด๋ฆ„๋งŒ ๋ถ™์ธ๋‹ค.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(OperationDefinition)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋ณด๋‚ธ ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•œ๋‹ค.\n *\n * ํŒจ์น˜๋ฅผ `ScalarObject` ๋กœ ๋ฐ›๋Š”๋‹ค โ€” ์ถ•๋งˆ๋‹ค ์ž…๋ ฅ ํƒ€์ž…์„ ๋”ฐ๋กœ ๋งŒ๋“ค๋ฉด ์นธ์„ ํ•˜๋‚˜ ๋”ํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๊ณณ์„\n * ๊ณ ์ณ์•ผ ํ•˜๊ณ , ํ•œ์ชฝ์„ ๋น ๋œจ๋ฆฌ๋ฉด ๊ทธ ์นธ์ด ์˜ค๋ฅ˜ ๋ณด๊ณ  ์—†์ด ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ํƒ€์ž…์ด ์žˆ๋Š”\n * ์—”ํ‹ฐํ‹ฐ๋ผ ๋ฌด์—‡์ด ์ €์žฅ๋๋Š”์ง€ ์Šคํ‚ค๋งˆ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
1
+ {"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Arg, Ctx, Directive, FieldResolver, Int, Mutation, ObjectType, Field, Query, Resolver, Root } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { OperationDefinition } from './operation-definition'\nimport { RecipeDefinition } from '../recipe/recipe-definition'\nimport { RouteDefinition } from '../recipe/route-definition'\nimport { indexMultiReferrers } from '../resource/referrers'\n\n/**\n * ๊ณต์ • ์ถ•์„ ์ฑ„์šฐ๊ณ  ๊ณ ์นœ๋‹ค.\n *\n * โ”€โ”€ ์™œ ๋งˆ์Šคํ„ฐ๋Š” ๊ทธ๋ฆฌ๋“œ์—์„œ ๊ณ ์น  ์ˆ˜ ์žˆ๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์—…๋ฌด ๊ธฐ๋ก๊ณผ ๋‹ฌ๋ฆฌ ๋งˆ์Šคํ„ฐ๋Š” **์„ ์–ธ**์ด๋‹ค. ใ€Œ์ด ์‚ฌ๋žŒ์ด ์šฉ์ ‘ ์ž๊ฒฉ์„ ๊ฐ–๋Š”๋‹คใ€๋Š” ์ผ์–ด๋‚œ ์ผ์ด ์•„๋‹ˆ๋ผ ์ง€๊ธˆ์˜\n * ๊ทœ์ •์ด๊ณ , ๊ทœ์ •์€ ๋ฐ”๋€๋‹ค. ์—†์•จ ๋•Œ ํ–‰์„ ์ง€์šฐ์ง€ ์•Š๊ณ  ์œ ํšจ ๊ธฐ๊ฐ„์˜ ๋์„ ์ฑ„์šฐ๋Š” ๊ฒƒ์ด ๊ทธ๋ž˜์„œ๋‹ค โ€”\n * ์ง€์šฐ๋ฉด ๊ทธ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ง€๋‚œ ๊ธฐ๋ก์ด ๊ฐ€๋ฆฌํ‚ฌ ๊ฒƒ์„ ์žƒ๋Š”๋‹ค.\n *\n * ๊ทœ์น™์€ `master-crud.ts` ํ•œ ๊ณณ์— ์žˆ๋‹ค. ์—ฌ๊ธฐ๋Š” ์ถ•์˜ ์ด๋ฆ„๋งŒ ๋ถ™์ธ๋‹ค.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **์ด ๊ณต์ •์„ ๋ˆ„๊ฐ€ ์“ฐ๋‚˜** โ€” ๋“ค์–ด์˜ค๋Š” ๊ด€๊ณ„.\n *\n * โ”€โ”€ ์™œ ํ•„์š”ํ•œ๊ฐ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ๊ณต์ • ํ•˜๋‚˜๋ฅผ ๊ณ ์น˜๊ฑฐ๋‚˜ ์—†์•จ ๋•Œ ๋ฌด์—‡์ด ๋”ธ๋ ค ๋ฌด๋„ˆ์ง€๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์—ˆ๋‹ค. ๋ผ์šฐํŒ…๊ณผ ์ œ์กฐ๋ฒ•์„ ํ•˜๋‚˜์”ฉ ์—ด์–ด\n * ๋‹จ๊ณ„ ๋ชฉ๋ก์„ ๋ˆˆ์œผ๋กœ ํ›‘๋Š” ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค. ์ง€๊ธˆ miratek ์€ ๋ผ์šฐํŒ… ๋‹ค์„ฏ์— ์ œ์กฐ๋ฒ• ๋‹ค์„ฏ์ด๋ผ ๊ทธ๊ฒƒ์ด\n * ๋˜์ง€๋งŒ, ์ œํ’ˆ์ด ๋Š˜๋ฉด ์•ˆ ๋œ๋‹ค.\n *\n * โ”€โ”€ ๋ฐฐ์—ด ์นธ์ด๋ผ ํ›‘๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * `RouteDefinition.steps` ์™€ `RecipeDefinition.inputs[].operation` ์€ `simple-json` ์ด๋‹ค.\n * ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ทธ ์•ˆ์„ ๋ชป ๋ณด๋ฏ€๋กœ `IN` ์œผ๋กœ ๋ชป ์ขํžŒ๋‹ค. ํ‘œ๋ฅผ ํ›‘์–ด ๋’ค์ง‘๋Š” ์ˆ˜๋ฐ–์— ์—†๋‹ค.\n *\n * **๊ทธ๋ž˜์„œ ์ƒํ•œ์ด ์žˆ๊ณ , ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ๋งํ•œ๋‹ค**(`referrerScanCapped`). ์กฐ์šฉํžˆ ์ž๋ฅด๋ฉด ใ€Œ์ด ๊ณต์ •์„\n * ์•„๋ฌด๋„ ์•ˆ ์“ด๋‹คใ€์™€ ใ€Œ๋„ˆ๋ฌด ๋งŽ์•„ ๋‹ค ๋ชป ๋ดค๋‹คใ€๊ฐ€ ๊ฐ™์•„ ๋ณด์ธ๋‹ค. ์•ž์—ฃ๊ฒƒ์€ ์ง€์›Œ๋„ ๋˜๋Š” ๊ณต์ •์ด๊ณ \n * ๋’ค์—ฃ๊ฒƒ์€ ์ง€์šฐ๋ฉด ๋ผ์ธ์ด ์„ ๋‹ค. ํ’ˆ๋ชฉ์˜ ์ œ์กฐ๋ฒ• ํ›‘๊ธฐ๊ฐ€ ๊ฐ™์€ ์ž๋ฆฌ์— ๊ฐ™์€ ๊ฒƒ์„ ๋‘”๋‹ค.\n */\nconst OPERATION_SCAN_LIMIT = 2000\n\ninterface OperationUse {\n /** ์ด ๊ณต์ •์„ ๋‹จ๊ณ„๋กœ ๊ฐ–๋Š” ๋ผ์šฐํŒ…๋“ค. */\n routes: Map<string, string[]>\n /** ์ด ๊ณต์ •์—์„œ ์ž์žฌ๋ฅผ ๋„ฃ๋Š” ์ œ์กฐ๋ฒ•๋“ค. */\n recipes: Map<string, string[]>\n /** ์ƒํ•œ์— ๊ฑธ๋ ค ๋‹ค ๋ณด์ง€ ๋ชปํ–ˆ๋‚˜. */\n capped: boolean\n}\n\nasync function scanOperationUse(domain: Domain): Promise<OperationUse> {\n const routeRepo = getRepository(RouteDefinition)\n const recipeRepo = getRepository(RecipeDefinition)\n\n const [routeTotal, recipeTotal] = await Promise.all([\n routeRepo.count({ where: { domain: { id: domain.id } } as any }),\n recipeRepo.count({ where: { domain: { id: domain.id } } as any })\n ])\n\n const [routeRows, recipeRows] = await Promise.all([\n /*\n * `id` ๋ฅผ ํ•จ๊ป˜ ๋ฝ‘๋Š”๋‹ค. ๋นผ๋ฉด TypeORM ์ด ใ€Œno such column: distinctAlias.โ€ฆ_idใ€๋กœ ํ„ฐ์ง„๋‹ค โ€”\n * `take` ๋ฅผ ์“ฐ๋ฉด ์ค‘๋ณต ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ํ‚ค๋กœ ํ•œ ๋ฒˆ ๋” ๊ฐ์‹ธ๋Š”๋ฐ, ๊ทธ ํ‚ค๋ฅผ ์•ˆ ๋ฝ‘์œผ๋ฉด ๊ฐ์Œ€ ๊ฒƒ์ด ์—†๋‹ค.\n */\n routeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'steps'] as any,\n take: OPERATION_SCAN_LIMIT\n }),\n recipeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'inputs'] as any,\n take: OPERATION_SCAN_LIMIT\n })\n ])\n\n const routes = indexMultiReferrers(\n routeRows as any[],\n one => one.steps ?? [],\n one => one.name\n )\n\n const recipes = indexMultiReferrers(\n recipeRows as any[],\n one => (one.inputs ?? []).map((part: any) => part?.operation),\n one => one.name\n )\n\n return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length }\n}\n\n/** ์š”์ฒญ ์•ˆ์—์„œ ํ•œ ๋ฒˆ๋งŒ ํ›‘๋Š”๋‹ค. **์•ฝ์†์„ ๋‹ด๋Š”๋‹ค** โ€” ์ค„๋“ค์ด ๊ฑฐ์˜ ๋™์‹œ์— ๋ฌป๋Š”๋‹ค. */\nfunction operationUseOf(context: ResolverContext): Promise<OperationUse> {\n const state = context.state as { domain: Domain; operationUse?: Promise<OperationUse> }\n\n state.operationUse = state.operationUse || scanOperationUse(state.domain)\n\n return state.operationUse\n}\n\n@Resolver(OperationDefinition)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * ์ด ๊ณต์ •์„ ๋‹จ๊ณ„๋กœ ๊ฐ–๋Š” **๋ผ์šฐํŒ…๋“ค.**\n *\n * ๊ณต์ •์„ ๊ณ ์น˜๊ธฐ ์ „์— ๋ฌด์—‡์ด ๋”ธ๋ ค ์˜ค๋Š”์ง€ ์—ฌ๊ธฐ์„œ ๋ณธ๋‹ค. ์—ฌ๋Ÿฟ์ผ ์ˆ˜ ์žˆ๋‹ค โ€” ๊ฐ™์€ ๊ณต์ •์„ ์—ฌ๋Ÿฌ ๋ผ์šฐํŒ…์ด\n * ์ง€๋‚œ๋‹ค(์ ˆ๋‹จ์€ ํ‘œ์ค€์—๋„ ๋น ๋ฅธ ๊ฒƒ์—๋„ ์žˆ๋‹ค).\n *\n * ์•„๋ฌด๋„ ์•ˆ ์“ฐ๋ฉด ๋นˆ ๋ชฉ๋ก์ด๋‹ค. ๋‹ค๋งŒ ๊ทธ๊ฒƒ์ด ใ€Œ์•ˆ ์“ด๋‹คใ€์ธ์ง€ ใ€Œ๋‹ค ๋ชป ๋ดค๋‹คใ€์ธ์ง€๋Š”\n * `referrerScanCapped` ๊ฐ€ ๋งํ•œ๋‹ค.\n */\n @FieldResolver(type => [String], { description: 'Routes that include this operation as a step' })\n async usedInRoutes(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).routes.get(operation.name) ?? []\n }\n\n /**\n * ์ด ๊ณต์ •์—์„œ ์ž์žฌ๋ฅผ ๋„ฃ๋Š” **์ œ์กฐ๋ฒ•๋“ค.**\n *\n * ๋ผ์šฐํŒ…์€ ใ€Œ์–ด๋””๋ฅผ ์ง€๋‚˜๋‚˜ใ€์ด๊ณ  ์ด๊ฒƒ์€ ใ€Œ๊ฑฐ๊ธฐ์„œ ๋ฌด์—‡์ด ๋น ์ง€๋‚˜ใ€๋‹ค. ๊ณต์ •์„ ์—†์• ๋ฉด ๊ทธ ์ž์žฌ๊ฐ€\n * ๋น ์งˆ ์ž๋ฆฌ๋ฅผ ์žƒ๋Š”๋‹ค.\n */\n @FieldResolver(type => [String], { description: 'Recipes that consume materials at this operation' })\n async consumedAt(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).recipes.get(operation.name) ?? []\n }\n\n /**\n * ๋ผ์šฐํŒ…ยท์ œ์กฐ๋ฒ•์„ ๋‹ค ๋ณด์ง€ ๋ชปํ–ˆ๋‚˜.\n *\n * **์กฐ์šฉํžˆ ์ž๋ฅด์ง€ ์•Š๋Š”๋‹ค.** ์ƒํ•œ์— ๊ฑธ๋ฆฌ๋ฉด ์œ„์˜ ๋‘ ์นธ์ด ๋œ ์ฐฌ ๋‹ต์ด๊ณ , ๊ทธ๊ฒƒ์„ ๋งํ•˜์ง€ ์•Š์œผ๋ฉด\n * ใ€Œ์“ฐ๋Š” ๋ฐ๊ฐ€ ์—†๋‹คใ€์™€ ใ€Œ๋ชป ๋ดค๋‹คใ€๊ฐ€ ๊ฐ™์•„ ๋ณด์ธ๋‹ค.\n */\n @FieldResolver(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' })\n async referrerScanCapped(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await operationUseOf(context)).capped\n }\n\n /**\n * ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋ณด๋‚ธ ๋ณ€๊ฒฝ์„ ํ•œ ๋ฒˆ์— ์ ์šฉํ•œ๋‹ค.\n *\n * ํŒจ์น˜๋ฅผ `ScalarObject` ๋กœ ๋ฐ›๋Š”๋‹ค โ€” ์ถ•๋งˆ๋‹ค ์ž…๋ ฅ ํƒ€์ž…์„ ๋”ฐ๋กœ ๋งŒ๋“ค๋ฉด ์นธ์„ ํ•˜๋‚˜ ๋”ํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๊ณณ์„\n * ๊ณ ์ณ์•ผ ํ•˜๊ณ , ํ•œ์ชฝ์„ ๋น ๋œจ๋ฆฌ๋ฉด ๊ทธ ์นธ์ด ์˜ค๋ฅ˜ ๋ณด๊ณ  ์—†์ด ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ์€ ํƒ€์ž…์ด ์žˆ๋Š”\n * ์—”ํ‹ฐํ‹ฐ๋ผ ๋ฌด์—‡์ด ์ €์žฅ๋๋Š”์ง€ ์Šคํ‚ค๋งˆ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
@@ -1,7 +1,15 @@
1
1
  export declare class OperationMaster {
2
2
  operations: string;
3
+ /**
4
+ * ๋” ์žˆ๋‚˜ โ€” **์ด ๊ฐ’์„ ์•ˆ ๋ณด๊ณ  ์“ฐ๋ฉด ์กฐ์šฉํžˆ ์ž˜๋ฆฐ ๋งˆ์Šคํ„ฐ๋กœ ํŠธ์œˆ์„ ์„ธ์šฐ๊ฒŒ ๋œ๋‹ค.**
5
+ *
6
+ * ๊ฑฐ์ง“์ด ๋  ๋•Œ๊นŒ์ง€ `next` ๋ฅผ `after` ๋กœ ๋„˜๊ฒจ ์ด์–ด ๋ฐ›๋Š”๋‹ค.
7
+ */
8
+ hasMore: boolean;
9
+ /** ์ด์–ด ๋ฐ›์„ ์ž๋ฆฌ. ๋” ์—†์œผ๋ฉด ์—†๋‹ค. */
10
+ next?: string;
3
11
  }
4
12
  export declare class OperationQuery {
5
- /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŠธ์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
6
- operationMaster(context: ResolverContext): Promise<OperationMaster>;
13
+ /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŒ…์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
14
+ operationMaster(after: string | undefined, limit: number | undefined, context: ResolverContext): Promise<OperationMaster>;
7
15
  }
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OperationQuery = exports.OperationMaster = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
- const shell_1 = require("@things-factory/shell");
6
+ const master_page_query_1 = require("../master-page-query");
7
7
  const operation_definition_1 = require("./operation-definition");
8
8
  const operation_master_1 = require("./operation-master");
9
9
  let OperationMaster = class OperationMaster {
@@ -13,26 +13,41 @@ tslib_1.__decorate([
13
13
  (0, type_graphql_1.Field)(type => String, { description: 'OperationDef[] as JSON text' }),
14
14
  tslib_1.__metadata("design:type", String)
15
15
  ], OperationMaster.prototype, "operations", void 0);
16
+ tslib_1.__decorate([
17
+ (0, type_graphql_1.Field)({ description: 'true when more rows remain โ€” keep pulling with next as after' }),
18
+ tslib_1.__metadata("design:type", Boolean)
19
+ ], OperationMaster.prototype, "hasMore", void 0);
20
+ tslib_1.__decorate([
21
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'cursor for the next page โ€” the last name in this page' }),
22
+ tslib_1.__metadata("design:type", String)
23
+ ], OperationMaster.prototype, "next", void 0);
16
24
  exports.OperationMaster = OperationMaster = tslib_1.__decorate([
17
25
  (0, type_graphql_1.ObjectType)({ description: 'Operation definitions as the twin receives them' })
18
26
  ], OperationMaster);
19
27
  let OperationQuery = class OperationQuery {
20
- /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŠธ์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
21
- async operationMaster(context) {
28
+ /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŒ…์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */
29
+ async operationMaster(after, limit, context) {
22
30
  const { domain } = context.state;
23
- const operations = await (0, shell_1.getRepository)(operation_definition_1.OperationDefinition).find({
24
- where: { domain: { id: domain.id } },
25
- order: { name: 'ASC' }
26
- });
27
- return { operations: JSON.stringify((0, operation_master_1.operationMaster)(operations).operations) };
31
+ const request = { after, limit };
32
+ const page = await (0, master_page_query_1.pullPage)(operation_definition_1.OperationDefinition, domain, request);
33
+ /* ํ†ต์งธ๋กœ ๋‹ฌ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด **์ž๋ฅด์ง€ ์•Š๊ณ  ๊ฑฐ์ ˆํ•œ๋‹ค**(ยง`master-page`). */
34
+ (0, master_page_query_1.refuseIfTooLarge)('๊ณต์ •', request, page);
35
+ const operations = page.rows;
36
+ return {
37
+ operations: JSON.stringify((0, operation_master_1.operationMaster)(operations).operations),
38
+ hasMore: page.hasMore,
39
+ ...(page.next ? { next: page.next } : {})
40
+ };
28
41
  }
29
42
  };
30
43
  exports.OperationQuery = OperationQuery;
31
44
  tslib_1.__decorate([
32
45
  (0, type_graphql_1.Query)(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' }),
33
- tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
46
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('after', { nullable: true, description: 'resume after this name โ€” the previous page\'s next' })),
47
+ tslib_1.__param(1, (0, type_graphql_1.Arg)('limit', type => type_graphql_1.Int, { nullable: true, description: 'rows per page โ€” omit only when the axis is small enough to pull whole' })),
48
+ tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
34
49
  tslib_1.__metadata("design:type", Function),
35
- tslib_1.__metadata("design:paramtypes", [Object]),
50
+ tslib_1.__metadata("design:paramtypes", [String, Number, Object]),
36
51
  tslib_1.__metadata("design:returntype", Promise)
37
52
  ], OperationQuery.prototype, "operationMaster", null);
38
53
  exports.OperationQuery = OperationQuery = tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"operation-query.js","sourceRoot":"","sources":["../../../server/service/operation/operation-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AAEtE,iDAAqD;AAErD,iEAA4D;AAC5D,yDAA4E;AAGrE,IAAM,eAAe,GAArB,MAAM,eAAe;CAG3B,CAAA;AAHY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;;mDACpD;0BAFP,eAAe;IAD3B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;GAClE,eAAe,CAG3B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,qCAAqC;IAE/B,AAAN,KAAK,CAAC,eAAe,CAAQ,OAAwB;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAa,EAAC,0CAAmB,CAAC,CAAC,IAAI,CAAC;YAC/D,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE;YACpC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;SACvB,CAAC,CAAA;QAEF,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,kCAAoB,EAAC,UAAU,CAAC,CAAC,UAAU,CAAC,EAAE,CAAA;IACpF,CAAC;CACF,CAAA;AAbY,wCAAc;AAGnB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAC1E,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAS3B;yBAZU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,cAAc,CAa1B","sourcesContent":["import { Ctx, Field, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { OperationDefinition } from './operation-definition'\nimport { operationMaster as buildOperationMaster } from './operation-master'\n\n@ObjectType({ description: 'Operation definitions as the twin receives them' })\nexport class OperationMaster {\n @Field(type => String, { description: 'OperationDef[] as JSON text' })\n operations: string\n}\n\n@Resolver(OperationDefinition)\nexport class OperationQuery {\n /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŠธ์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */\n @Query(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' })\n async operationMaster(@Ctx() context: ResolverContext): Promise<OperationMaster> {\n const { domain } = context.state\n\n const operations = await getRepository(OperationDefinition).find({\n where: { domain: { id: domain.id } },\n order: { name: 'ASC' }\n })\n\n return { operations: JSON.stringify(buildOperationMaster(operations).operations) }\n }\n}\n"]}
1
+ {"version":3,"file":"operation-query.js","sourceRoot":"","sources":["../../../server/service/operation/operation-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAgF;AAIhF,4DAAiE;AAEjE,iEAA4D;AAC5D,yDAA4E;AAGrE,IAAM,eAAe,GAArB,MAAM,eAAe;CAgB3B,CAAA;AAhBY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;;mDACpD;AAQlB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;gDACvE;AAIhB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;;6CACnG;0BAdF,eAAe;IAD3B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;GAClE,eAAe,CAgB3B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,qCAAqC;IAE/B,AAAN,KAAK,CAAC,eAAe,CACkF,KAAyB,EACO,KAAyB,EACvJ,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAQ,EAAsB,0CAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEtF,0DAA0D;QAC1D,IAAA,oCAAgB,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAA;QAE5B,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,kCAAoB,EAAC,UAAU,CAAC,CAAC,UAAU,CAAC;YACvE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC;CACF,CAAA;AAxBY,wCAAc;AAGnB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAE9F,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAA;IACnG,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE,CAAC,CAAA;IACnI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAiBP;yBAvBU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,cAAc,CAwB1B","sourcesContent":["import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { pullPage, refuseIfTooLarge } from '../master-page-query'\n\nimport { OperationDefinition } from './operation-definition'\nimport { operationMaster as buildOperationMaster } from './operation-master'\n\n@ObjectType({ description: 'Operation definitions as the twin receives them' })\nexport class OperationMaster {\n @Field(type => String, { description: 'OperationDef[] as JSON text' })\n operations: string\n\n /**\n * ๋” ์žˆ๋‚˜ โ€” **์ด ๊ฐ’์„ ์•ˆ ๋ณด๊ณ  ์“ฐ๋ฉด ์กฐ์šฉํžˆ ์ž˜๋ฆฐ ๋งˆ์Šคํ„ฐ๋กœ ํŠธ์œˆ์„ ์„ธ์šฐ๊ฒŒ ๋œ๋‹ค.**\n *\n * ๊ฑฐ์ง“์ด ๋  ๋•Œ๊นŒ์ง€ `next` ๋ฅผ `after` ๋กœ ๋„˜๊ฒจ ์ด์–ด ๋ฐ›๋Š”๋‹ค.\n */\n @Field({ description: 'true when more rows remain โ€” keep pulling with next as after' })\n hasMore: boolean\n\n /** ์ด์–ด ๋ฐ›์„ ์ž๋ฆฌ. ๋” ์—†์œผ๋ฉด ์—†๋‹ค. */\n @Field(type => String, { nullable: true, description: 'cursor for the next page โ€” the last name in this page' })\n next?: string\n\n}\n\n@Resolver(OperationDefinition)\nexport class OperationQuery {\n /** ๊ณต์ • ์ •์˜ ์ „์ฒด โ€” ๋ผ์šฐํŒ…์˜ ๋‹จ๊ณ„๊ฐ€ ์ด ํ‚ค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. */\n @Query(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' })\n async operationMaster(\n @Arg('after', { nullable: true, description: 'resume after this name โ€” the previous page\\'s next' }) after: string | undefined,\n @Arg('limit', type => Int, { nullable: true, description: 'rows per page โ€” omit only when the axis is small enough to pull whole' }) limit: number | undefined,\n @Ctx() context: ResolverContext\n ): Promise<OperationMaster> {\n const { domain } = context.state\n\n const request = { after, limit }\n const page = await pullPage<OperationDefinition>(OperationDefinition, domain, request)\n\n /* ํ†ต์งธ๋กœ ๋‹ฌ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ํ•œ๋„๋ฅผ ๋„˜์œผ๋ฉด **์ž๋ฅด์ง€ ์•Š๊ณ  ๊ฑฐ์ ˆํ•œ๋‹ค**(ยง`master-page`). */\n refuseIfTooLarge('๊ณต์ •', request, page)\n\n const operations = page.rows\n\n return {\n operations: JSON.stringify(buildOperationMaster(operations).operations),\n hasMore: page.hasMore,\n ...(page.next ? { next: page.next } : {})\n }\n }\n}\n"]}
@@ -53,12 +53,12 @@ tslib_1.__decorate([
53
53
  ], Person.prototype, "homeLocation", void 0);
54
54
  tslib_1.__decorate([
55
55
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
56
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'WorkCalendarEntry[] as JSON text' }),
56
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'WorkCalendarEntry[]' }),
57
57
  tslib_1.__metadata("design:type", Array)
58
58
  ], Person.prototype, "workCalendar", void 0);
59
59
  tslib_1.__decorate([
60
60
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
61
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' }),
61
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'ResourceProperty[]' }),
62
62
  tslib_1.__metadata("design:type", Array)
63
63
  ], Person.prototype, "properties", void 0);
64
64
  tslib_1.__decorate([
@@ -68,7 +68,7 @@ tslib_1.__decorate([
68
68
  ], Person.prototype, "testSpecificationIds", void 0);
69
69
  tslib_1.__decorate([
70
70
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
71
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'TestResult[] as JSON text' }),
71
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'TestResult[]' }),
72
72
  tslib_1.__metadata("design:type", Array)
73
73
  ], Person.prototype, "testResults", void 0);
74
74
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"person.js","sourceRoot":"","sources":["../../../server/service/personnel/person.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ์ž‘์—…์ž โ€” **ISA-95 `Person`**.\n *\n * ์‚ฌ๋žŒ์€ ์„ค๋น„์™€ ๋‹ค๋ฅด๊ฒŒ ์‚ฐ๋‹ค. ๊ณ ์žฅ ๋‚˜์ง€ ์•Š๊ณ  ๊ต๋Œ€๋กœ ์ผํ•˜๋ฉฐ, ์ž๊ฒฉ์ด ๋งŒ๋ฃŒ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์› ๋„ท์„ ํ•œ ๊ทธ๋ฆ‡์—\n * ๋‹ด์ง€ ์•Š๋Š”๋‹ค โ€” ํ•œ์ชฝ์˜ ์–ดํœ˜๊ฐ€ ๋‹ค๋ฅธ ์ชฝ์— ๋ถ™์œผ๋ฉด ๋‘˜ ๋‹ค ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * ํ•„๋“œ ์ด๋ฆ„์€ ์ปค๋„ ๊ณ„์•ฝ์˜ `persons` ํ•ญ๋ชฉ๊ณผ ๊ฐ™๋‹ค(`@operato/ops-contract`). ์˜ฎ๊ธธ ๋•Œ ๋ฒˆ์—ญ์ด ์—†๋‹ค.\n */\n@Entity({ name: 'ops_person' })\n@Index('ix_ops_person_0', (person: Person) => [person.domain, person.name], { unique: true })\n@ObjectType({ description: 'ISA-95 Person โ€” a worker who can be assigned to operations' })\nexport class Person {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((person: Person) => person.domain)\n domainId?: string\n\n /** ํ‘œ์ค€ `PersonID` โ€” ํŠธ์œˆ์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ `persons[].id` ๊ฐ€ ๋œ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n /** ์‚ฌ๋žŒ์ด ์ฝ๋Š” ์ด๋ฆ„. ํ‘œ์ค€ `PersonName`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * ์†ํ•œ ๋“ฑ๊ธ‰๋“ค โ€” ํ‘œ์ค€ `PersonnelClassID`(๋ณต์ˆ˜).\n *\n * ๋ณต์ˆ˜์ธ ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ํ•œ ์‚ฌ๋žŒ์ด ์šฉ์ ‘ ์ž๊ฒฉ๊ณผ ์ง€๊ฒŒ์ฐจ ์ž๊ฒฉ์„ ํ•จ๊ป˜ ๊ฐ–๋Š” ์ผ์ด ํ”ํ•˜๊ณ , ํ•˜๋‚˜๋งŒ ๋‹ด์œผ๋ฉด\n * ๊ทธ ์‚ฌ๋žŒ์€ ํ•œ์ชฝ ๊ณต์ •์—์„œ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n personnelClassIds?: string[]\n\n /** ์ด ์‚ฌ๋žŒ์ด ์ฃผ๋กœ ์žˆ๋Š” ์ž๋ฆฌ โ€” ํ‘œ์ค€ `OperationalLocation`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n homeLocation?: string\n\n /** ๊ทผ๋ฌด ์บ˜๋ฆฐ๋” โ€” ํ‘œ์ค€ `WorkCalendar`. ๊ต๋Œ€ ์ด๋ฆ„๊ณผ ๊ตฌ๊ฐ„์ด ์—ฌ๊ธฐ ์žˆ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'WorkCalendarEntry[] as JSON text' })\n workCalendar?: Record<string, unknown>[]\n\n /** ๊ฐœ์ฒด ์†์„ฑ โ€” ํ‘œ์ค€ `PersonProperty`. `classPropertyId` ๋กœ ๋“ฑ๊ธ‰ ์†์„ฑ์„ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' })\n properties?: Record<string, unknown>[]\n\n /** ์ด ์‚ฌ๋žŒ์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” `TestSpecification` ์ฐธ์กฐ๋“ค โ€” ํ‘œ์ค€ `TestSpecificationID`. ์ฐธ์กฐ๋งŒ ๊ฐ–๋Š”๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /**\n * `TestResult` โ€” ํ‘œ์ค€ `TestResult`.\n *\n * ๋“ฑ๊ธ‰์ด `TestSpecification` ์„ ์š”๊ตฌํ•˜๋Š”๋ฐ ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ์•„์˜ˆ ์—†์œผ๋ฉด, ์ž๊ฒฉ์ด ์„ฑ๋ฆฝํ•˜๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค.\n * ๋งŒ๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ๋–จ์–ด์กŒ์œผ๋ฉด ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ์ž‘์—…์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'TestResult[] as JSON text' })\n testResults?: Record<string, unknown>[]\n\n /** ์–ธ์ œ๋ถ€ํ„ฐ ์ด ์‚ฌ๋žŒ์ด ํ˜„์žฅ์— ์žˆ๋‚˜ โ€” ํ‘œ์ค€ `EffectiveStartDate`. ์ž…์‚ฌ ์˜ˆ์ •์ž๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** ์–ธ์ œ๊นŒ์ง€ โ€” ํ‘œ์ค€ `EffectiveEndDate`. ํ‡ด์‚ฌํ•œ ์‚ฌ๋žŒ์ด ์˜์›ํžˆ ๋ฐฐ์ • ๋Œ€์ƒ์œผ๋กœ ๋‚จ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((person: Person) => person.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((person: Person) => person.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"person.js","sourceRoot":"","sources":["../../../server/service/personnel/person.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ์ž‘์—…์ž โ€” **ISA-95 `Person`**.\n *\n * ์‚ฌ๋žŒ์€ ์„ค๋น„์™€ ๋‹ค๋ฅด๊ฒŒ ์‚ฐ๋‹ค. ๊ณ ์žฅ ๋‚˜์ง€ ์•Š๊ณ  ๊ต๋Œ€๋กœ ์ผํ•˜๋ฉฐ, ์ž๊ฒฉ์ด ๋งŒ๋ฃŒ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์› ๋„ท์„ ํ•œ ๊ทธ๋ฆ‡์—\n * ๋‹ด์ง€ ์•Š๋Š”๋‹ค โ€” ํ•œ์ชฝ์˜ ์–ดํœ˜๊ฐ€ ๋‹ค๋ฅธ ์ชฝ์— ๋ถ™์œผ๋ฉด ๋‘˜ ๋‹ค ๊ฑฐ์ง“์ด ๋œ๋‹ค.\n *\n * ํ•„๋“œ ์ด๋ฆ„์€ ์ปค๋„ ๊ณ„์•ฝ์˜ `persons` ํ•ญ๋ชฉ๊ณผ ๊ฐ™๋‹ค(`@operato/ops-contract`). ์˜ฎ๊ธธ ๋•Œ ๋ฒˆ์—ญ์ด ์—†๋‹ค.\n */\n@Entity({ name: 'ops_person' })\n@Index('ix_ops_person_0', (person: Person) => [person.domain, person.name], { unique: true })\n@ObjectType({ description: 'ISA-95 Person โ€” a worker who can be assigned to operations' })\nexport class Person {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((person: Person) => person.domain)\n domainId?: string\n\n /** ํ‘œ์ค€ `PersonID` โ€” ํŠธ์œˆ์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ `persons[].id` ๊ฐ€ ๋œ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n /** ์‚ฌ๋žŒ์ด ์ฝ๋Š” ์ด๋ฆ„. ํ‘œ์ค€ `PersonName`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * ์†ํ•œ ๋“ฑ๊ธ‰๋“ค โ€” ํ‘œ์ค€ `PersonnelClassID`(๋ณต์ˆ˜).\n *\n * ๋ณต์ˆ˜์ธ ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ํ•œ ์‚ฌ๋žŒ์ด ์šฉ์ ‘ ์ž๊ฒฉ๊ณผ ์ง€๊ฒŒ์ฐจ ์ž๊ฒฉ์„ ํ•จ๊ป˜ ๊ฐ–๋Š” ์ผ์ด ํ”ํ•˜๊ณ , ํ•˜๋‚˜๋งŒ ๋‹ด์œผ๋ฉด\n * ๊ทธ ์‚ฌ๋žŒ์€ ํ•œ์ชฝ ๊ณต์ •์—์„œ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n personnelClassIds?: string[]\n\n /** ์ด ์‚ฌ๋žŒ์ด ์ฃผ๋กœ ์žˆ๋Š” ์ž๋ฆฌ โ€” ํ‘œ์ค€ `OperationalLocation`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n homeLocation?: string\n\n /** ๊ทผ๋ฌด ์บ˜๋ฆฐ๋” โ€” ํ‘œ์ค€ `WorkCalendar`. ๊ต๋Œ€ ์ด๋ฆ„๊ณผ ๊ตฌ๊ฐ„์ด ์—ฌ๊ธฐ ์žˆ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'WorkCalendarEntry[]' })\n workCalendar?: Record<string, unknown>[]\n\n /** ๊ฐœ์ฒด ์†์„ฑ โ€” ํ‘œ์ค€ `PersonProperty`. `classPropertyId` ๋กœ ๋“ฑ๊ธ‰ ์†์„ฑ์„ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'ResourceProperty[]' })\n properties?: Record<string, unknown>[]\n\n /** ์ด ์‚ฌ๋žŒ์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” `TestSpecification` ์ฐธ์กฐ๋“ค โ€” ํ‘œ์ค€ `TestSpecificationID`. ์ฐธ์กฐ๋งŒ ๊ฐ–๋Š”๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /**\n * `TestResult` โ€” ํ‘œ์ค€ `TestResult`.\n *\n * ๋“ฑ๊ธ‰์ด `TestSpecification` ์„ ์š”๊ตฌํ•˜๋Š”๋ฐ ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ์•„์˜ˆ ์—†์œผ๋ฉด, ์ž๊ฒฉ์ด ์„ฑ๋ฆฝํ•˜๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค.\n * ๋งŒ๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ๋–จ์–ด์กŒ์œผ๋ฉด ๊ทธ ์‚ฌ๋žŒ์—๊ฒŒ ์ž‘์—…์ด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'TestResult[]' })\n testResults?: Record<string, unknown>[]\n\n /** ์–ธ์ œ๋ถ€ํ„ฐ ์ด ์‚ฌ๋žŒ์ด ํ˜„์žฅ์— ์žˆ๋‚˜ โ€” ํ‘œ์ค€ `EffectiveStartDate`. ์ž…์‚ฌ ์˜ˆ์ •์ž๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** ์–ธ์ œ๊นŒ์ง€ โ€” ํ‘œ์ค€ `EffectiveEndDate`. ํ‡ด์‚ฌํ•œ ์‚ฌ๋žŒ์ด ์˜์›ํžˆ ๋ฐฐ์ • ๋Œ€์ƒ์œผ๋กœ ๋‚จ์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((person: Person) => person.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((person: Person) => person.updater)\n updaterId?: string\n}\n"]}
@@ -12,7 +12,7 @@ import { User } from '@things-factory/auth-base';
12
12
  *
13
13
  * ๊ทธ๋ฆฌ๊ณ  ํŠธ์œˆ ์ปค๋„์— `personnelClasses` ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ๋ถ™์ธ ์›๋ณธ์—๋Š” ๊ทธ ์‚ฌ์‹ค์ด ์—†์—ˆ๋‹ค.
14
14
  * ๊ทธ๋ž˜์„œ ใ€Œ์ž๊ฒฉ์ž๊ฐ€ ๋‘˜๋ฟ์ด๋ผ ์„ค๋น„๊ฐ€ ๋…ผ๋‹คใ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์—ˆ๋‹ค
15
- * (`operato-twin/design/integration/operato-mes.md` ยง5).
15
+ * (`operato-twin/design/integration/operato-plant.md` ยง5).
16
16
  *
17
17
  * โ”€โ”€ ํ•„๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์ง“์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
18
18
  * ์ปค๋„ ๊ณ„์•ฝ์˜ `ResourceClassDef` ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ด๋‹ค(`@operato/ops-contract`). ๊ฐ™์€ ์‚ฌ์‹ค์— ์ด๋ฆ„์ด
@@ -18,7 +18,7 @@ const auth_base_1 = require("@things-factory/auth-base");
18
18
  *
19
19
  * ๊ทธ๋ฆฌ๊ณ  ํŠธ์œˆ ์ปค๋„์— `personnelClasses` ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ๋ถ™์ธ ์›๋ณธ์—๋Š” ๊ทธ ์‚ฌ์‹ค์ด ์—†์—ˆ๋‹ค.
20
20
  * ๊ทธ๋ž˜์„œ ใ€Œ์ž๊ฒฉ์ž๊ฐ€ ๋‘˜๋ฟ์ด๋ผ ์„ค๋น„๊ฐ€ ๋…ผ๋‹คใ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์—ˆ๋‹ค
21
- * (`operato-twin/design/integration/operato-mes.md` ยง5).
21
+ * (`operato-twin/design/integration/operato-plant.md` ยง5).
22
22
  *
23
23
  * โ”€โ”€ ํ•„๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์ง“์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
24
24
  * ์ปค๋„ ๊ณ„์•ฝ์˜ `ResourceClassDef` ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ด๋‹ค(`@operato/ops-contract`). ๊ฐ™์€ ์‚ฌ์‹ค์— ์ด๋ฆ„์ด
@@ -63,7 +63,7 @@ tslib_1.__decorate([
63
63
  ], PersonnelClass.prototype, "testSpecificationIds", void 0);
64
64
  tslib_1.__decorate([
65
65
  (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
66
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' }),
66
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'ResourceProperty[]' }),
67
67
  tslib_1.__metadata("design:type", Array)
68
68
  ], PersonnelClass.prototype, "properties", void 0);
69
69
  tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"personnel-class.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-class.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ์ธ์› ๋“ฑ๊ธ‰ โ€” **ISA-95 `PersonnelClass`**.\n *\n * ๋“ฑ๊ธ‰์€ ์ž๊ฒฉ์ด๋‹ค. ใ€Œ์šฉ์ ‘ ์ž๊ฒฉใ€์ด ๋“ฑ๊ธ‰์ด๊ณ , ๊ทธ ์ž๊ฒฉ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ๊ฐœ์ฒด๋‹ค. ๊ณต์ •์€ ํŠน์ •์ธ์„ ์ง€๋ชฉํ•˜์ง€\n * ์•Š๊ณ  ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค โ€” ใ€Œ์šฉ์ ‘ ์ž๊ฒฉ์ž 2๋ช…ใ€.\n *\n * โ”€โ”€ ์™œ ์ด ํŒจํ‚ค์ง€๊ฐ€ ์ด๊ฒƒ์„ ๊ฐ–๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์›์€ ์ œํ’ˆ์˜ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ ํ˜„์žฅ์˜ ์‚ฌ์‹ค์ด๋‹ค. ๊ฐ™์€ ์‚ฌ๋žŒ์ด MES ์—์„œ๋„ WMS ์—์„œ๋„ ์ผํ•œ๋‹ค. ์ œํ’ˆ๋งˆ๋‹ค\n * ํ‘œ๋ฅผ ๋‘๋ฉด ํ•œ ์‚ฌ์‹ค์— ํ‘œ๊ฐ€ ๋‘˜์ด ๋œ๋‹ค.\n *\n * ๊ทธ๋ฆฌ๊ณ  ํŠธ์œˆ ์ปค๋„์— `personnelClasses` ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ๋ถ™์ธ ์›๋ณธ์—๋Š” ๊ทธ ์‚ฌ์‹ค์ด ์—†์—ˆ๋‹ค.\n * ๊ทธ๋ž˜์„œ ใ€Œ์ž๊ฒฉ์ž๊ฐ€ ๋‘˜๋ฟ์ด๋ผ ์„ค๋น„๊ฐ€ ๋…ผ๋‹คใ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์—ˆ๋‹ค\n * (`operato-twin/design/integration/operato-mes.md` ยง5).\n *\n * โ”€โ”€ ํ•„๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์ง“์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„ ๊ณ„์•ฝ์˜ `ResourceClassDef` ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ด๋‹ค(`@operato/ops-contract`). ๊ฐ™์€ ์‚ฌ์‹ค์— ์ด๋ฆ„์ด\n * ๋‘˜์ด๋ฉด ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ฒˆ์—ญ์ด ์ƒ๊ธฐ๊ณ , ๋ฒˆ์—ญ์ด ์žˆ์œผ๋ฉด ํ‹€๋ฆด ์ž๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค.\n */\n@Entity({ name: 'ops_personnel_class' })\n@Index('ix_ops_personnel_class_0', (klass: PersonnelClass) => [klass.domain, klass.name], { unique: true })\n@ObjectType({ description: 'ISA-95 PersonnelClass โ€” a qualification that operations require' })\nexport class PersonnelClass {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((klass: PersonnelClass) => klass.domain)\n domainId?: string\n\n /** ํ‘œ์ค€ `PersonnelClassID` โ€” ํŠธ์œˆ์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ `ResourceClassDef.id` ๊ฐ€ ๋œ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * ์ƒ์œ„ ๋“ฑ๊ธ‰๋“ค โ€” ํ‘œ์ค€ `PersonnelClassBaseID`(๋ณต์ˆ˜).\n *\n * ใ€Œ6์ถ• ์šฉ์ ‘ ์ž๊ฒฉใ€์ด ใ€Œ์šฉ์ ‘ ์ž๊ฒฉใ€์„ ์ƒ์†ํ•œ๋‹ค. ๋ฐฐ์ • ํŒ๋‹จ์ด ์ด ์ƒ์†์„ ํƒ€๋ฏ€๋กœ, ์ƒ์œ„ ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•ด๋„\n * ํ•˜์œ„ ์ž๊ฒฉ์ž๊ฐ€ ์žกํžŒ๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n baseIds?: string[]\n\n /** ์ด ๋“ฑ๊ธ‰์˜ ์ ๊ฒฉ์„ ์ •ํ•˜๋Š” `TestSpecification` ์ฐธ์กฐ๋“ค โ€” ํ‘œ์ค€ `TestSpecificationID`. ์ฐธ์กฐ๋งŒ ๊ฐ–๋Š”๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /** ๋“ฑ๊ธ‰ ์†์„ฑ โ€” ํ‘œ์ค€ `PersonnelClassProperty`. ๊ฐœ์ฒด ์†์„ฑ์ด `classPropertyId` ๋กœ ์ด๊ฒƒ์„ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' })\n properties?: Record<string, unknown>[]\n\n /**\n * ์–ธ์ œ๋ถ€ํ„ฐ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveStartDate`.\n *\n * ์ž๊ฒฉ ๊ทœ์ •์€ ๋ฏธ๋ž˜ ์‹œ์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค(ใ€Œ9์›”๋ถ€ํ„ฐ ์ด ์ž๊ฒฉ์ด ํ•„์š”ํ•˜๋‹คใ€). ์ด ์ž๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์„\n * ๋ฐ›์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ๋ฐ›๊ณ  ๋‚˜์„œ ์˜ค๋Š˜ ๋ฐฐ์ •์— ๋ฐ”๋กœ ์ ์šฉ๋œ๋‹ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveEndDate`. ์—†์œผ๋ฉด ๋์ด ์ •ํ•ด์ง€์ง€ ์•Š์•˜๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((klass: PersonnelClass) => klass.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((klass: PersonnelClass) => klass.updater)\n updaterId?: string\n}\n"]}
1
+ {"version":3,"file":"personnel-class.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-class.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ์ธ์› ๋“ฑ๊ธ‰ โ€” **ISA-95 `PersonnelClass`**.\n *\n * ๋“ฑ๊ธ‰์€ ์ž๊ฒฉ์ด๋‹ค. ใ€Œ์šฉ์ ‘ ์ž๊ฒฉใ€์ด ๋“ฑ๊ธ‰์ด๊ณ , ๊ทธ ์ž๊ฒฉ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ๊ฐœ์ฒด๋‹ค. ๊ณต์ •์€ ํŠน์ •์ธ์„ ์ง€๋ชฉํ•˜์ง€\n * ์•Š๊ณ  ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•œ๋‹ค โ€” ใ€Œ์šฉ์ ‘ ์ž๊ฒฉ์ž 2๋ช…ใ€.\n *\n * โ”€โ”€ ์™œ ์ด ํŒจํ‚ค์ง€๊ฐ€ ์ด๊ฒƒ์„ ๊ฐ–๋‚˜ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ธ์›์€ ์ œํ’ˆ์˜ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ ํ˜„์žฅ์˜ ์‚ฌ์‹ค์ด๋‹ค. ๊ฐ™์€ ์‚ฌ๋žŒ์ด MES ์—์„œ๋„ WMS ์—์„œ๋„ ์ผํ•œ๋‹ค. ์ œํ’ˆ๋งˆ๋‹ค\n * ํ‘œ๋ฅผ ๋‘๋ฉด ํ•œ ์‚ฌ์‹ค์— ํ‘œ๊ฐ€ ๋‘˜์ด ๋œ๋‹ค.\n *\n * ๊ทธ๋ฆฌ๊ณ  ํŠธ์œˆ ์ปค๋„์— `personnelClasses` ์ž๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ง€๊ธˆ๊นŒ์ง€ ๋ถ™์ธ ์›๋ณธ์—๋Š” ๊ทธ ์‚ฌ์‹ค์ด ์—†์—ˆ๋‹ค.\n * ๊ทธ๋ž˜์„œ ใ€Œ์ž๊ฒฉ์ž๊ฐ€ ๋‘˜๋ฟ์ด๋ผ ์„ค๋น„๊ฐ€ ๋…ผ๋‹คใ€๋ฅผ ๋งํ•  ์ˆ˜ ์—†์—ˆ๋‹ค\n * (`operato-twin/design/integration/operato-plant.md` ยง5).\n *\n * โ”€โ”€ ํ•„๋“œ ์ด๋ฆ„์„ ์ƒˆ๋กœ ์ง“์ง€ ์•Š๋Š”๋‹ค โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n * ์ปค๋„ ๊ณ„์•ฝ์˜ `ResourceClassDef` ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์“ด๋‹ค(`@operato/ops-contract`). ๊ฐ™์€ ์‚ฌ์‹ค์— ์ด๋ฆ„์ด\n * ๋‘˜์ด๋ฉด ์˜ฎ๊ธธ ๋•Œ๋งˆ๋‹ค ๋ฒˆ์—ญ์ด ์ƒ๊ธฐ๊ณ , ๋ฒˆ์—ญ์ด ์žˆ์œผ๋ฉด ํ‹€๋ฆด ์ž๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค.\n */\n@Entity({ name: 'ops_personnel_class' })\n@Index('ix_ops_personnel_class_0', (klass: PersonnelClass) => [klass.domain, klass.name], { unique: true })\n@ObjectType({ description: 'ISA-95 PersonnelClass โ€” a qualification that operations require' })\nexport class PersonnelClass {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((klass: PersonnelClass) => klass.domain)\n domainId?: string\n\n /** ํ‘œ์ค€ `PersonnelClassID` โ€” ํŠธ์œˆ์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ `ResourceClassDef.id` ๊ฐ€ ๋œ๋‹ค. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * ์ƒ์œ„ ๋“ฑ๊ธ‰๋“ค โ€” ํ‘œ์ค€ `PersonnelClassBaseID`(๋ณต์ˆ˜).\n *\n * ใ€Œ6์ถ• ์šฉ์ ‘ ์ž๊ฒฉใ€์ด ใ€Œ์šฉ์ ‘ ์ž๊ฒฉใ€์„ ์ƒ์†ํ•œ๋‹ค. ๋ฐฐ์ • ํŒ๋‹จ์ด ์ด ์ƒ์†์„ ํƒ€๋ฏ€๋กœ, ์ƒ์œ„ ๋“ฑ๊ธ‰์œผ๋กœ ์š”๊ตฌํ•ด๋„\n * ํ•˜์œ„ ์ž๊ฒฉ์ž๊ฐ€ ์žกํžŒ๋‹ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n baseIds?: string[]\n\n /** ์ด ๋“ฑ๊ธ‰์˜ ์ ๊ฒฉ์„ ์ •ํ•˜๋Š” `TestSpecification` ์ฐธ์กฐ๋“ค โ€” ํ‘œ์ค€ `TestSpecificationID`. ์ฐธ์กฐ๋งŒ ๊ฐ–๋Š”๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /** ๋“ฑ๊ธ‰ ์†์„ฑ โ€” ํ‘œ์ค€ `PersonnelClassProperty`. ๊ฐœ์ฒด ์†์„ฑ์ด `classPropertyId` ๋กœ ์ด๊ฒƒ์„ ๊ตฌ์ฒดํ™”ํ•œ๋‹ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'ResourceProperty[]' })\n properties?: Record<string, unknown>[]\n\n /**\n * ์–ธ์ œ๋ถ€ํ„ฐ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveStartDate`.\n *\n * ์ž๊ฒฉ ๊ทœ์ •์€ ๋ฏธ๋ž˜ ์‹œ์ ์œผ๋กœ ์„ ์–ธ๋œ๋‹ค(ใ€Œ9์›”๋ถ€ํ„ฐ ์ด ์ž๊ฒฉ์ด ํ•„์š”ํ•˜๋‹คใ€). ์ด ์ž๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด ๊ทธ ์„ ์–ธ์„\n * ๋ฐ›์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜, ๋ฐ›๊ณ  ๋‚˜์„œ ์˜ค๋Š˜ ๋ฐฐ์ •์— ๋ฐ”๋กœ ์ ์šฉ๋œ๋‹ค.\n */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** ์–ธ์ œ๊นŒ์ง€ ์œ ํšจํ•œ๊ฐ€ โ€” ํ‘œ์ค€ `EffectiveEndDate`. ์—†์œผ๋ฉด ๋์ด ์ •ํ•ด์ง€์ง€ ์•Š์•˜๋‹ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((klass: PersonnelClass) => klass.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((klass: PersonnelClass) => klass.updater)\n updaterId?: string\n}\n"]}