@things-factory/ops-master 10.1.248 → 10.1.250

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 (429) hide show
  1. package/dist-client/bootstrap.d.ts +19 -0
  2. package/dist-client/bootstrap.js +66 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/index.d.ts +17 -0
  5. package/dist-client/index.js +21 -0
  6. package/dist-client/index.js.map +1 -0
  7. package/dist-client/master-change-approval.d.ts +14 -0
  8. package/dist-client/master-change-approval.js +36 -0
  9. package/dist-client/master-change-approval.js.map +1 -0
  10. package/dist-client/master-change-policy-axes.d.ts +37 -0
  11. package/dist-client/master-change-policy-axes.js +29 -0
  12. package/dist-client/master-change-policy-axes.js.map +1 -0
  13. package/dist-client/master-change-policy-panel.d.ts +59 -0
  14. package/dist-client/master-change-policy-panel.js +454 -0
  15. package/dist-client/master-change-policy-panel.js.map +1 -0
  16. package/dist-client/master-change-providers.d.ts +4 -0
  17. package/dist-client/master-change-providers.js +91 -0
  18. package/dist-client/master-change-providers.js.map +1 -0
  19. package/dist-client/pages/master/applied-when-dialog.d.ts +48 -0
  20. package/dist-client/pages/master/applied-when-dialog.js +137 -0
  21. package/dist-client/pages/master/applied-when-dialog.js.map +1 -0
  22. package/dist-client/pages/master/assignment-fields.d.ts +27 -0
  23. package/dist-client/pages/master/assignment-fields.js +62 -0
  24. package/dist-client/pages/master/assignment-fields.js.map +1 -0
  25. package/dist-client/pages/master/equipment-class.d.ts +12 -0
  26. package/dist-client/pages/master/equipment-class.js +42 -0
  27. package/dist-client/pages/master/equipment-class.js.map +1 -0
  28. package/dist-client/pages/master/equipment.d.ts +12 -0
  29. package/dist-client/pages/master/equipment.js +58 -0
  30. package/dist-client/pages/master/equipment.js.map +1 -0
  31. package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
  32. package/dist-client/pages/master/grist-iso-duration.js +70 -0
  33. package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
  34. package/dist-client/pages/master/grist-reference.d.ts +91 -0
  35. package/dist-client/pages/master/grist-reference.js +419 -0
  36. package/dist-client/pages/master/grist-reference.js.map +1 -0
  37. package/dist-client/pages/master/import-rows.d.ts +35 -0
  38. package/dist-client/pages/master/import-rows.js +66 -0
  39. package/dist-client/pages/master/import-rows.js.map +1 -0
  40. package/dist-client/pages/master/iso-duration.d.ts +34 -0
  41. package/dist-client/pages/master/iso-duration.js +76 -0
  42. package/dist-client/pages/master/iso-duration.js.map +1 -0
  43. package/dist-client/pages/master/master-options.d.ts +40 -0
  44. package/dist-client/pages/master/master-options.js +54 -0
  45. package/dist-client/pages/master/master-options.js.map +1 -0
  46. package/dist-client/pages/master/master-page-base.d.ts +369 -0
  47. package/dist-client/pages/master/master-page-base.js +657 -0
  48. package/dist-client/pages/master/master-page-base.js.map +1 -0
  49. package/dist-client/pages/master/material-class.d.ts +12 -0
  50. package/dist-client/pages/master/material-class.js +42 -0
  51. package/dist-client/pages/master/material-class.js.map +1 -0
  52. package/dist-client/pages/master/material-definition.d.ts +5 -0
  53. package/dist-client/pages/master/material-definition.js +14 -0
  54. package/dist-client/pages/master/material-definition.js.map +1 -0
  55. package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
  56. package/dist-client/pages/master/material-revision-fields.js +43 -0
  57. package/dist-client/pages/master/material-revision-fields.js.map +1 -0
  58. package/dist-client/pages/master/operation-definition.d.ts +12 -0
  59. package/dist-client/pages/master/operation-definition.js +49 -0
  60. package/dist-client/pages/master/operation-definition.js.map +1 -0
  61. package/dist-client/pages/master/operational-location.d.ts +84 -0
  62. package/dist-client/pages/master/operational-location.js +432 -0
  63. package/dist-client/pages/master/operational-location.js.map +1 -0
  64. package/dist-client/pages/master/person.d.ts +12 -0
  65. package/dist-client/pages/master/person.js +41 -0
  66. package/dist-client/pages/master/person.js.map +1 -0
  67. package/dist-client/pages/master/personnel-class.d.ts +12 -0
  68. package/dist-client/pages/master/personnel-class.js +43 -0
  69. package/dist-client/pages/master/personnel-class.js.map +1 -0
  70. package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
  71. package/dist-client/pages/master/physical-asset-class.js +40 -0
  72. package/dist-client/pages/master/physical-asset-class.js.map +1 -0
  73. package/dist-client/pages/master/physical-asset.d.ts +12 -0
  74. package/dist-client/pages/master/physical-asset.js +41 -0
  75. package/dist-client/pages/master/physical-asset.js.map +1 -0
  76. package/dist-client/pages/master/recipe-definition.d.ts +5 -0
  77. package/dist-client/pages/master/recipe-definition.js +14 -0
  78. package/dist-client/pages/master/recipe-definition.js.map +1 -0
  79. package/dist-client/pages/master/reference-targets.d.ts +42 -0
  80. package/dist-client/pages/master/reference-targets.js +82 -0
  81. package/dist-client/pages/master/reference-targets.js.map +1 -0
  82. package/dist-client/pages/master/revision-comparison.d.ts +49 -0
  83. package/dist-client/pages/master/revision-comparison.js +560 -0
  84. package/dist-client/pages/master/revision-comparison.js.map +1 -0
  85. package/dist-client/pages/master/revision-view.d.ts +34 -0
  86. package/dist-client/pages/master/revision-view.js +145 -0
  87. package/dist-client/pages/master/revision-view.js.map +1 -0
  88. package/dist-client/pages/master/revision-workspace.d.ts +50 -0
  89. package/dist-client/pages/master/revision-workspace.js +763 -0
  90. package/dist-client/pages/master/revision-workspace.js.map +1 -0
  91. package/dist-client/pages/master/route-definition.d.ts +19 -0
  92. package/dist-client/pages/master/route-definition.js +40 -0
  93. package/dist-client/pages/master/route-definition.js.map +1 -0
  94. package/dist-client/pages/master/stop-reason.d.ts +12 -0
  95. package/dist-client/pages/master/stop-reason.js +48 -0
  96. package/dist-client/pages/master/stop-reason.js.map +1 -0
  97. package/dist-client/pages/master/test-specification.d.ts +5 -0
  98. package/dist-client/pages/master/test-specification.js +14 -0
  99. package/dist-client/pages/master/test-specification.js.map +1 -0
  100. package/dist-client/pages/master-axes.d.ts +24 -0
  101. package/dist-client/pages/master-axes.js +39 -0
  102. package/dist-client/pages/master-axes.js.map +1 -0
  103. package/dist-client/route.d.ts +1 -0
  104. package/dist-client/route.js +81 -0
  105. package/dist-client/route.js.map +1 -0
  106. package/dist-client/tsconfig.tsbuildinfo +1 -0
  107. package/dist-server/index.d.ts +1 -0
  108. package/dist-server/index.js +19 -0
  109. package/dist-server/index.js.map +1 -0
  110. package/dist-server/service/ai-entry/master-entry-rules.d.ts +175 -0
  111. package/dist-server/service/ai-entry/master-entry-rules.js +302 -0
  112. package/dist-server/service/ai-entry/master-entry-rules.js.map +1 -0
  113. package/dist-server/service/ai-entry/master-entry-targets.d.ts +23 -0
  114. package/dist-server/service/ai-entry/master-entry-targets.js +293 -0
  115. package/dist-server/service/ai-entry/master-entry-targets.js.map +1 -0
  116. package/dist-server/service/approval-route.d.ts +37 -0
  117. package/dist-server/service/approval-route.js +34 -0
  118. package/dist-server/service/approval-route.js.map +1 -0
  119. package/dist-server/service/asset/asset-lifecycle.d.ts +106 -0
  120. package/dist-server/service/asset/asset-lifecycle.js +126 -0
  121. package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
  122. package/dist-server/service/asset/asset-master-resolver.d.ts +53 -0
  123. package/dist-server/service/asset/asset-master-resolver.js +185 -0
  124. package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
  125. package/dist-server/service/asset/asset-master.d.ts +21 -0
  126. package/dist-server/service/asset/asset-master.js +25 -0
  127. package/dist-server/service/asset/asset-master.js.map +1 -0
  128. package/dist-server/service/asset/asset-query.d.ts +16 -0
  129. package/dist-server/service/asset/asset-query.js +72 -0
  130. package/dist-server/service/asset/asset-query.js.map +1 -0
  131. package/dist-server/service/asset/index.d.ts +6 -0
  132. package/dist-server/service/asset/index.js +10 -0
  133. package/dist-server/service/asset/index.js.map +1 -0
  134. package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
  135. package/dist-server/service/asset/physical-asset-class.js +104 -0
  136. package/dist-server/service/asset/physical-asset-class.js.map +1 -0
  137. package/dist-server/service/asset/physical-asset.d.ts +66 -0
  138. package/dist-server/service/asset/physical-asset.js +123 -0
  139. package/dist-server/service/asset/physical-asset.js.map +1 -0
  140. package/dist-server/service/assignment/applied-when.d.ts +24 -0
  141. package/dist-server/service/assignment/applied-when.js +16 -0
  142. package/dist-server/service/assignment/applied-when.js.map +1 -0
  143. package/dist-server/service/assignment/assignment-history.d.ts +92 -0
  144. package/dist-server/service/assignment/assignment-history.js +289 -0
  145. package/dist-server/service/assignment/assignment-history.js.map +1 -0
  146. package/dist-server/service/assignment/assignment-write.d.ts +42 -0
  147. package/dist-server/service/assignment/assignment-write.js +101 -0
  148. package/dist-server/service/assignment/assignment-write.js.map +1 -0
  149. package/dist-server/service/assignment/master-value-claim.d.ts +135 -0
  150. package/dist-server/service/assignment/master-value-claim.js +174 -0
  151. package/dist-server/service/assignment/master-value-claim.js.map +1 -0
  152. package/dist-server/service/equipment/equipment-class.d.ts +34 -0
  153. package/dist-server/service/equipment/equipment-class.js +104 -0
  154. package/dist-server/service/equipment/equipment-class.js.map +1 -0
  155. package/dist-server/service/equipment/equipment-master-resolver.d.ts +77 -0
  156. package/dist-server/service/equipment/equipment-master-resolver.js +266 -0
  157. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
  158. package/dist-server/service/equipment/equipment-master.d.ts +30 -0
  159. package/dist-server/service/equipment/equipment-master.js +53 -0
  160. package/dist-server/service/equipment/equipment-master.js.map +1 -0
  161. package/dist-server/service/equipment/equipment-query.d.ts +16 -0
  162. package/dist-server/service/equipment/equipment-query.js +72 -0
  163. package/dist-server/service/equipment/equipment-query.js.map +1 -0
  164. package/dist-server/service/equipment/equipment.d.ts +71 -0
  165. package/dist-server/service/equipment/equipment.js +138 -0
  166. package/dist-server/service/equipment/equipment.js.map +1 -0
  167. package/dist-server/service/equipment/index.d.ts +8 -0
  168. package/dist-server/service/equipment/index.js +12 -0
  169. package/dist-server/service/equipment/index.js.map +1 -0
  170. package/dist-server/service/equipment/state-period-rules.d.ts +95 -0
  171. package/dist-server/service/equipment/state-period-rules.js +122 -0
  172. package/dist-server/service/equipment/state-period-rules.js.map +1 -0
  173. package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
  174. package/dist-server/service/equipment/stop-reason-query.js +39 -0
  175. package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
  176. package/dist-server/service/equipment/stop-reason.d.ts +58 -0
  177. package/dist-server/service/equipment/stop-reason.js +114 -0
  178. package/dist-server/service/equipment/stop-reason.js.map +1 -0
  179. package/dist-server/service/index.d.ts +82 -0
  180. package/dist-server/service/index.js +145 -0
  181. package/dist-server/service/index.js.map +1 -0
  182. package/dist-server/service/location/index.d.ts +5 -0
  183. package/dist-server/service/location/index.js +9 -0
  184. package/dist-server/service/location/index.js.map +1 -0
  185. package/dist-server/service/location/location-master-resolver.d.ts +60 -0
  186. package/dist-server/service/location/location-master-resolver.js +313 -0
  187. package/dist-server/service/location/location-master-resolver.js.map +1 -0
  188. package/dist-server/service/location/location-master.d.ts +26 -0
  189. package/dist-server/service/location/location-master.js +28 -0
  190. package/dist-server/service/location/location-master.js.map +1 -0
  191. package/dist-server/service/location/location-query.d.ts +15 -0
  192. package/dist-server/service/location/location-query.js +56 -0
  193. package/dist-server/service/location/location-query.js.map +1 -0
  194. package/dist-server/service/location/operational-location.d.ts +116 -0
  195. package/dist-server/service/location/operational-location.js +157 -0
  196. package/dist-server/service/location/operational-location.js.map +1 -0
  197. package/dist-server/service/master-axis.d.ts +40 -0
  198. package/dist-server/service/master-axis.js +57 -0
  199. package/dist-server/service/master-axis.js.map +1 -0
  200. package/dist-server/service/master-change-approval/approval-input.d.ts +17 -0
  201. package/dist-server/service/master-change-approval/approval-input.js +35 -0
  202. package/dist-server/service/master-change-approval/approval-input.js.map +1 -0
  203. package/dist-server/service/master-change-approval/builtin-axes.d.ts +4 -0
  204. package/dist-server/service/master-change-approval/builtin-axes.js +96 -0
  205. package/dist-server/service/master-change-approval/builtin-axes.js.map +1 -0
  206. package/dist-server/service/master-change-approval/index.d.ts +14 -0
  207. package/dist-server/service/master-change-approval/index.js +37 -0
  208. package/dist-server/service/master-change-approval/index.js.map +1 -0
  209. package/dist-server/service/master-change-approval/master-change-axis.d.ts +54 -0
  210. package/dist-server/service/master-change-approval/master-change-axis.js +17 -0
  211. package/dist-server/service/master-change-approval/master-change-axis.js.map +1 -0
  212. package/dist-server/service/master-change-approval/master-change-flow.d.ts +65 -0
  213. package/dist-server/service/master-change-approval/master-change-flow.js +125 -0
  214. package/dist-server/service/master-change-approval/master-change-flow.js.map +1 -0
  215. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +18 -0
  216. package/dist-server/service/master-change-approval/master-change-resolver.js +58 -0
  217. package/dist-server/service/master-change-approval/master-change-resolver.js.map +1 -0
  218. package/dist-server/service/master-change-policy.d.ts +122 -0
  219. package/dist-server/service/master-change-policy.js +304 -0
  220. package/dist-server/service/master-change-policy.js.map +1 -0
  221. package/dist-server/service/master-conformance-resolver.d.ts +34 -0
  222. package/dist-server/service/master-conformance-resolver.js +153 -0
  223. package/dist-server/service/master-conformance-resolver.js.map +1 -0
  224. package/dist-server/service/master-conformance.d.ts +80 -0
  225. package/dist-server/service/master-conformance.js +266 -0
  226. package/dist-server/service/master-conformance.js.map +1 -0
  227. package/dist-server/service/master-crud.d.ts +55 -0
  228. package/dist-server/service/master-crud.js +93 -0
  229. package/dist-server/service/master-crud.js.map +1 -0
  230. package/dist-server/service/master-list.d.ts +12 -0
  231. package/dist-server/service/master-list.js +30 -0
  232. package/dist-server/service/master-list.js.map +1 -0
  233. package/dist-server/service/master-page-query.d.ts +33 -0
  234. package/dist-server/service/master-page-query.js +55 -0
  235. package/dist-server/service/master-page-query.js.map +1 -0
  236. package/dist-server/service/master-page.d.ts +85 -0
  237. package/dist-server/service/master-page.js +104 -0
  238. package/dist-server/service/master-page.js.map +1 -0
  239. package/dist-server/service/material/index.d.ts +7 -0
  240. package/dist-server/service/material/index.js +12 -0
  241. package/dist-server/service/material/index.js.map +1 -0
  242. package/dist-server/service/material/material-axis-status.d.ts +8 -0
  243. package/dist-server/service/material/material-axis-status.js +19 -0
  244. package/dist-server/service/material/material-axis-status.js.map +1 -0
  245. package/dist-server/service/material/material-class.d.ts +34 -0
  246. package/dist-server/service/material/material-class.js +104 -0
  247. package/dist-server/service/material/material-class.js.map +1 -0
  248. package/dist-server/service/material/material-definition.d.ts +45 -0
  249. package/dist-server/service/material/material-definition.js +125 -0
  250. package/dist-server/service/material/material-definition.js.map +1 -0
  251. package/dist-server/service/material/material-effective-list.d.ts +39 -0
  252. package/dist-server/service/material/material-effective-list.js +54 -0
  253. package/dist-server/service/material/material-effective-list.js.map +1 -0
  254. package/dist-server/service/material/material-master-resolver.d.ts +106 -0
  255. package/dist-server/service/material/material-master-resolver.js +351 -0
  256. package/dist-server/service/material/material-master-resolver.js.map +1 -0
  257. package/dist-server/service/material/material-master.d.ts +9 -0
  258. package/dist-server/service/material/material-master.js +24 -0
  259. package/dist-server/service/material/material-master.js.map +1 -0
  260. package/dist-server/service/material/material-query.d.ts +16 -0
  261. package/dist-server/service/material/material-query.js +79 -0
  262. package/dist-server/service/material/material-query.js.map +1 -0
  263. package/dist-server/service/material/material-revision-content.d.ts +10 -0
  264. package/dist-server/service/material/material-revision-content.js +92 -0
  265. package/dist-server/service/material/material-revision-content.js.map +1 -0
  266. package/dist-server/service/material/material-revision-resolver.d.ts +60 -0
  267. package/dist-server/service/material/material-revision-resolver.js +96 -0
  268. package/dist-server/service/material/material-revision-resolver.js.map +1 -0
  269. package/dist-server/service/material/material-revision-service.d.ts +179 -0
  270. package/dist-server/service/material/material-revision-service.js +687 -0
  271. package/dist-server/service/material/material-revision-service.js.map +1 -0
  272. package/dist-server/service/material/material-revision.d.ts +86 -0
  273. package/dist-server/service/material/material-revision.js +339 -0
  274. package/dist-server/service/material/material-revision.js.map +1 -0
  275. package/dist-server/service/material/recipe-index.d.ts +23 -0
  276. package/dist-server/service/material/recipe-index.js +44 -0
  277. package/dist-server/service/material/recipe-index.js.map +1 -0
  278. package/dist-server/service/operation/index.d.ts +6 -0
  279. package/dist-server/service/operation/index.js +10 -0
  280. package/dist-server/service/operation/index.js.map +1 -0
  281. package/dist-server/service/operation/operation-definition.d.ts +52 -0
  282. package/dist-server/service/operation/operation-definition.js +143 -0
  283. package/dist-server/service/operation/operation-definition.js.map +1 -0
  284. package/dist-server/service/operation/operation-master-resolver.d.ts +52 -0
  285. package/dist-server/service/operation/operation-master-resolver.js +187 -0
  286. package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
  287. package/dist-server/service/operation/operation-master.d.ts +21 -0
  288. package/dist-server/service/operation/operation-master.js +28 -0
  289. package/dist-server/service/operation/operation-master.js.map +1 -0
  290. package/dist-server/service/operation/operation-query.d.ts +15 -0
  291. package/dist-server/service/operation/operation-query.js +56 -0
  292. package/dist-server/service/operation/operation-query.js.map +1 -0
  293. package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
  294. package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
  295. package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
  296. package/dist-server/service/operation/operation-readiness.d.ts +34 -0
  297. package/dist-server/service/operation/operation-readiness.js +133 -0
  298. package/dist-server/service/operation/operation-readiness.js.map +1 -0
  299. package/dist-server/service/personnel/index.d.ts +6 -0
  300. package/dist-server/service/personnel/index.js +10 -0
  301. package/dist-server/service/personnel/index.js.map +1 -0
  302. package/dist-server/service/personnel/person.d.ts +51 -0
  303. package/dist-server/service/personnel/person.js +119 -0
  304. package/dist-server/service/personnel/person.js.map +1 -0
  305. package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
  306. package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
  307. package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
  308. package/dist-server/service/personnel/personnel-class.d.ts +54 -0
  309. package/dist-server/service/personnel/personnel-class.js +114 -0
  310. package/dist-server/service/personnel/personnel-class.js.map +1 -0
  311. package/dist-server/service/personnel/personnel-master-resolver.d.ts +53 -0
  312. package/dist-server/service/personnel/personnel-master-resolver.js +187 -0
  313. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
  314. package/dist-server/service/personnel/personnel-master.d.ts +39 -0
  315. package/dist-server/service/personnel/personnel-master.js +34 -0
  316. package/dist-server/service/personnel/personnel-master.js.map +1 -0
  317. package/dist-server/service/personnel/personnel-query.d.ts +29 -0
  318. package/dist-server/service/personnel/personnel-query.js +79 -0
  319. package/dist-server/service/personnel/personnel-query.js.map +1 -0
  320. package/dist-server/service/personnel/qualification.d.ts +104 -0
  321. package/dist-server/service/personnel/qualification.js +147 -0
  322. package/dist-server/service/personnel/qualification.js.map +1 -0
  323. package/dist-server/service/quality/index.d.ts +4 -0
  324. package/dist-server/service/quality/index.js +8 -0
  325. package/dist-server/service/quality/index.js.map +1 -0
  326. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +12 -0
  327. package/dist-server/service/quality/nonconformance-cause-resolver.js +60 -0
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +1 -0
  329. package/dist-server/service/quality/nonconformance-cause.d.ts +20 -0
  330. package/dist-server/service/quality/nonconformance-cause.js +90 -0
  331. package/dist-server/service/quality/nonconformance-cause.js.map +1 -0
  332. package/dist-server/service/recipe/index.d.ts +10 -0
  333. package/dist-server/service/recipe/index.js +16 -0
  334. package/dist-server/service/recipe/index.js.map +1 -0
  335. package/dist-server/service/recipe/recipe-definition.d.ts +75 -0
  336. package/dist-server/service/recipe/recipe-definition.js +143 -0
  337. package/dist-server/service/recipe/recipe-definition.js.map +1 -0
  338. package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
  339. package/dist-server/service/recipe/recipe-effective-list.js +96 -0
  340. package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
  341. package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
  342. package/dist-server/service/recipe/recipe-master-resolver.js +128 -0
  343. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
  344. package/dist-server/service/recipe/recipe-master.d.ts +37 -0
  345. package/dist-server/service/recipe/recipe-master.js +47 -0
  346. package/dist-server/service/recipe/recipe-master.js.map +1 -0
  347. package/dist-server/service/recipe/recipe-query.d.ts +21 -0
  348. package/dist-server/service/recipe/recipe-query.js +82 -0
  349. package/dist-server/service/recipe/recipe-query.js.map +1 -0
  350. package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
  351. package/dist-server/service/recipe/recipe-revision-content.js +70 -0
  352. package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
  353. package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
  354. package/dist-server/service/recipe/recipe-revision-line.js +95 -0
  355. package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
  356. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +65 -0
  357. package/dist-server/service/recipe/recipe-revision-resolver.js +96 -0
  358. package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
  359. package/dist-server/service/recipe/recipe-revision-service.d.ts +183 -0
  360. package/dist-server/service/recipe/recipe-revision-service.js +754 -0
  361. package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
  362. package/dist-server/service/recipe/recipe-revision.d.ts +102 -0
  363. package/dist-server/service/recipe/recipe-revision.js +373 -0
  364. package/dist-server/service/recipe/recipe-revision.js.map +1 -0
  365. package/dist-server/service/recipe/route-definition.d.ts +51 -0
  366. package/dist-server/service/recipe/route-definition.js +114 -0
  367. package/dist-server/service/recipe/route-definition.js.map +1 -0
  368. package/dist-server/service/resource/class-lineage.d.ts +46 -0
  369. package/dist-server/service/resource/class-lineage.js +80 -0
  370. package/dist-server/service/resource/class-lineage.js.map +1 -0
  371. package/dist-server/service/resource/class-members.d.ts +36 -0
  372. package/dist-server/service/resource/class-members.js +59 -0
  373. package/dist-server/service/resource/class-members.js.map +1 -0
  374. package/dist-server/service/resource/referrers.d.ts +54 -0
  375. package/dist-server/service/resource/referrers.js +99 -0
  376. package/dist-server/service/resource/referrers.js.map +1 -0
  377. package/dist-server/service/resource/resource-class.d.ts +25 -0
  378. package/dist-server/service/resource/resource-class.js +29 -0
  379. package/dist-server/service/resource/resource-class.js.map +1 -0
  380. package/dist-server/service/revision-baseline.d.ts +71 -0
  381. package/dist-server/service/revision-baseline.js +87 -0
  382. package/dist-server/service/revision-baseline.js.map +1 -0
  383. package/dist-server/service/row-lock.d.ts +22 -0
  384. package/dist-server/service/row-lock.js +31 -0
  385. package/dist-server/service/row-lock.js.map +1 -0
  386. package/dist-server/service/status/axis-stamp.d.ts +16 -0
  387. package/dist-server/service/status/axis-stamp.js +22 -0
  388. package/dist-server/service/status/axis-stamp.js.map +1 -0
  389. package/dist-server/service/status/index.d.ts +3 -0
  390. package/dist-server/service/status/index.js +7 -0
  391. package/dist-server/service/status/index.js.map +1 -0
  392. package/dist-server/service/status/master-status.d.ts +38 -0
  393. package/dist-server/service/status/master-status.js +129 -0
  394. package/dist-server/service/status/master-status.js.map +1 -0
  395. package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
  396. package/dist-server/service/test-spec/criteria-check.js +142 -0
  397. package/dist-server/service/test-spec/criteria-check.js.map +1 -0
  398. package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
  399. package/dist-server/service/test-spec/criteria-rows.js +139 -0
  400. package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
  401. package/dist-server/service/test-spec/index.d.ts +6 -0
  402. package/dist-server/service/test-spec/index.js +11 -0
  403. package/dist-server/service/test-spec/index.js.map +1 -0
  404. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +34 -0
  405. package/dist-server/service/test-spec/test-spec-effective-list.js +42 -0
  406. package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -0
  407. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +44 -0
  408. package/dist-server/service/test-spec/test-spec-master-resolver.js +144 -0
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
  410. package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
  411. package/dist-server/service/test-spec/test-spec-master.js +18 -0
  412. package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
  413. package/dist-server/service/test-spec/test-spec-query.d.ts +15 -0
  414. package/dist-server/service/test-spec/test-spec-query.js +61 -0
  415. package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
  416. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +59 -0
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.js +96 -0
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +1 -0
  419. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +178 -0
  420. package/dist-server/service/test-spec/test-spec-revision-service.js +685 -0
  421. package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -0
  422. package/dist-server/service/test-spec/test-spec-revision.d.ts +86 -0
  423. package/dist-server/service/test-spec/test-spec-revision.js +334 -0
  424. package/dist-server/service/test-spec/test-spec-revision.js.map +1 -0
  425. package/dist-server/service/test-spec/test-specification.d.ts +47 -0
  426. package/dist-server/service/test-spec/test-specification.js +119 -0
  427. package/dist-server/service/test-spec/test-specification.js.map +1 -0
  428. package/dist-server/tsconfig.tsbuildinfo +1 -0
  429. package/package.json +4 -4
