@things-factory/ops-master 10.1.248 → 10.1.249

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 +3 -3
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pullPage = pullPage;
4
+ exports.refuseIfTooLarge = refuseIfTooLarge;
5
+ const typeorm_1 = require("typeorm");
6
+ const shell_1 = require("@things-factory/shell");
7
+ const master_page_1 = require("./master-page");
8
+ /**
9
+ * 마스터 한 축을 **나눠 읽는다** — 저장소 쪽. 판단은 `master-page` 가 한다.
10
+ *
11
+ * ═══════════════════════════════════════════════════════════════════════════
12
+ * ── 등급은 매 쪽에 통째로 싣는다 ───────────────────────────────────────────
13
+ * 이 축들은 구성원이 자기 **등급을 이름으로 가리킨다.** 등급과 구성원을 따로 나눠 보내면 구성원이
14
+ * 먼저 도착하고 등급이 나중에 오는 순간이 생기고, 그 순간 받는 쪽은 **없는 등급을 가리키는 구성원**을
15
+ * 갖는다. 원래 이 조회들이 「자르지 않는다」고 적어 둔 이유가 그것이다.
16
+ *
17
+ * 그래서 **구성원만 나누고 등급은 매 쪽에 전부 싣는다.** 등급은 수십 단위라 실어도 크지 않고, 그러면
18
+ * 어느 쪽을 먼저 받아도 가리키는 곳이 항상 있다.
19
+ *
20
+ * ── 이름 다음부터 읽는다 ───────────────────────────────────────────────────
21
+ * `skip` 은 규모에서 못 쓴다 — 건너뛴 만큼을 매번 다시 읽는다. 이 축들은 이미 이름으로 정렬해 내므로
22
+ * **마지막 이름 다음부터** 읽으면 건너뛸 것이 없다.
23
+ * ═══════════════════════════════════════════════════════════════════════════
24
+ */
25
+ /**
26
+ * 한 축을 한 쪽만큼 읽는다.
27
+ *
28
+ * 이름 칸을 받는 이유: 축마다 다르다(`name` · `operationKey` …). 여기서 알아보려 하면 축이 늘 때마다
29
+ * 이 함수를 고쳐야 한다.
30
+ */
31
+ async function pullPage(entity, domain, request, nameColumn = 'name') {
32
+ const where = { domain: { id: domain.id } };
33
+ if (request.after) {
34
+ where[nameColumn] = (0, typeorm_1.MoreThan)(request.after);
35
+ }
36
+ const read = (await (0, shell_1.getRepository)(entity).find({
37
+ where,
38
+ order: { [nameColumn]: 'ASC' },
39
+ take: (0, master_page_1.takeFor)(request)
40
+ }));
41
+ return (0, master_page_1.pageOf)(read, request, row => String(row[nameColumn]));
42
+ }
43
+ /**
44
+ * **통째로 달라고 했는데 너무 크면 던진다.**
45
+ *
46
+ * 자르고 넘어가지 않는다 — 받는 쪽은 그것이 전부인 줄 알고 트윈을 세우고, 없는 품목이 화면에서 그냥
47
+ * 존재하지 않게 된다. 오류가 안 난다. 그래서 **틀린 답 대신 오류**를 준다.
48
+ */
49
+ function refuseIfTooLarge(axis, request, page) {
50
+ const problem = (0, master_page_1.tooLargeToPull)(axis, request, page);
51
+ if (problem) {
52
+ throw new Error(problem);
53
+ }
54
+ }
55
+ //# sourceMappingURL=master-page-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-page-query.js","sourceRoot":"","sources":["../../server/service/master-page-query.ts"],"names":[],"mappings":";;AA+BA,4BAmBC;AAQD,4CAMC;AAhED,qCAAkC;AAElC,iDAA6D;AAE7D,+CAA+D;AAG/D;;;;;;;;;;;;;;;;GAgBG;AAEH;;;;;GAKG;AACI,KAAK,UAAU,QAAQ,CAC5B,MAAW,EACX,MAAc,EACd,OAAoB,EACpB,aAA+B,MAAa;IAE5C,MAAM,KAAK,GAA4B,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAA;IAEpE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,UAAU,CAAC,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC;QAC7C,KAAK;QACL,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE;QAC9B,IAAI,EAAE,IAAA,qBAAO,EAAC,OAAO,CAAC;KACvB,CAAC,CAAQ,CAAA;IAEV,OAAO,IAAA,oBAAM,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAE,GAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;AACvE,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,IAAY,EAAE,OAAoB,EAAE,IAAmB;IACtF,MAAM,OAAO,GAAG,IAAA,4BAAc,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IAEnD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC","sourcesContent":["import { MoreThan } from 'typeorm'\n\nimport { Domain, getRepository } from '@things-factory/shell'\n\nimport { pageOf, takeFor, tooLargeToPull } from './master-page'\nimport type { Page, PageRequest } from './master-page'\n\n/**\n * 마스터 한 축을 **나눠 읽는다** — 저장소 쪽. 판단은 `master-page` 가 한다.\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ── 등급은 매 쪽에 통째로 싣는다 ───────────────────────────────────────────\n * 이 축들은 구성원이 자기 **등급을 이름으로 가리킨다.** 등급과 구성원을 따로 나눠 보내면 구성원이\n * 먼저 도착하고 등급이 나중에 오는 순간이 생기고, 그 순간 받는 쪽은 **없는 등급을 가리키는 구성원**을\n * 갖는다. 원래 이 조회들이 「자르지 않는다」고 적어 둔 이유가 그것이다.\n *\n * 그래서 **구성원만 나누고 등급은 매 쪽에 전부 싣는다.** 등급은 수십 단위라 실어도 크지 않고, 그러면\n * 어느 쪽을 먼저 받아도 가리키는 곳이 항상 있다.\n *\n * ── 이름 다음부터 읽는다 ───────────────────────────────────────────────────\n * `skip` 은 규모에서 못 쓴다 — 건너뛴 만큼을 매번 다시 읽는다. 이 축들은 이미 이름으로 정렬해 내므로\n * **마지막 이름 다음부터** 읽으면 건너뛸 것이 없다.\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/**\n * 한 축을 한 쪽만큼 읽는다.\n *\n * 이름 칸을 받는 이유: 축마다 다르다(`name` · `operationKey` …). 여기서 알아보려 하면 축이 늘 때마다\n * 이 함수를 고쳐야 한다.\n */\nexport async function pullPage<T>(\n entity: any,\n domain: Domain,\n request: PageRequest,\n nameColumn: keyof T & string = 'name' as any\n): Promise<Page<T>> {\n const where: Record<string, unknown> = { domain: { id: domain.id } }\n\n if (request.after) {\n where[nameColumn] = MoreThan(request.after)\n }\n\n const read = (await getRepository(entity).find({\n where,\n order: { [nameColumn]: 'ASC' },\n take: takeFor(request)\n })) as T[]\n\n return pageOf(read, request, row => String((row as any)[nameColumn]))\n}\n\n/**\n * **통째로 달라고 했는데 너무 크면 던진다.**\n *\n * 자르고 넘어가지 않는다 — 받는 쪽은 그것이 전부인 줄 알고 트윈을 세우고, 없는 품목이 화면에서 그냥\n * 존재하지 않게 된다. 오류가 안 난다. 그래서 **틀린 답 대신 오류**를 준다.\n */\nexport function refuseIfTooLarge(axis: string, request: PageRequest, page: Page<unknown>): void {\n const problem = tooLargeToPull(axis, request, page)\n\n if (problem) {\n throw new Error(problem)\n }\n}\n"]}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * **마스터를 나눠 내는 규칙** — 순수 판단.
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════
5
+ * ── 무엇이 문제였나 ────────────────────────────────────────────────────────
6
+ * 트윈이 당겨 가는 마스터 조회 여덟 축이 **전부 전량 조회**였다. 도메인 조건 하나만 걸고 그 축의 모든
7
+ * 행을 읽어 JSON 한 덩어리로 낸다.
8
+ *
9
+ * 재봤다: 품목 100만에서 **2,219ms · 49MB**. 지금 미라텍은 자재 106개라 안 아프지만, 이 제품의 규모
10
+ * 기준은 엔티티 10만 · 품목 100만이다. 그 규모에서 이 조회는 서지 않는다.
11
+ *
12
+ * ── 왜 「조용히 자르기」가 아니라 「거절」인가 ──────────────────────────────
13
+ * 한계를 두고 **말없이 앞부분만 주는 것이 제일 나쁘다.** 받는 쪽은 그것이 전부인 줄 알고 트윈을
14
+ * 세우고, 없는 설비·없는 품목이 화면에서 그냥 **존재하지 않게** 된다. 오류가 안 난다.
15
+ *
16
+ * 오늘 하루 종일 잡은 부류가 그것이라, 여기서는 그렇게 하지 않는다.
17
+ *
18
+ * 나눠 달라고 하면(`limit`) 그만큼 주고 **더 있는지 말한다**(`hasMore`)
19
+ * 통째로 달라고 했는데 크면 **거절하고 나눠 받으라고 말한다**
20
+ * 통째로 달라고 했는데 작으면 그냥 준다 — 대부분의 현장이 여기다
21
+ *
22
+ * 그래서 작은 공장은 지금 그대로 돌고, 큰 공장은 **틀린 답 대신 오류**를 받는다.
23
+ *
24
+ * ── 왜 이름으로 이어 받나 ──────────────────────────────────────────────────
25
+ * `offset` 은 규모에서 못 쓴다 — 뒤로 갈수록 건너뛴 만큼을 매번 다시 읽는다. 이 축들은 이미 이름으로
26
+ * 정렬해 내므로(`order: { name: 'ASC' }`), **마지막 이름 다음부터** 읽으면 건너뛸 것이 없다.
27
+ *
28
+ * 이름이 유일하다는 것에 기댄다. 도메인 안에서 마스터 이름은 유일하다(그 이름으로 실적·사실이 자원을
29
+ * 가리킨다 — 유일하지 않으면 그것부터 깨진다).
30
+ * ═══════════════════════════════════════════════════════════════════════════
31
+ */
32
+ /**
33
+ * 한 번에 낼 수 있는 **최대**. 이보다 크게 달라고 해도 이만큼만 낸다.
34
+ *
35
+ * ⚠ **이것은 안전장치이지 권하는 쪽 크기가 아니다.** 받는 쪽이 이 수에 붙여 두면, 우리가 한도를
36
+ * 내리는 날 그쪽은 **그날부터** 못 읽는다. 권하는 크기는 `SUGGESTED_PAGE` 다.
37
+ *
38
+ * 인티그레이션이 붙이면서 스스로 이 구별을 하고 2,000 을 골랐다(2026-09-05) — 「그 수는 거절하는
39
+ * 자리이지 권하는 크기가 아니다」. 맞는 판단이고, 여기 적혀 있지 않아서 스스로 알아낸 것이라 적는다.
40
+ */
41
+ export declare const MAX_PAGE = 5000;
42
+ /**
43
+ * 권하는 쪽 크기.
44
+ *
45
+ * [재봤음] 품목 100만이 전량 49MB 였으니 2,000이면 한 쪽이 100KB 안팎이다. 한 쪽에 1.4ms 이고
46
+ * 이어받기는 0.1ms 라, 쪽을 더 키워 얻을 것이 없다.
47
+ */
48
+ export declare const SUGGESTED_PAGE = 2000;
49
+ /** `limit` 을 안 주고 나눠 받지도 않을 때, 통째로 내주는 한도. 넘으면 거절한다. */
50
+ export declare const WHOLE_LIMIT = 5000;
51
+ /** 나눠 달라고 했는데 몇 개인지는 안 말했을 때. */
52
+ export declare const DEFAULT_PAGE = 1000;
53
+ export interface PageRequest {
54
+ /** 이 이름 **다음부터**. 앞 페이지의 `next` 를 그대로 준다. */
55
+ after?: string;
56
+ /** 몇 개까지. 없으면 통째로 달라는 뜻이다. */
57
+ limit?: number;
58
+ }
59
+ /**
60
+ * 실제로 몇 개를 읽을 것인가.
61
+ *
62
+ * **하나를 더 읽는다.** 더 있는지 알려면 세거나(`COUNT`) 한 개 더 읽어야 하는데, 세는 것은 같은 조건을
63
+ * 두 번 훑는 것이라 규모에서 두 배가 된다.
64
+ */
65
+ export declare function takeFor(request: PageRequest): number;
66
+ export interface Page<T> {
67
+ rows: T[];
68
+ /** 더 있나. **이 값을 안 보고 쓰면 조용히 잘린 자료를 쓰게 된다.** */
69
+ hasMore: boolean;
70
+ /** 이어 받을 자리 — 다음 요청의 `after`. 더 없으면 없다. */
71
+ next?: string;
72
+ }
73
+ /**
74
+ * 하나 더 읽어 온 결과를 페이지로 만든다.
75
+ *
76
+ * `nameOf` 를 받는 이유: 축마다 이름 칸이 다르다(`name` · `operationKey` …). 그 차이를 여기서 알아보려
77
+ * 하면 축이 늘 때마다 이 함수를 고쳐야 한다.
78
+ */
79
+ export declare function pageOf<T>(read: readonly T[], request: PageRequest, nameOf: (row: T) => string): Page<T>;
80
+ /**
81
+ * **통째로 달라고 했는데 너무 크다** — 낼 수 없는 이유를 사람 말로.
82
+ *
83
+ * 자르지 않는다. 자르면 받는 쪽은 그것이 전부인 줄 안다.
84
+ */
85
+ export declare function tooLargeToPull(axis: string, request: PageRequest, page: Page<unknown>): string | undefined;
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * **마스터를 나눠 내는 규칙** — 순수 판단.
4
+ *
5
+ * ═══════════════════════════════════════════════════════════════════════════
6
+ * ── 무엇이 문제였나 ────────────────────────────────────────────────────────
7
+ * 트윈이 당겨 가는 마스터 조회 여덟 축이 **전부 전량 조회**였다. 도메인 조건 하나만 걸고 그 축의 모든
8
+ * 행을 읽어 JSON 한 덩어리로 낸다.
9
+ *
10
+ * 재봤다: 품목 100만에서 **2,219ms · 49MB**. 지금 미라텍은 자재 106개라 안 아프지만, 이 제품의 규모
11
+ * 기준은 엔티티 10만 · 품목 100만이다. 그 규모에서 이 조회는 서지 않는다.
12
+ *
13
+ * ── 왜 「조용히 자르기」가 아니라 「거절」인가 ──────────────────────────────
14
+ * 한계를 두고 **말없이 앞부분만 주는 것이 제일 나쁘다.** 받는 쪽은 그것이 전부인 줄 알고 트윈을
15
+ * 세우고, 없는 설비·없는 품목이 화면에서 그냥 **존재하지 않게** 된다. 오류가 안 난다.
16
+ *
17
+ * 오늘 하루 종일 잡은 부류가 그것이라, 여기서는 그렇게 하지 않는다.
18
+ *
19
+ * 나눠 달라고 하면(`limit`) 그만큼 주고 **더 있는지 말한다**(`hasMore`)
20
+ * 통째로 달라고 했는데 크면 **거절하고 나눠 받으라고 말한다**
21
+ * 통째로 달라고 했는데 작으면 그냥 준다 — 대부분의 현장이 여기다
22
+ *
23
+ * 그래서 작은 공장은 지금 그대로 돌고, 큰 공장은 **틀린 답 대신 오류**를 받는다.
24
+ *
25
+ * ── 왜 이름으로 이어 받나 ──────────────────────────────────────────────────
26
+ * `offset` 은 규모에서 못 쓴다 — 뒤로 갈수록 건너뛴 만큼을 매번 다시 읽는다. 이 축들은 이미 이름으로
27
+ * 정렬해 내므로(`order: { name: 'ASC' }`), **마지막 이름 다음부터** 읽으면 건너뛸 것이 없다.
28
+ *
29
+ * 이름이 유일하다는 것에 기댄다. 도메인 안에서 마스터 이름은 유일하다(그 이름으로 실적·사실이 자원을
30
+ * 가리킨다 — 유일하지 않으면 그것부터 깨진다).
31
+ * ═══════════════════════════════════════════════════════════════════════════
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.DEFAULT_PAGE = exports.WHOLE_LIMIT = exports.SUGGESTED_PAGE = exports.MAX_PAGE = void 0;
35
+ exports.takeFor = takeFor;
36
+ exports.pageOf = pageOf;
37
+ exports.tooLargeToPull = tooLargeToPull;
38
+ /**
39
+ * 한 번에 낼 수 있는 **최대**. 이보다 크게 달라고 해도 이만큼만 낸다.
40
+ *
41
+ * ⚠ **이것은 안전장치이지 권하는 쪽 크기가 아니다.** 받는 쪽이 이 수에 붙여 두면, 우리가 한도를
42
+ * 내리는 날 그쪽은 **그날부터** 못 읽는다. 권하는 크기는 `SUGGESTED_PAGE` 다.
43
+ *
44
+ * 인티그레이션이 붙이면서 스스로 이 구별을 하고 2,000 을 골랐다(2026-09-05) — 「그 수는 거절하는
45
+ * 자리이지 권하는 크기가 아니다」. 맞는 판단이고, 여기 적혀 있지 않아서 스스로 알아낸 것이라 적는다.
46
+ */
47
+ exports.MAX_PAGE = 5_000;
48
+ /**
49
+ * 권하는 쪽 크기.
50
+ *
51
+ * [재봤음] 품목 100만이 전량 49MB 였으니 2,000이면 한 쪽이 100KB 안팎이다. 한 쪽에 1.4ms 이고
52
+ * 이어받기는 0.1ms 라, 쪽을 더 키워 얻을 것이 없다.
53
+ */
54
+ exports.SUGGESTED_PAGE = 2_000;
55
+ /** `limit` 을 안 주고 나눠 받지도 않을 때, 통째로 내주는 한도. 넘으면 거절한다. */
56
+ exports.WHOLE_LIMIT = 5_000;
57
+ /** 나눠 달라고 했는데 몇 개인지는 안 말했을 때. */
58
+ exports.DEFAULT_PAGE = 1_000;
59
+ /**
60
+ * 실제로 몇 개를 읽을 것인가.
61
+ *
62
+ * **하나를 더 읽는다.** 더 있는지 알려면 세거나(`COUNT`) 한 개 더 읽어야 하는데, 세는 것은 같은 조건을
63
+ * 두 번 훑는 것이라 규모에서 두 배가 된다.
64
+ */
65
+ function takeFor(request) {
66
+ if (request.limit === undefined) {
67
+ /* 통째로 달라는 요청이다. 한도를 넘는지 보려면 한도+1 을 읽어 봐야 한다. */
68
+ return exports.WHOLE_LIMIT + 1;
69
+ }
70
+ /* 0 이나 음수를 「전부」로 읽지 않는다 — 그렇게 읽으면 실수 하나가 전량 조회가 된다. */
71
+ const asked = Math.floor(request.limit);
72
+ const bounded = Number.isFinite(asked) ? Math.min(Math.max(asked, 1), exports.MAX_PAGE) : exports.DEFAULT_PAGE;
73
+ return bounded + 1;
74
+ }
75
+ /**
76
+ * 하나 더 읽어 온 결과를 페이지로 만든다.
77
+ *
78
+ * `nameOf` 를 받는 이유: 축마다 이름 칸이 다르다(`name` · `operationKey` …). 그 차이를 여기서 알아보려
79
+ * 하면 축이 늘 때마다 이 함수를 고쳐야 한다.
80
+ */
81
+ function pageOf(read, request, nameOf) {
82
+ const size = takeFor(request) - 1;
83
+ const hasMore = read.length > size;
84
+ const rows = hasMore ? read.slice(0, size) : [...read];
85
+ return {
86
+ rows,
87
+ hasMore,
88
+ ...(hasMore && rows.length ? { next: nameOf(rows[rows.length - 1]) } : {})
89
+ };
90
+ }
91
+ /**
92
+ * **통째로 달라고 했는데 너무 크다** — 낼 수 없는 이유를 사람 말로.
93
+ *
94
+ * 자르지 않는다. 자르면 받는 쪽은 그것이 전부인 줄 안다.
95
+ */
96
+ function tooLargeToPull(axis, request, page) {
97
+ if (request.limit !== undefined || !page.hasMore) {
98
+ return undefined;
99
+ }
100
+ return (`${axis} 축이 한 번에 낼 수 있는 ${exports.WHOLE_LIMIT}건을 넘습니다. ` +
101
+ `limit 과 after 로 나눠 받으십시오 — ${exports.SUGGESTED_PAGE}건쯤이 알맞고(최대 ${exports.MAX_PAGE}건), ` +
102
+ '응답의 hasMore 가 거짓이 될 때까지 next 를 after 로 넘기면 됩니다.');
103
+ }
104
+ //# sourceMappingURL=master-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"master-page.js","sourceRoot":"","sources":["../../server/service/master-page.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;;AAwCH,0BAWC;AAgBD,wBAUC;AAOD,wCAUC;AA5FD;;;;;;;;GAQG;AACU,QAAA,QAAQ,GAAG,KAAK,CAAA;AAE7B;;;;;GAKG;AACU,QAAA,cAAc,GAAG,KAAK,CAAA;AAEnC,wDAAwD;AAC3C,QAAA,WAAW,GAAG,KAAK,CAAA;AAEhC,iCAAiC;AACpB,QAAA,YAAY,GAAG,KAAK,CAAA;AASjC;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,OAAoB;IAC1C,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,gDAAgD;QAChD,OAAO,mBAAW,GAAG,CAAC,CAAA;IACxB,CAAC;IAED,uDAAuD;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,gBAAQ,CAAC,CAAC,CAAC,CAAC,oBAAY,CAAA;IAE9F,OAAO,OAAO,GAAG,CAAC,CAAA;AACpB,CAAC;AAUD;;;;;GAKG;AACH,SAAgB,MAAM,CAAI,IAAkB,EAAE,OAAoB,EAAE,MAA0B;IAC5F,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IAEtD,OAAO;QACL,IAAI;QACJ,OAAO;QACP,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,OAAoB,EAAE,IAAmB;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,CACL,GAAG,IAAI,mBAAmB,mBAAW,WAAW;QAChD,8BAA8B,sBAAc,cAAc,gBAAQ,MAAM;QACxE,iDAAiD,CAClD,CAAA;AACH,CAAC","sourcesContent":["/**\n * **마스터를 나눠 내는 규칙** — 순수 판단.\n *\n * ═══════════════════════════════════════════════════════════════════════════\n * ── 무엇이 문제였나 ────────────────────────────────────────────────────────\n * 트윈이 당겨 가는 마스터 조회 여덟 축이 **전부 전량 조회**였다. 도메인 조건 하나만 걸고 그 축의 모든\n * 행을 읽어 JSON 한 덩어리로 낸다.\n *\n * 재봤다: 품목 100만에서 **2,219ms · 49MB**. 지금 미라텍은 자재 106개라 안 아프지만, 이 제품의 규모\n * 기준은 엔티티 10만 · 품목 100만이다. 그 규모에서 이 조회는 서지 않는다.\n *\n * ── 왜 「조용히 자르기」가 아니라 「거절」인가 ──────────────────────────────\n * 한계를 두고 **말없이 앞부분만 주는 것이 제일 나쁘다.** 받는 쪽은 그것이 전부인 줄 알고 트윈을\n * 세우고, 없는 설비·없는 품목이 화면에서 그냥 **존재하지 않게** 된다. 오류가 안 난다.\n *\n * 오늘 하루 종일 잡은 부류가 그것이라, 여기서는 그렇게 하지 않는다.\n *\n * 나눠 달라고 하면(`limit`) 그만큼 주고 **더 있는지 말한다**(`hasMore`)\n * 통째로 달라고 했는데 크면 **거절하고 나눠 받으라고 말한다**\n * 통째로 달라고 했는데 작으면 그냥 준다 — 대부분의 현장이 여기다\n *\n * 그래서 작은 공장은 지금 그대로 돌고, 큰 공장은 **틀린 답 대신 오류**를 받는다.\n *\n * ── 왜 이름으로 이어 받나 ──────────────────────────────────────────────────\n * `offset` 은 규모에서 못 쓴다 — 뒤로 갈수록 건너뛴 만큼을 매번 다시 읽는다. 이 축들은 이미 이름으로\n * 정렬해 내므로(`order: { name: 'ASC' }`), **마지막 이름 다음부터** 읽으면 건너뛸 것이 없다.\n *\n * 이름이 유일하다는 것에 기댄다. 도메인 안에서 마스터 이름은 유일하다(그 이름으로 실적·사실이 자원을\n * 가리킨다 — 유일하지 않으면 그것부터 깨진다).\n * ═══════════════════════════════════════════════════════════════════════════\n */\n\n/**\n * 한 번에 낼 수 있는 **최대**. 이보다 크게 달라고 해도 이만큼만 낸다.\n *\n * ⚠ **이것은 안전장치이지 권하는 쪽 크기가 아니다.** 받는 쪽이 이 수에 붙여 두면, 우리가 한도를\n * 내리는 날 그쪽은 **그날부터** 못 읽는다. 권하는 크기는 `SUGGESTED_PAGE` 다.\n *\n * 인티그레이션이 붙이면서 스스로 이 구별을 하고 2,000 을 골랐다(2026-09-05) — 「그 수는 거절하는\n * 자리이지 권하는 크기가 아니다」. 맞는 판단이고, 여기 적혀 있지 않아서 스스로 알아낸 것이라 적는다.\n */\nexport const MAX_PAGE = 5_000\n\n/**\n * 권하는 쪽 크기.\n *\n * [재봤음] 품목 100만이 전량 49MB 였으니 2,000이면 한 쪽이 100KB 안팎이다. 한 쪽에 1.4ms 이고\n * 이어받기는 0.1ms 라, 쪽을 더 키워 얻을 것이 없다.\n */\nexport const SUGGESTED_PAGE = 2_000\n\n/** `limit` 을 안 주고 나눠 받지도 않을 때, 통째로 내주는 한도. 넘으면 거절한다. */\nexport const WHOLE_LIMIT = 5_000\n\n/** 나눠 달라고 했는데 몇 개인지는 안 말했을 때. */\nexport const DEFAULT_PAGE = 1_000\n\nexport interface PageRequest {\n /** 이 이름 **다음부터**. 앞 페이지의 `next` 를 그대로 준다. */\n after?: string\n /** 몇 개까지. 없으면 통째로 달라는 뜻이다. */\n limit?: number\n}\n\n/**\n * 실제로 몇 개를 읽을 것인가.\n *\n * **하나를 더 읽는다.** 더 있는지 알려면 세거나(`COUNT`) 한 개 더 읽어야 하는데, 세는 것은 같은 조건을\n * 두 번 훑는 것이라 규모에서 두 배가 된다.\n */\nexport function takeFor(request: PageRequest): number {\n if (request.limit === undefined) {\n /* 통째로 달라는 요청이다. 한도를 넘는지 보려면 한도+1 을 읽어 봐야 한다. */\n return WHOLE_LIMIT + 1\n }\n\n /* 0 이나 음수를 「전부」로 읽지 않는다 — 그렇게 읽으면 실수 하나가 전량 조회가 된다. */\n const asked = Math.floor(request.limit)\n const bounded = Number.isFinite(asked) ? Math.min(Math.max(asked, 1), MAX_PAGE) : DEFAULT_PAGE\n\n return bounded + 1\n}\n\nexport interface Page<T> {\n rows: T[]\n /** 더 있나. **이 값을 안 보고 쓰면 조용히 잘린 자료를 쓰게 된다.** */\n hasMore: boolean\n /** 이어 받을 자리 — 다음 요청의 `after`. 더 없으면 없다. */\n next?: string\n}\n\n/**\n * 하나 더 읽어 온 결과를 페이지로 만든다.\n *\n * `nameOf` 를 받는 이유: 축마다 이름 칸이 다르다(`name` · `operationKey` …). 그 차이를 여기서 알아보려\n * 하면 축이 늘 때마다 이 함수를 고쳐야 한다.\n */\nexport function pageOf<T>(read: readonly T[], request: PageRequest, nameOf: (row: T) => string): Page<T> {\n const size = takeFor(request) - 1\n const hasMore = read.length > size\n const rows = hasMore ? read.slice(0, size) : [...read]\n\n return {\n rows,\n hasMore,\n ...(hasMore && rows.length ? { next: nameOf(rows[rows.length - 1]) } : {})\n }\n}\n\n/**\n * **통째로 달라고 했는데 너무 크다** — 낼 수 없는 이유를 사람 말로.\n *\n * 자르지 않는다. 자르면 받는 쪽은 그것이 전부인 줄 안다.\n */\nexport function tooLargeToPull(axis: string, request: PageRequest, page: Page<unknown>): string | undefined {\n if (request.limit !== undefined || !page.hasMore) {\n return undefined\n }\n\n return (\n `${axis} 축이 한 번에 낼 수 있는 ${WHOLE_LIMIT}건을 넘습니다. ` +\n `limit 과 after 로 나눠 받으십시오 — ${SUGGESTED_PAGE}건쯤이 알맞고(최대 ${MAX_PAGE}건), ` +\n '응답의 hasMore 가 거짓이 될 때까지 next 를 after 로 넘기면 됩니다.'\n )\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { MaterialClass } from './material-class';
2
+ import { MaterialDefinition } from './material-definition';
3
+ import { MaterialQuery } from './material-query';
4
+ import { MaterialClassResolver, MaterialDefinitionResolver } from './material-master-resolver';
5
+ import { MaterialDefinitionRevisionResolver } from './material-revision-resolver';
6
+ export declare const entities: (typeof MaterialClass | typeof MaterialDefinition | typeof import("./material-revision").MaterialDefinitionRevision | typeof import("./material-revision").MaterialDefinitionPlan | typeof import("./material-revision").MaterialDefinitionSegment | typeof import("./material-revision").MaterialDefinitionBasis)[];
7
+ export declare const resolvers: (typeof MaterialClassResolver | typeof MaterialDefinitionResolver | typeof MaterialDefinitionRevisionResolver | typeof MaterialQuery)[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const material_class_1 = require("./material-class");
5
+ const material_definition_1 = require("./material-definition");
6
+ const material_query_1 = require("./material-query");
7
+ const material_master_resolver_1 = require("./material-master-resolver");
8
+ const material_revision_1 = require("./material-revision");
9
+ const material_revision_resolver_1 = require("./material-revision-resolver");
10
+ exports.entities = [material_class_1.MaterialClass, material_definition_1.MaterialDefinition, ...material_revision_1.MATERIAL_REVISION_ENTITIES];
11
+ exports.resolvers = [material_query_1.MaterialQuery, material_master_resolver_1.MaterialClassResolver, material_master_resolver_1.MaterialDefinitionResolver, material_revision_resolver_1.MaterialDefinitionRevisionResolver];
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/material/index.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;AAChD,+DAA0D;AAC1D,qDAAgD;AAChD,yEAA8F;AAC9F,2DAAgE;AAChE,6EAAiF;AAEpE,QAAA,QAAQ,GAAG,CAAC,8BAAa,EAAE,wCAAkB,EAAE,GAAG,8CAA0B,CAAC,CAAA;AAC7E,QAAA,SAAS,GAAG,CAAC,8BAAa,EAAE,gDAAqB,EAAE,qDAA0B,EAAE,+DAAkC,CAAC,CAAA","sourcesContent":["import { MaterialClass } from './material-class'\nimport { MaterialDefinition } from './material-definition'\nimport { MaterialQuery } from './material-query'\nimport { MaterialClassResolver, MaterialDefinitionResolver } from './material-master-resolver'\nimport { MATERIAL_REVISION_ENTITIES } from './material-revision'\nimport { MaterialDefinitionRevisionResolver } from './material-revision-resolver'\n\nexport const entities = [MaterialClass, MaterialDefinition, ...MATERIAL_REVISION_ENTITIES]\nexport const resolvers = [MaterialQuery, MaterialClassResolver, MaterialDefinitionResolver, MaterialDefinitionRevisionResolver]\n"]}
@@ -0,0 +1,8 @@
1
+ import { EntityManager } from 'typeorm';
2
+ /** Future activation changes the stamp without rewriting identity rows or running a midnight job. */
3
+ export declare function materialAxisStatus(manager: EntityManager, domainId: string, at?: Date): Promise<{
4
+ changedAt?: Date;
5
+ axis: string;
6
+ count: number;
7
+ stamp: string;
8
+ }>;
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.materialAxisStatus = materialAxisStatus;
4
+ const material_definition_1 = require("./material-definition");
5
+ const material_revision_1 = require("./material-revision");
6
+ /** Future activation changes the stamp without rewriting identity rows or running a midnight job. */
7
+ async function materialAxisStatus(manager, domainId, at = new Date()) {
8
+ const row = await manager.createQueryBuilder(material_definition_1.MaterialDefinition, 'm')
9
+ .leftJoin(material_revision_1.MaterialDefinitionPlan, 'p', 'p.material_id = m.id AND p.domain_id = m.domain_id AND p.generation = m.plan_generation')
10
+ .leftJoin(material_revision_1.MaterialDefinitionSegment, 's', 's.plan_id = p.id AND s.validFrom <= :at AND (s.validTo IS NULL OR s.validTo > :at)', { at })
11
+ .leftJoin(material_revision_1.MaterialDefinitionRevision, 'r', 'r.id = s.revision_id')
12
+ .select('COUNT(r.id)', 'count').addSelect('SUM(r.revisionNumber)', 'revisionSum')
13
+ .addSelect('SUM(m.planGeneration)', 'generationSum').addSelect('MAX(p.recordedAt)', 'changedAt')
14
+ .where('m.domain_id = :domainId', { domainId }).getRawOne();
15
+ return { axis: 'materialDefinitions', count: Number(row.count),
16
+ stamp: JSON.stringify([row.count, row.revisionSum, row.generationSum, row.changedAt]),
17
+ ...(row.changedAt ? { changedAt: new Date(row.changedAt) } : {}) };
18
+ }
19
+ //# sourceMappingURL=material-axis-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-axis-status.js","sourceRoot":"","sources":["../../../server/service/material/material-axis-status.ts"],"names":[],"mappings":";;AAKA,gDAWC;AAfD,+DAA0D;AAC1D,2DAAmH;AAEnH,qGAAqG;AAC9F,KAAK,UAAU,kBAAkB,CAAC,OAAsB,EAAE,QAAgB,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE;IAChG,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,wCAAkB,EAAE,GAAG,CAAC;SAClE,QAAQ,CAAC,0CAAsB,EAAE,GAAG,EAAE,yFAAyF,CAAC;SAChI,QAAQ,CAAC,6CAAyB,EAAE,GAAG,EAAE,oFAAoF,EAAE,EAAE,EAAE,EAAE,CAAC;SACtI,QAAQ,CAAC,8CAA0B,EAAE,GAAG,EAAE,sBAAsB,CAAC;SACjE,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,uBAAuB,EAAE,aAAa,CAAC;SAChF,SAAS,CAAC,uBAAuB,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,mBAAmB,EAAE,WAAW,CAAC;SAC/F,KAAK,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;IAC7D,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5D,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AACtE,CAAC","sourcesContent":["import { EntityManager } from 'typeorm'\nimport { MaterialDefinition } from './material-definition'\nimport { MaterialDefinitionPlan, MaterialDefinitionRevision, MaterialDefinitionSegment } from './material-revision'\n\n/** Future activation changes the stamp without rewriting identity rows or running a midnight job. */\nexport async function materialAxisStatus(manager: EntityManager, domainId: string, at = new Date()) {\n const row = await manager.createQueryBuilder(MaterialDefinition, 'm')\n .leftJoin(MaterialDefinitionPlan, 'p', 'p.material_id = m.id AND p.domain_id = m.domain_id AND p.generation = m.plan_generation')\n .leftJoin(MaterialDefinitionSegment, 's', 's.plan_id = p.id AND s.validFrom <= :at AND (s.validTo IS NULL OR s.validTo > :at)', { at })\n .leftJoin(MaterialDefinitionRevision, 'r', 'r.id = s.revision_id')\n .select('COUNT(r.id)', 'count').addSelect('SUM(r.revisionNumber)', 'revisionSum')\n .addSelect('SUM(m.planGeneration)', 'generationSum').addSelect('MAX(p.recordedAt)', 'changedAt')\n .where('m.domain_id = :domainId', { domainId }).getRawOne()\n return { axis: 'materialDefinitions', count: Number(row.count),\n stamp: JSON.stringify([row.count, row.revisionSum, row.generationSum, row.changedAt]),\n ...(row.changedAt ? { changedAt: new Date(row.changedAt) } : {}) }\n}\n"]}
@@ -0,0 +1,34 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 품목 등급 — **ISA-95 `MaterialClass`**.
5
+ *
6
+ * 「원자재」·「완제품」처럼 품목을 묶는 상위 개념이다. 레시피가 특정 품번 대신 등급으로 투입을 적을 수 있고,
7
+ * 화면이 재고를 그 단위로 모은다.
8
+ *
9
+ * 구조는 인원 등급 · 설비 등급과 같다(표준이 넷을 같은 모양으로 정의한다).
10
+ */
11
+ export declare class MaterialClass {
12
+ readonly id: string;
13
+ domain?: Domain;
14
+ domainId?: string;
15
+ /** 표준 `MaterialClassID`. */
16
+ name: string;
17
+ description?: string;
18
+ /** 상위 등급들 — 표준 `MaterialClassBaseID`(복수). 「6축 용접기」가 「용접기」를 상속한다. */
19
+ baseIds?: string[];
20
+ /** 이 등급의 적격을 정하는 `TestSpecification` 참조들 — 표준 `TestSpecificationID`. */
21
+ testSpecificationIds?: string[];
22
+ /** 등급 속성 — 표준 `MaterialClassProperty`. */
23
+ properties?: Record<string, unknown>[];
24
+ /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
25
+ effectiveStart?: Date;
26
+ /** 언제까지 유효한가 — 표준 `EffectiveEndDate`. */
27
+ effectiveEnd?: Date;
28
+ createdAt?: Date;
29
+ updatedAt?: Date;
30
+ creator?: User;
31
+ creatorId?: string;
32
+ updater?: User;
33
+ updaterId?: string;
34
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaterialClass = 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 `MaterialClass`**.
11
+ *
12
+ * 「원자재」·「완제품」처럼 품목을 묶는 상위 개념이다. 레시피가 특정 품번 대신 등급으로 투입을 적을 수 있고,
13
+ * 화면이 재고를 그 단위로 모은다.
14
+ *
15
+ * 구조는 인원 등급 · 설비 등급과 같다(표준이 넷을 같은 모양으로 정의한다).
16
+ */
17
+ let MaterialClass = class MaterialClass {
18
+ };
19
+ exports.MaterialClass = MaterialClass;
20
+ tslib_1.__decorate([
21
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
22
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
23
+ tslib_1.__metadata("design:type", String)
24
+ ], MaterialClass.prototype, "id", void 0);
25
+ tslib_1.__decorate([
26
+ (0, typeorm_1.ManyToOne)(type => shell_1.Domain),
27
+ (0, type_graphql_1.Field)(type => shell_1.Domain),
28
+ tslib_1.__metadata("design:type", shell_1.Domain)
29
+ ], MaterialClass.prototype, "domain", void 0);
30
+ tslib_1.__decorate([
31
+ (0, typeorm_1.RelationId)((klass) => klass.domain),
32
+ tslib_1.__metadata("design:type", String)
33
+ ], MaterialClass.prototype, "domainId", void 0);
34
+ tslib_1.__decorate([
35
+ (0, typeorm_1.Column)(),
36
+ (0, type_graphql_1.Field)(),
37
+ tslib_1.__metadata("design:type", String)
38
+ ], MaterialClass.prototype, "name", void 0);
39
+ tslib_1.__decorate([
40
+ (0, typeorm_1.Column)({ nullable: true }),
41
+ (0, type_graphql_1.Field)({ nullable: true }),
42
+ tslib_1.__metadata("design:type", String)
43
+ ], MaterialClass.prototype, "description", void 0);
44
+ tslib_1.__decorate([
45
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
46
+ (0, type_graphql_1.Field)(type => [String], { nullable: true }),
47
+ tslib_1.__metadata("design:type", Array)
48
+ ], MaterialClass.prototype, "baseIds", void 0);
49
+ tslib_1.__decorate([
50
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
51
+ (0, type_graphql_1.Field)(type => [String], { nullable: true }),
52
+ tslib_1.__metadata("design:type", Array)
53
+ ], MaterialClass.prototype, "testSpecificationIds", void 0);
54
+ tslib_1.__decorate([
55
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
56
+ (0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'ResourceProperty[]' }),
57
+ tslib_1.__metadata("design:type", Array)
58
+ ], MaterialClass.prototype, "properties", void 0);
59
+ tslib_1.__decorate([
60
+ (0, typeorm_1.Column)({ nullable: true }),
61
+ (0, type_graphql_1.Field)({ nullable: true }),
62
+ tslib_1.__metadata("design:type", Date
63
+ /** 언제까지 유효한가 — 표준 `EffectiveEndDate`. */
64
+ )
65
+ ], MaterialClass.prototype, "effectiveStart", 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", Date)
70
+ ], MaterialClass.prototype, "effectiveEnd", void 0);
71
+ tslib_1.__decorate([
72
+ (0, typeorm_1.CreateDateColumn)(),
73
+ (0, type_graphql_1.Field)({ nullable: true }),
74
+ tslib_1.__metadata("design:type", Date)
75
+ ], MaterialClass.prototype, "createdAt", void 0);
76
+ tslib_1.__decorate([
77
+ (0, typeorm_1.UpdateDateColumn)(),
78
+ (0, type_graphql_1.Field)({ nullable: true }),
79
+ tslib_1.__metadata("design:type", Date)
80
+ ], MaterialClass.prototype, "updatedAt", void 0);
81
+ tslib_1.__decorate([
82
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
83
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
84
+ tslib_1.__metadata("design:type", auth_base_1.User)
85
+ ], MaterialClass.prototype, "creator", void 0);
86
+ tslib_1.__decorate([
87
+ (0, typeorm_1.RelationId)((klass) => klass.creator),
88
+ tslib_1.__metadata("design:type", String)
89
+ ], MaterialClass.prototype, "creatorId", void 0);
90
+ tslib_1.__decorate([
91
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
92
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
93
+ tslib_1.__metadata("design:type", auth_base_1.User)
94
+ ], MaterialClass.prototype, "updater", void 0);
95
+ tslib_1.__decorate([
96
+ (0, typeorm_1.RelationId)((klass) => klass.updater),
97
+ tslib_1.__metadata("design:type", String)
98
+ ], MaterialClass.prototype, "updaterId", void 0);
99
+ exports.MaterialClass = MaterialClass = tslib_1.__decorate([
100
+ (0, typeorm_1.Entity)({ name: 'ops_material_class' }),
101
+ (0, typeorm_1.Index)('ix_ops_material_class_0', (klass) => [klass.domain, klass.name], { unique: true }),
102
+ (0, type_graphql_1.ObjectType)({ description: 'ISA-95 MaterialClass — a grouping of material definitions' })
103
+ ], MaterialClass);
104
+ //# sourceMappingURL=material-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-class.js","sourceRoot":"","sources":["../../../server/service/material/material-class.ts"],"names":[],"mappings":";;;;AAAA,qCASgB;AAChB,+CAAoD;AAEpD,iDAA4D;AAC5D,yDAAgD;AAEhD;;;;;;;GAOG;AAII,IAAM,aAAa,GAAnB,MAAM,aAAa;CAmEzB,CAAA;AAnEY,sCAAa;AAGf;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;yCACC;AAInB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IACzB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;sCACb,cAAM;6CAAA;AAGf;IADC,IAAA,oBAAU,EAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;;+CAClC;AAKjB;IAFC,IAAA,gBAAM,GAAE;IACR,IAAA,oBAAK,GAAE;;2CACI;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kDACN;AAKpB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAKlB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2DACb;AAK/B;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;;iDAC7C;AAKtC;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACT,IAAI;IAErB,yCAAyC;;qDAFpB;AAKrB;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACX,IAAI;mDAAA;AAInB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;gDAAA;AAIhB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;gDAAA;AAIhB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCAC9B,gBAAI;8CAAA;AAGd;IADC,IAAA,oBAAU,EAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;gDAClC;AAIlB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCAC9B,gBAAI;8CAAA;AAGd;IADC,IAAA,oBAAU,EAAC,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;gDAClC;wBAlEP,aAAa;IAHzB,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;IACtC,IAAA,eAAK,EAAC,yBAAyB,EAAE,CAAC,KAAoB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACxG,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;GAC5E,aAAa,CAmEzB","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 `MaterialClass`**.\n *\n * 「원자재」·「완제품」처럼 품목을 묶는 상위 개념이다. 레시피가 특정 품번 대신 등급으로 투입을 적을 수 있고,\n * 화면이 재고를 그 단위로 모은다.\n *\n * 구조는 인원 등급 · 설비 등급과 같다(표준이 넷을 같은 모양으로 정의한다).\n */\n@Entity({ name: 'ops_material_class' })\n@Index('ix_ops_material_class_0', (klass: MaterialClass) => [klass.domain, klass.name], { unique: true })\n@ObjectType({ description: 'ISA-95 MaterialClass — a grouping of material definitions' })\nexport class MaterialClass {\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: MaterialClass) => klass.domain)\n domainId?: string\n\n /** 표준 `MaterialClassID`. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** 상위 등급들 — 표준 `MaterialClassBaseID`(복수). 「6축 용접기」가 「용접기」를 상속한다. */\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 /** 등급 속성 — 표준 `MaterialClassProperty`. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'ResourceProperty[]' })\n properties?: 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((klass: MaterialClass) => 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: MaterialClass) => klass.updater)\n updaterId?: string\n}\n"]}
@@ -0,0 +1,45 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 품목 정의 — **ISA-95 `MaterialDefinition`**.
5
+ *
6
+ * 식별자는 **GTIN** 이다(`urn:epc:idpat:sgtin:…`). 정체성의 기준이 EPCIS 이기 때문이고, 사건과 마스터가
7
+ * 같은 이름을 써야 「이 로트가 무엇인가」를 이을 수 있다.
8
+ *
9
+ * GTIN 이 아직 없는 품목은 비워 두지 않고 사내 코드를 `name` 에 적되, **회사 프리픽스를 지어내
10
+ * GTIN 을 만들지 않는다.** 지어낸 식별자는 나중에 진짜 코드가 왔을 때 두 개가 된다.
11
+ */
12
+ export declare class MaterialDefinition {
13
+ revisionNumber?: number;
14
+ planGeneration: number;
15
+ revisionLock: number;
16
+ readonly id: string;
17
+ domain?: Domain;
18
+ domainId?: string;
19
+ /** 표준 `ID` — GTIN 이 있으면 GTIN 이다. 트윈으로 나갈 때 `materialDefinitions[].id` 가 된다. */
20
+ name: string;
21
+ description?: string;
22
+ /** 속한 등급들 — 표준 `MaterialClassID`(복수). */
23
+ materialClassIds?: string[];
24
+ /**
25
+ * 품목 속성 — 표준 `MaterialDefinitionProperty`. **환산 계수가 여기 들어간다.**
26
+ *
27
+ * 계약이 정한 이름은 `perBaseUnit` 이고, 값은 기준 단위 하나당 그 단위의 양이다.
28
+ * 한 개(EA)가 2.5 kg 이면 `{ id: 'perBaseUnit', value: 2.5, uom: 'KGM' }`.
29
+ */
30
+ properties?: Record<string, unknown>[];
31
+ /** 적격을 검증하는 `TestSpecification` 참조들 — 입고 검사가 이 모양에 맞는다. */
32
+ testSpecificationIds?: string[];
33
+ /** `TestResult` — 참조만 있으면 「무엇으로 검증한다」까지고, 결과가 있어야 적격이 성립한다. */
34
+ testResults?: Record<string, unknown>[];
35
+ /** 언제부터 이 품목을 쓰나 — 표준 `EffectiveStartDate`. 단종 예정 품목을 미리 적을 수 있다. */
36
+ effectiveStart?: Date;
37
+ /** 언제까지 — 표준 `EffectiveEndDate`. */
38
+ effectiveEnd?: Date;
39
+ createdAt?: Date;
40
+ updatedAt?: Date;
41
+ creator?: User;
42
+ creatorId?: string;
43
+ updater?: User;
44
+ updaterId?: string;
45
+ }