@@ -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"]}
@@ -0,0 +1,6 @@
1
+ import { OperationDefinition } from './operation-definition';
2
+ import { OperationQuery } from './operation-query';
3
+ import { OperationDefinitionResolver } from './operation-master-resolver';
4
+ import { OperationReadinessResolver } from './operation-readiness-resolver';
5
+ export declare const entities: (typeof OperationDefinition)[];
6
+ export declare const resolvers: (typeof OperationDefinitionResolver | typeof OperationQuery | typeof OperationReadinessResolver)[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const operation_definition_1 = require("./operation-definition");
5
+ const operation_query_1 = require("./operation-query");
6
+ const operation_master_resolver_1 = require("./operation-master-resolver");
7
+ const operation_readiness_resolver_1 = require("./operation-readiness-resolver");
8
+ exports.entities = [operation_definition_1.OperationDefinition];
9
+ exports.resolvers = [operation_query_1.OperationQuery, operation_master_resolver_1.OperationDefinitionResolver, operation_readiness_resolver_1.OperationReadinessResolver];
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/operation/index.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAC5D,uDAAkD;AAClD,2EAAyE;AACzE,iFAA2E;AAE9D,QAAA,QAAQ,GAAG,CAAC,0CAAmB,CAAC,CAAA;AAChC,QAAA,SAAS,GAAG,CAAC,gCAAc,EAAE,uDAA2B,EAAE,yDAA0B,CAAC,CAAA","sourcesContent":["import { OperationDefinition } from './operation-definition'\nimport { OperationQuery } from './operation-query'\nimport { OperationDefinitionResolver } from './operation-master-resolver'\nimport { OperationReadinessResolver } from './operation-readiness-resolver'\n\nexport const entities = [OperationDefinition]\nexport const resolvers = [OperationQuery, OperationDefinitionResolver, OperationReadinessResolver]\n"]}
@@ -0,0 +1,52 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 공정 정의 — **ISA-95 `OperationsSegment`**(`OperationsDefinition` 소속).
5
+ *
6
+ * 이 자리가 답하는 것은 「이 공정이 얼마나 걸리고 무엇을 필요로 하는가」다. 예측이 쓰는 소요시간의
7
+ * 근거이고, 정상상태 상한과 병목을 공정별로 낼 수 있게 하는 값이다.
8
+ *
9
+ * ── 필요 자원을 적지 않으면 사람이 없는 공장이 된다 ─────────────────────────
10
+ * 인원 명세가 없으면 사람은 예측에 존재하지 않는다. 설비만 있으면 언제나 가동되는 공장이 되고, 현장에서
11
+ * 가장 자주 모자라는 자원이 만드는 줄이 통째로 사라진다. 등급으로 요구한다 — 「용접 자격자 2명」.
12
+ */
13
+ export declare class OperationDefinition {
14
+ readonly id: string;
15
+ domain?: Domain;
16
+ domainId?: string;
17
+ /** 공정 키 — 라우팅의 단계가 이 값을 가리킨다. */
18
+ name: string;
19
+ description?: string;
20
+ /** 무엇을 하는 공정인가 — `transport` · `process` · `dwell`. */
21
+ intent: string;
22
+ /** 이 공정이 벌어지는 자리 타입. 없으면 커널이 어디서 일하는지 정할 수 없다. */
23
+ locationType?: string;
24
+ /** 필요한 설비 종류. `dwell` 은 자원을 잡지 않는다. */
25
+ resourceType?: string;
26
+ /** 방출할 CBV bizStep URN. */
27
+ bizStep?: string;
28
+ /** 소요시간 — 표준 `Duration`. ISO 8601 기간 표기다. 없으면 커널이 기본값을 쓴다. */
29
+ duration?: string;
30
+ /** 소요시간 변동 — 표준 밖 확장. 없으면 상수다. */
31
+ variability?: Record<string, unknown>;
32
+ /** 공정 모수 — 표준 `ParameterSpecification`. 수율 · 셋업 시간 · 온도가 여기 온다. */
33
+ parameters?: Record<string, unknown>[];
34
+ /** 필요 인원 — 표준 `PersonnelSpecification`(등급 + 수량). */
35
+ personnelSpecification?: Record<string, unknown>[];
36
+ /** 필요 물리 자산 — 표준 `PhysicalAssetSpecification`. 빈 팔레트가 없어 출고가 못 나가는 일은 잦다. */
37
+ physicalAssetSpecification?: Record<string, unknown>[];
38
+ /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
39
+ effectiveStart?: Date;
40
+ /**
41
+ * 언제까지 유효한가 — 표준 `EffectiveEndDate`.
42
+ *
43
+ * **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
44
+ */
45
+ effectiveEnd?: Date;
46
+ createdAt?: Date;
47
+ updatedAt?: Date;
48
+ creator?: User;
49
+ creatorId?: string;
50
+ updater?: User;
51
+ updaterId?: string;
52
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperationDefinition = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ /**
10
+ * 공정 정의 — **ISA-95 `OperationsSegment`**(`OperationsDefinition` 소속).
11
+ *
12
+ * 이 자리가 답하는 것은 「이 공정이 얼마나 걸리고 무엇을 필요로 하는가」다. 예측이 쓰는 소요시간의
13
+ * 근거이고, 정상상태 상한과 병목을 공정별로 낼 수 있게 하는 값이다.
14
+ *
15
+ * ── 필요 자원을 적지 않으면 사람이 없는 공장이 된다 ─────────────────────────
16
+ * 인원 명세가 없으면 사람은 예측에 존재하지 않는다. 설비만 있으면 언제나 가동되는 공장이 되고, 현장에서
17
+ * 가장 자주 모자라는 자원이 만드는 줄이 통째로 사라진다. 등급으로 요구한다 — 「용접 자격자 2명」.
18
+ */
19
+ let OperationDefinition = class OperationDefinition {
20
+ };
21
+ exports.OperationDefinition = OperationDefinition;
22
+ tslib_1.__decorate([
23
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
24
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
25
+ tslib_1.__metadata("design:type", String)
26
+ ], OperationDefinition.prototype, "id", void 0);
27
+ tslib_1.__decorate([
28
+ (0, typeorm_1.ManyToOne)(type => shell_1.Domain),
29
+ (0, type_graphql_1.Field)(type => shell_1.Domain),
30
+ tslib_1.__metadata("design:type", shell_1.Domain)
31
+ ], OperationDefinition.prototype, "domain", void 0);
32
+ tslib_1.__decorate([
33
+ (0, typeorm_1.RelationId)((operation) => operation.domain),
34
+ tslib_1.__metadata("design:type", String)
35
+ ], OperationDefinition.prototype, "domainId", void 0);
36
+ tslib_1.__decorate([
37
+ (0, typeorm_1.Column)(),
38
+ (0, type_graphql_1.Field)(),
39
+ tslib_1.__metadata("design:type", String)
40
+ ], OperationDefinition.prototype, "name", void 0);
41
+ tslib_1.__decorate([
42
+ (0, typeorm_1.Column)({ nullable: true }),
43
+ (0, type_graphql_1.Field)({ nullable: true }),
44
+ tslib_1.__metadata("design:type", String)
45
+ ], OperationDefinition.prototype, "description", void 0);
46
+ tslib_1.__decorate([
47
+ (0, typeorm_1.Column)(),
48
+ (0, type_graphql_1.Field)(),
49
+ tslib_1.__metadata("design:type", String)
50
+ ], OperationDefinition.prototype, "intent", void 0);
51
+ tslib_1.__decorate([
52
+ (0, typeorm_1.Column)({ nullable: true }),
53
+ (0, type_graphql_1.Field)({ nullable: true }),
54
+ tslib_1.__metadata("design:type", String)
55
+ ], OperationDefinition.prototype, "locationType", void 0);
56
+ tslib_1.__decorate([
57
+ (0, typeorm_1.Column)({ nullable: true }),
58
+ (0, type_graphql_1.Field)({ nullable: true }),
59
+ tslib_1.__metadata("design:type", String)
60
+ ], OperationDefinition.prototype, "resourceType", void 0);
61
+ tslib_1.__decorate([
62
+ (0, typeorm_1.Column)({ nullable: true }),
63
+ (0, type_graphql_1.Field)({ nullable: true }),
64
+ tslib_1.__metadata("design:type", String)
65
+ ], OperationDefinition.prototype, "bizStep", void 0);
66
+ tslib_1.__decorate([
67
+ (0, typeorm_1.Column)({ nullable: true }),
68
+ (0, type_graphql_1.Field)({ nullable: true }),
69
+ tslib_1.__metadata("design:type", String)
70
+ ], OperationDefinition.prototype, "duration", void 0);
71
+ tslib_1.__decorate([
72
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
73
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'DurationVariability' }),
74
+ tslib_1.__metadata("design:type", Object)
75
+ ], OperationDefinition.prototype, "variability", void 0);
76
+ tslib_1.__decorate([
77
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
78
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'OperationParameter[]' }),
79
+ tslib_1.__metadata("design:type", Array)
80
+ ], OperationDefinition.prototype, "parameters", void 0);
81
+ tslib_1.__decorate([
82
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
83
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PersonnelSpecification[]' }),
84
+ tslib_1.__metadata("design:type", Array)
85
+ ], OperationDefinition.prototype, "personnelSpecification", void 0);
86
+ tslib_1.__decorate([
87
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
88
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PhysicalAssetSpecification[]' }),
89
+ tslib_1.__metadata("design:type", Array)
90
+ ], OperationDefinition.prototype, "physicalAssetSpecification", void 0);
91
+ tslib_1.__decorate([
92
+ (0, typeorm_1.Column)({ nullable: true }),
93
+ (0, type_graphql_1.Field)({ nullable: true }),
94
+ tslib_1.__metadata("design:type", Date
95
+ /**
96
+ * 언제까지 유효한가 — 표준 `EffectiveEndDate`.
97
+ *
98
+ * **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
99
+ */
100
+ )
101
+ ], OperationDefinition.prototype, "effectiveStart", void 0);
102
+ tslib_1.__decorate([
103
+ (0, typeorm_1.Column)({ nullable: true }),
104
+ (0, type_graphql_1.Field)({ nullable: true }),
105
+ tslib_1.__metadata("design:type", Date)
106
+ ], OperationDefinition.prototype, "effectiveEnd", void 0);
107
+ tslib_1.__decorate([
108
+ (0, typeorm_1.CreateDateColumn)(),
109
+ (0, type_graphql_1.Field)({ nullable: true }),
110
+ tslib_1.__metadata("design:type", Date)
111
+ ], OperationDefinition.prototype, "createdAt", void 0);
112
+ tslib_1.__decorate([
113
+ (0, typeorm_1.UpdateDateColumn)(),
114
+ (0, type_graphql_1.Field)({ nullable: true }),
115
+ tslib_1.__metadata("design:type", Date)
116
+ ], OperationDefinition.prototype, "updatedAt", void 0);
117
+ tslib_1.__decorate([
118
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
119
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
120
+ tslib_1.__metadata("design:type", auth_base_1.User)
121
+ ], OperationDefinition.prototype, "creator", void 0);
122
+ tslib_1.__decorate([
123
+ (0, typeorm_1.RelationId)((operation) => operation.creator),
124
+ tslib_1.__metadata("design:type", String)
125
+ ], OperationDefinition.prototype, "creatorId", void 0);
126
+ tslib_1.__decorate([
127
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
128
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
129
+ tslib_1.__metadata("design:type", auth_base_1.User)
130
+ ], OperationDefinition.prototype, "updater", void 0);
131
+ tslib_1.__decorate([
132
+ (0, typeorm_1.RelationId)((operation) => operation.updater),
133
+ tslib_1.__metadata("design:type", String)
134
+ ], OperationDefinition.prototype, "updaterId", void 0);
135
+ exports.OperationDefinition = OperationDefinition = tslib_1.__decorate([
136
+ (0, typeorm_1.Entity)({ name: 'ops_operation_definition' }),
137
+ (0, typeorm_1.Index)('ix_ops_operation_domain_identity', ['domain', 'id'], { unique: true }),
138
+ (0, typeorm_1.Index)('ix_ops_operation_definition_0', (operation) => [operation.domain, operation.name], {
139
+ unique: true
140
+ }),
141
+ (0, type_graphql_1.ObjectType)({ description: 'ISA-95 OperationsSegment — what an operation takes and requires' })
142
+ ], OperationDefinition);
143
+ //# sourceMappingURL=operation-definition.js.map
@@ -0,0 +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, 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_domain_identity', ['domain', 'id'], { unique: true })\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"]}
@@ -0,0 +1,52 @@
1
+ import { ListParam } from '@things-factory/shell';
2
+ import { MasterPatch } from '../master-crud';
3
+ import { OperationDefinition } from './operation-definition';
4
+ /**
5
+ * 공정 축을 채우고 고친다.
6
+ *
7
+ * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
8
+ * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
9
+ * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
10
+ * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
11
+ *
12
+ * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
13
+ */
14
+ export declare class OperationDefinitionList {
15
+ items: OperationDefinition[];
16
+ total: number;
17
+ }
18
+ export declare class OperationDefinitionResolver {
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>;
44
+ /**
45
+ * 그리드가 보낸 변경을 한 번에 적용한다.
46
+ *
47
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
48
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
49
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
50
+ */
51
+ updateMultipleOperationDefinition(patches: MasterPatch[], context: ResolverContext): Promise<OperationDefinition[]>;
52
+ }
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OperationDefinitionResolver = exports.OperationDefinitionList = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const type_graphql_1 = require("type-graphql");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const type_graphql_2 = require("type-graphql");
8
+ const shell_2 = require("@things-factory/shell");
9
+ const master_crud_1 = require("../master-crud");
10
+ const master_axis_1 = require("../master-axis");
11
+ const master_list_1 = require("../master-list");
12
+ const operation_definition_1 = require("./operation-definition");
13
+ const recipe_definition_1 = require("../recipe/recipe-definition");
14
+ const recipe_effective_list_1 = require("../recipe/recipe-effective-list");
15
+ const route_definition_1 = require("../recipe/route-definition");
16
+ const referrers_1 = require("../resource/referrers");
17
+ /**
18
+ * 공정 축을 채우고 고친다.
19
+ *
20
+ * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
21
+ * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
22
+ * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
23
+ * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
24
+ *
25
+ * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
26
+ */
27
+ let OperationDefinitionList = class OperationDefinitionList {
28
+ };
29
+ exports.OperationDefinitionList = OperationDefinitionList;
30
+ tslib_1.__decorate([
31
+ (0, type_graphql_2.Field)(type => [operation_definition_1.OperationDefinition]),
32
+ tslib_1.__metadata("design:type", Array)
33
+ ], OperationDefinitionList.prototype, "items", void 0);
34
+ tslib_1.__decorate([
35
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
36
+ tslib_1.__metadata("design:type", Number)
37
+ ], OperationDefinitionList.prototype, "total", void 0);
38
+ exports.OperationDefinitionList = OperationDefinitionList = tslib_1.__decorate([
39
+ (0, type_graphql_2.ObjectType)({ description: 'A page of operation definitions' })
40
+ ], OperationDefinitionList);
41
+ /**
42
+ * **이 공정을 누가 쓰나** — 들어오는 관계.
43
+ *
44
+ * ── 왜 필요한가 ────────────────────────────────────────────────────────────
45
+ * 공정 하나를 고치거나 없앨 때 무엇이 딸려 무너지는지 알 수 없었다. 라우팅과 제조법을 하나씩 열어
46
+ * 단계 목록을 눈으로 훑는 수밖에 없었다. 지금 miratek 은 라우팅 다섯에 제조법 다섯이라 그것이
47
+ * 되지만, 제품이 늘면 안 된다.
48
+ *
49
+ * ── 배열 칸이라 훑는다 ─────────────────────────────────────────────────────
50
+ * `RouteDefinition.steps` 와 `RecipeDefinition.inputs[].operation` 은 `simple-json` 이다.
51
+ * 데이터베이스가 그 안을 못 보므로 `IN` 으로 못 좁힌다. 표를 훑어 뒤집는 수밖에 없다.
52
+ *
53
+ * **그래서 상한이 있고, 상한에 걸리면 말한다**(`referrerScanCapped`). 조용히 자르면 「이 공정을
54
+ * 아무도 안 쓴다」와 「너무 많아 다 못 봤다」가 같아 보인다. 앞엣것은 지워도 되는 공정이고
55
+ * 뒤엣것은 지우면 라인이 선다. 품목의 제조법 훑기가 같은 자리에 같은 것을 둔다.
56
+ */
57
+ const OPERATION_SCAN_LIMIT = 2000;
58
+ async function scanOperationUse(domain) {
59
+ const routeRepo = (0, shell_2.getRepository)(route_definition_1.RouteDefinition);
60
+ const recipeRepo = (0, shell_2.getRepository)(recipe_definition_1.RecipeDefinition);
61
+ const [routeTotal, recipeTotal] = await Promise.all([
62
+ routeRepo.count({ where: { domain: { id: domain.id } } }),
63
+ recipeRepo.count({ where: { domain: { id: domain.id } } })
64
+ ]);
65
+ const [routeRows, recipeRows] = await Promise.all([
66
+ /*
67
+ * `id` 를 함께 뽑는다. 빼면 TypeORM 이 「no such column: distinctAlias.…_id」로 터진다 —
68
+ * `take` 를 쓰면 중복 제거를 위해 기본 키로 한 번 더 감싸는데, 그 키를 안 뽑으면 감쌀 것이 없다.
69
+ */
70
+ routeRepo.find({
71
+ where: { domain: { id: domain.id } },
72
+ select: ['id', 'name', 'steps'],
73
+ take: OPERATION_SCAN_LIMIT
74
+ }),
75
+ (0, recipe_effective_list_1.listEffectiveRecipes)(recipeRepo.manager, domain, { pagination: { page: 1, limit: OPERATION_SCAN_LIMIT } }).then(page => page.items)
76
+ ]);
77
+ const routes = (0, referrers_1.indexMultiReferrers)(routeRows, one => one.steps ?? [], one => one.name);
78
+ const recipes = (0, referrers_1.indexMultiReferrers)(recipeRows, one => (one.inputs ?? []).map((part) => part?.operation), one => one.name);
79
+ return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length };
80
+ }
81
+ /** 요청 안에서 한 번만 훑는다. **약속을 담는다** — 줄들이 거의 동시에 묻는다. */
82
+ function operationUseOf(context) {
83
+ const state = context.state;
84
+ state.operationUse = state.operationUse || scanOperationUse(state.domain);
85
+ return state.operationUse;
86
+ }
87
+ let OperationDefinitionResolver = class OperationDefinitionResolver {
88
+ async operationDefinitions(params, context) {
89
+ const { domain } = context.state;
90
+ const { items, total } = await (0, master_list_1.listMaster)('operationDefinition', params, domain);
91
+ return { items: items, total };
92
+ }
93
+ /**
94
+ * 이 공정을 단계로 갖는 **라우팅들.**
95
+ *
96
+ * 공정을 고치기 전에 무엇이 딸려 오는지 여기서 본다. 여럿일 수 있다 — 같은 공정을 여러 라우팅이
97
+ * 지난다(절단은 표준에도 빠른 것에도 있다).
98
+ *
99
+ * 아무도 안 쓰면 빈 목록이다. 다만 그것이 「안 쓴다」인지 「다 못 봤다」인지는
100
+ * `referrerScanCapped` 가 말한다.
101
+ */
102
+ async usedInRoutes(operation, context) {
103
+ return (await operationUseOf(context)).routes.get(operation.name) ?? [];
104
+ }
105
+ /**
106
+ * 이 공정에서 자재를 넣는 **제조법들.**
107
+ *
108
+ * 라우팅은 「어디를 지나나」이고 이것은 「거기서 무엇이 빠지나」다. 공정을 없애면 그 자재가
109
+ * 빠질 자리를 잃는다.
110
+ */
111
+ async consumedAt(operation, context) {
112
+ return (await operationUseOf(context)).recipes.get(operation.name) ?? [];
113
+ }
114
+ /**
115
+ * 라우팅·제조법을 다 보지 못했나.
116
+ *
117
+ * **조용히 자르지 않는다.** 상한에 걸리면 위의 두 칸이 덜 찬 답이고, 그것을 말하지 않으면
118
+ * 「쓰는 데가 없다」와 「못 봤다」가 같아 보인다.
119
+ */
120
+ async referrerScanCapped(operation, context) {
121
+ return (await operationUseOf(context)).capped;
122
+ }
123
+ /**
124
+ * 그리드가 보낸 변경을 한 번에 적용한다.
125
+ *
126
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
127
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
128
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
129
+ */
130
+ async updateMultipleOperationDefinition(patches, context) {
131
+ const { domain, user, tx } = context.state;
132
+ const axis = (0, master_axis_1.masterAxisOf)('operationDefinition');
133
+ const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
134
+ hasEffectivePeriod: axis.hasEffectivePeriod
135
+ });
136
+ return saved;
137
+ }
138
+ };
139
+ exports.OperationDefinitionResolver = OperationDefinitionResolver;
140
+ tslib_1.__decorate([
141
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
142
+ (0, type_graphql_2.Query)(returns => OperationDefinitionList, { description: 'To fetch operation definitions' }),
143
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
144
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
145
+ tslib_1.__metadata("design:type", Function),
146
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
147
+ tslib_1.__metadata("design:returntype", Promise)
148
+ ], OperationDefinitionResolver.prototype, "operationDefinitions", null);
149
+ tslib_1.__decorate([
150
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Routes that include this operation as a step' }),
151
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
152
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
153
+ tslib_1.__metadata("design:type", Function),
154
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
155
+ tslib_1.__metadata("design:returntype", Promise)
156
+ ], OperationDefinitionResolver.prototype, "usedInRoutes", null);
157
+ tslib_1.__decorate([
158
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Recipes that consume materials at this operation' }),
159
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
160
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
161
+ tslib_1.__metadata("design:type", Function),
162
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
163
+ tslib_1.__metadata("design:returntype", Promise)
164
+ ], OperationDefinitionResolver.prototype, "consumedAt", null);
165
+ tslib_1.__decorate([
166
+ (0, type_graphql_2.FieldResolver)(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' }),
167
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
168
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
169
+ tslib_1.__metadata("design:type", Function),
170
+ tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
171
+ tslib_1.__metadata("design:returntype", Promise)
172
+ ], OperationDefinitionResolver.prototype, "referrerScanCapped", null);
173
+ tslib_1.__decorate([
174
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
175
+ (0, type_graphql_2.Directive)('@transaction'),
176
+ (0, type_graphql_2.Mutation)(returns => [operation_definition_1.OperationDefinition], { description: 'To create, change or retire operation definitions' }),
177
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
178
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
179
+ tslib_1.__metadata("design:type", Function),
180
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
181
+ tslib_1.__metadata("design:returntype", Promise)
182
+ ], OperationDefinitionResolver.prototype, "updateMultipleOperationDefinition", null);
183
+ exports.OperationDefinitionResolver = OperationDefinitionResolver = tslib_1.__decorate([
184
+ (0, type_graphql_2.Resolver)(operation_definition_1.OperationDefinition),
185
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
186
+ ], OperationDefinitionResolver);
187
+ //# sourceMappingURL=operation-master-resolver.js.map
@@ -0,0 +1 @@
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 { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { 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 { listEffectiveRecipes } from '../recipe/recipe-effective-list'\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 listEffectiveRecipes(recipeRepo.manager, domain, { pagination: { page:1, limit:OPERATION_SCAN_LIMIT } } as any).then(page => page.items)\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)\n@UseMiddleware(SpeakRefusals)\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"]}
@@ -0,0 +1,21 @@
1
+ import type { OperationDefinition } from './operation-definition';
2
+ /** 트윈 선언의 `operations` 한 항목 — 계약의 `OperationDef` 모양이다. */
3
+ export interface OperationEntry {
4
+ key: string;
5
+ label: string;
6
+ intent: string;
7
+ locationType?: string;
8
+ resourceType?: string;
9
+ bizStep?: string;
10
+ duration?: string;
11
+ variability?: unknown;
12
+ parameters?: unknown[];
13
+ personnelSpecification?: unknown[];
14
+ physicalAssetSpecification?: unknown[];
15
+ effectiveStart?: string;
16
+ effectiveEnd?: string;
17
+ }
18
+ export declare function toOperationEntry(operation: OperationDefinition): OperationEntry;
19
+ export declare function operationMaster(operations: OperationDefinition[]): {
20
+ operations: OperationEntry[];
21
+ };