@things-factory/ops-master 10.1.247 → 10.1.248

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/package.json +3 -3
  2. package/dist-client/bootstrap.d.ts +0 -19
  3. package/dist-client/bootstrap.js +0 -66
  4. package/dist-client/bootstrap.js.map +0 -1
  5. package/dist-client/index.d.ts +0 -17
  6. package/dist-client/index.js +0 -21
  7. package/dist-client/index.js.map +0 -1
  8. package/dist-client/master-change-approval.d.ts +0 -14
  9. package/dist-client/master-change-approval.js +0 -36
  10. package/dist-client/master-change-approval.js.map +0 -1
  11. package/dist-client/master-change-policy-axes.d.ts +0 -37
  12. package/dist-client/master-change-policy-axes.js +0 -29
  13. package/dist-client/master-change-policy-axes.js.map +0 -1
  14. package/dist-client/master-change-policy-panel.d.ts +0 -59
  15. package/dist-client/master-change-policy-panel.js +0 -454
  16. package/dist-client/master-change-policy-panel.js.map +0 -1
  17. package/dist-client/master-change-providers.d.ts +0 -4
  18. package/dist-client/master-change-providers.js +0 -91
  19. package/dist-client/master-change-providers.js.map +0 -1
  20. package/dist-client/pages/master/applied-when-dialog.d.ts +0 -48
  21. package/dist-client/pages/master/applied-when-dialog.js +0 -137
  22. package/dist-client/pages/master/applied-when-dialog.js.map +0 -1
  23. package/dist-client/pages/master/assignment-fields.d.ts +0 -27
  24. package/dist-client/pages/master/assignment-fields.js +0 -62
  25. package/dist-client/pages/master/assignment-fields.js.map +0 -1
  26. package/dist-client/pages/master/equipment-class.d.ts +0 -12
  27. package/dist-client/pages/master/equipment-class.js +0 -42
  28. package/dist-client/pages/master/equipment-class.js.map +0 -1
  29. package/dist-client/pages/master/equipment.d.ts +0 -12
  30. package/dist-client/pages/master/equipment.js +0 -58
  31. package/dist-client/pages/master/equipment.js.map +0 -1
  32. package/dist-client/pages/master/grist-iso-duration.d.ts +0 -20
  33. package/dist-client/pages/master/grist-iso-duration.js +0 -70
  34. package/dist-client/pages/master/grist-iso-duration.js.map +0 -1
  35. package/dist-client/pages/master/grist-reference.d.ts +0 -91
  36. package/dist-client/pages/master/grist-reference.js +0 -419
  37. package/dist-client/pages/master/grist-reference.js.map +0 -1
  38. package/dist-client/pages/master/import-rows.d.ts +0 -35
  39. package/dist-client/pages/master/import-rows.js +0 -66
  40. package/dist-client/pages/master/import-rows.js.map +0 -1
  41. package/dist-client/pages/master/iso-duration.d.ts +0 -34
  42. package/dist-client/pages/master/iso-duration.js +0 -76
  43. package/dist-client/pages/master/iso-duration.js.map +0 -1
  44. package/dist-client/pages/master/master-options.d.ts +0 -40
  45. package/dist-client/pages/master/master-options.js +0 -54
  46. package/dist-client/pages/master/master-options.js.map +0 -1
  47. package/dist-client/pages/master/master-page-base.d.ts +0 -369
  48. package/dist-client/pages/master/master-page-base.js +0 -657
  49. package/dist-client/pages/master/master-page-base.js.map +0 -1
  50. package/dist-client/pages/master/material-class.d.ts +0 -12
  51. package/dist-client/pages/master/material-class.js +0 -42
  52. package/dist-client/pages/master/material-class.js.map +0 -1
  53. package/dist-client/pages/master/material-definition.d.ts +0 -5
  54. package/dist-client/pages/master/material-definition.js +0 -14
  55. package/dist-client/pages/master/material-definition.js.map +0 -1
  56. package/dist-client/pages/master/material-revision-fields.d.ts +0 -2
  57. package/dist-client/pages/master/material-revision-fields.js +0 -43
  58. package/dist-client/pages/master/material-revision-fields.js.map +0 -1
  59. package/dist-client/pages/master/operation-definition.d.ts +0 -12
  60. package/dist-client/pages/master/operation-definition.js +0 -49
  61. package/dist-client/pages/master/operation-definition.js.map +0 -1
  62. package/dist-client/pages/master/operational-location.d.ts +0 -84
  63. package/dist-client/pages/master/operational-location.js +0 -432
  64. package/dist-client/pages/master/operational-location.js.map +0 -1
  65. package/dist-client/pages/master/person.d.ts +0 -12
  66. package/dist-client/pages/master/person.js +0 -41
  67. package/dist-client/pages/master/person.js.map +0 -1
  68. package/dist-client/pages/master/personnel-class.d.ts +0 -12
  69. package/dist-client/pages/master/personnel-class.js +0 -43
  70. package/dist-client/pages/master/personnel-class.js.map +0 -1
  71. package/dist-client/pages/master/physical-asset-class.d.ts +0 -12
  72. package/dist-client/pages/master/physical-asset-class.js +0 -40
  73. package/dist-client/pages/master/physical-asset-class.js.map +0 -1
  74. package/dist-client/pages/master/physical-asset.d.ts +0 -12
  75. package/dist-client/pages/master/physical-asset.js +0 -41
  76. package/dist-client/pages/master/physical-asset.js.map +0 -1
  77. package/dist-client/pages/master/recipe-definition.d.ts +0 -5
  78. package/dist-client/pages/master/recipe-definition.js +0 -14
  79. package/dist-client/pages/master/recipe-definition.js.map +0 -1
  80. package/dist-client/pages/master/reference-targets.d.ts +0 -42
  81. package/dist-client/pages/master/reference-targets.js +0 -82
  82. package/dist-client/pages/master/reference-targets.js.map +0 -1
  83. package/dist-client/pages/master/revision-comparison.d.ts +0 -49
  84. package/dist-client/pages/master/revision-comparison.js +0 -560
  85. package/dist-client/pages/master/revision-comparison.js.map +0 -1
  86. package/dist-client/pages/master/revision-view.d.ts +0 -34
  87. package/dist-client/pages/master/revision-view.js +0 -145
  88. package/dist-client/pages/master/revision-view.js.map +0 -1
  89. package/dist-client/pages/master/revision-workspace.d.ts +0 -50
  90. package/dist-client/pages/master/revision-workspace.js +0 -763
  91. package/dist-client/pages/master/revision-workspace.js.map +0 -1
  92. package/dist-client/pages/master/route-definition.d.ts +0 -19
  93. package/dist-client/pages/master/route-definition.js +0 -40
  94. package/dist-client/pages/master/route-definition.js.map +0 -1
  95. package/dist-client/pages/master/stop-reason.d.ts +0 -12
  96. package/dist-client/pages/master/stop-reason.js +0 -48
  97. package/dist-client/pages/master/stop-reason.js.map +0 -1
  98. package/dist-client/pages/master/test-specification.d.ts +0 -5
  99. package/dist-client/pages/master/test-specification.js +0 -14
  100. package/dist-client/pages/master/test-specification.js.map +0 -1
  101. package/dist-client/pages/master-axes.d.ts +0 -24
  102. package/dist-client/pages/master-axes.js +0 -39
  103. package/dist-client/pages/master-axes.js.map +0 -1
  104. package/dist-client/route.d.ts +0 -1
  105. package/dist-client/route.js +0 -81
  106. package/dist-client/route.js.map +0 -1
  107. package/dist-client/tsconfig.tsbuildinfo +0 -1
  108. package/dist-server/index.d.ts +0 -1
  109. package/dist-server/index.js +0 -19
  110. package/dist-server/index.js.map +0 -1
  111. package/dist-server/service/ai-entry/master-entry-rules.d.ts +0 -175
  112. package/dist-server/service/ai-entry/master-entry-rules.js +0 -302
  113. package/dist-server/service/ai-entry/master-entry-rules.js.map +0 -1
  114. package/dist-server/service/ai-entry/master-entry-targets.d.ts +0 -23
  115. package/dist-server/service/ai-entry/master-entry-targets.js +0 -293
  116. package/dist-server/service/ai-entry/master-entry-targets.js.map +0 -1
  117. package/dist-server/service/approval-route.d.ts +0 -37
  118. package/dist-server/service/approval-route.js +0 -34
  119. package/dist-server/service/approval-route.js.map +0 -1
  120. package/dist-server/service/asset/asset-lifecycle.d.ts +0 -106
  121. package/dist-server/service/asset/asset-lifecycle.js +0 -126
  122. package/dist-server/service/asset/asset-lifecycle.js.map +0 -1
  123. package/dist-server/service/asset/asset-master-resolver.d.ts +0 -53
  124. package/dist-server/service/asset/asset-master-resolver.js +0 -185
  125. package/dist-server/service/asset/asset-master-resolver.js.map +0 -1
  126. package/dist-server/service/asset/asset-master.d.ts +0 -21
  127. package/dist-server/service/asset/asset-master.js +0 -25
  128. package/dist-server/service/asset/asset-master.js.map +0 -1
  129. package/dist-server/service/asset/asset-query.d.ts +0 -16
  130. package/dist-server/service/asset/asset-query.js +0 -72
  131. package/dist-server/service/asset/asset-query.js.map +0 -1
  132. package/dist-server/service/asset/index.d.ts +0 -6
  133. package/dist-server/service/asset/index.js +0 -10
  134. package/dist-server/service/asset/index.js.map +0 -1
  135. package/dist-server/service/asset/physical-asset-class.d.ts +0 -34
  136. package/dist-server/service/asset/physical-asset-class.js +0 -104
  137. package/dist-server/service/asset/physical-asset-class.js.map +0 -1
  138. package/dist-server/service/asset/physical-asset.d.ts +0 -66
  139. package/dist-server/service/asset/physical-asset.js +0 -123
  140. package/dist-server/service/asset/physical-asset.js.map +0 -1
  141. package/dist-server/service/assignment/applied-when.d.ts +0 -24
  142. package/dist-server/service/assignment/applied-when.js +0 -16
  143. package/dist-server/service/assignment/applied-when.js.map +0 -1
  144. package/dist-server/service/assignment/assignment-history.d.ts +0 -92
  145. package/dist-server/service/assignment/assignment-history.js +0 -289
  146. package/dist-server/service/assignment/assignment-history.js.map +0 -1
  147. package/dist-server/service/assignment/assignment-write.d.ts +0 -42
  148. package/dist-server/service/assignment/assignment-write.js +0 -101
  149. package/dist-server/service/assignment/assignment-write.js.map +0 -1
  150. package/dist-server/service/assignment/master-value-claim.d.ts +0 -135
  151. package/dist-server/service/assignment/master-value-claim.js +0 -174
  152. package/dist-server/service/assignment/master-value-claim.js.map +0 -1
  153. package/dist-server/service/equipment/equipment-class.d.ts +0 -34
  154. package/dist-server/service/equipment/equipment-class.js +0 -104
  155. package/dist-server/service/equipment/equipment-class.js.map +0 -1
  156. package/dist-server/service/equipment/equipment-master-resolver.d.ts +0 -77
  157. package/dist-server/service/equipment/equipment-master-resolver.js +0 -266
  158. package/dist-server/service/equipment/equipment-master-resolver.js.map +0 -1
  159. package/dist-server/service/equipment/equipment-master.d.ts +0 -30
  160. package/dist-server/service/equipment/equipment-master.js +0 -53
  161. package/dist-server/service/equipment/equipment-master.js.map +0 -1
  162. package/dist-server/service/equipment/equipment-query.d.ts +0 -16
  163. package/dist-server/service/equipment/equipment-query.js +0 -72
  164. package/dist-server/service/equipment/equipment-query.js.map +0 -1
  165. package/dist-server/service/equipment/equipment.d.ts +0 -71
  166. package/dist-server/service/equipment/equipment.js +0 -138
  167. package/dist-server/service/equipment/equipment.js.map +0 -1
  168. package/dist-server/service/equipment/index.d.ts +0 -8
  169. package/dist-server/service/equipment/index.js +0 -12
  170. package/dist-server/service/equipment/index.js.map +0 -1
  171. package/dist-server/service/equipment/state-period-rules.d.ts +0 -95
  172. package/dist-server/service/equipment/state-period-rules.js +0 -122
  173. package/dist-server/service/equipment/state-period-rules.js.map +0 -1
  174. package/dist-server/service/equipment/stop-reason-query.d.ts +0 -11
  175. package/dist-server/service/equipment/stop-reason-query.js +0 -39
  176. package/dist-server/service/equipment/stop-reason-query.js.map +0 -1
  177. package/dist-server/service/equipment/stop-reason.d.ts +0 -58
  178. package/dist-server/service/equipment/stop-reason.js +0 -114
  179. package/dist-server/service/equipment/stop-reason.js.map +0 -1
  180. package/dist-server/service/index.d.ts +0 -82
  181. package/dist-server/service/index.js +0 -145
  182. package/dist-server/service/index.js.map +0 -1
  183. package/dist-server/service/location/index.d.ts +0 -5
  184. package/dist-server/service/location/index.js +0 -9
  185. package/dist-server/service/location/index.js.map +0 -1
  186. package/dist-server/service/location/location-master-resolver.d.ts +0 -60
  187. package/dist-server/service/location/location-master-resolver.js +0 -313
  188. package/dist-server/service/location/location-master-resolver.js.map +0 -1
  189. package/dist-server/service/location/location-master.d.ts +0 -26
  190. package/dist-server/service/location/location-master.js +0 -28
  191. package/dist-server/service/location/location-master.js.map +0 -1
  192. package/dist-server/service/location/location-query.d.ts +0 -15
  193. package/dist-server/service/location/location-query.js +0 -56
  194. package/dist-server/service/location/location-query.js.map +0 -1
  195. package/dist-server/service/location/operational-location.d.ts +0 -116
  196. package/dist-server/service/location/operational-location.js +0 -157
  197. package/dist-server/service/location/operational-location.js.map +0 -1
  198. package/dist-server/service/master-axis.d.ts +0 -40
  199. package/dist-server/service/master-axis.js +0 -57
  200. package/dist-server/service/master-axis.js.map +0 -1
  201. package/dist-server/service/master-change-approval/approval-input.d.ts +0 -17
  202. package/dist-server/service/master-change-approval/approval-input.js +0 -35
  203. package/dist-server/service/master-change-approval/approval-input.js.map +0 -1
  204. package/dist-server/service/master-change-approval/builtin-axes.d.ts +0 -4
  205. package/dist-server/service/master-change-approval/builtin-axes.js +0 -96
  206. package/dist-server/service/master-change-approval/builtin-axes.js.map +0 -1
  207. package/dist-server/service/master-change-approval/index.d.ts +0 -14
  208. package/dist-server/service/master-change-approval/index.js +0 -37
  209. package/dist-server/service/master-change-approval/index.js.map +0 -1
  210. package/dist-server/service/master-change-approval/master-change-axis.d.ts +0 -54
  211. package/dist-server/service/master-change-approval/master-change-axis.js +0 -17
  212. package/dist-server/service/master-change-approval/master-change-axis.js.map +0 -1
  213. package/dist-server/service/master-change-approval/master-change-flow.d.ts +0 -65
  214. package/dist-server/service/master-change-approval/master-change-flow.js +0 -125
  215. package/dist-server/service/master-change-approval/master-change-flow.js.map +0 -1
  216. package/dist-server/service/master-change-approval/master-change-resolver.d.ts +0 -18
  217. package/dist-server/service/master-change-approval/master-change-resolver.js +0 -58
  218. package/dist-server/service/master-change-approval/master-change-resolver.js.map +0 -1
  219. package/dist-server/service/master-change-policy.d.ts +0 -122
  220. package/dist-server/service/master-change-policy.js +0 -304
  221. package/dist-server/service/master-change-policy.js.map +0 -1
  222. package/dist-server/service/master-conformance-resolver.d.ts +0 -34
  223. package/dist-server/service/master-conformance-resolver.js +0 -153
  224. package/dist-server/service/master-conformance-resolver.js.map +0 -1
  225. package/dist-server/service/master-conformance.d.ts +0 -80
  226. package/dist-server/service/master-conformance.js +0 -266
  227. package/dist-server/service/master-conformance.js.map +0 -1
  228. package/dist-server/service/master-crud.d.ts +0 -55
  229. package/dist-server/service/master-crud.js +0 -93
  230. package/dist-server/service/master-crud.js.map +0 -1
  231. package/dist-server/service/master-list.d.ts +0 -12
  232. package/dist-server/service/master-list.js +0 -30
  233. package/dist-server/service/master-list.js.map +0 -1
  234. package/dist-server/service/master-page-query.d.ts +0 -33
  235. package/dist-server/service/master-page-query.js +0 -55
  236. package/dist-server/service/master-page-query.js.map +0 -1
  237. package/dist-server/service/master-page.d.ts +0 -85
  238. package/dist-server/service/master-page.js +0 -104
  239. package/dist-server/service/master-page.js.map +0 -1
  240. package/dist-server/service/material/index.d.ts +0 -7
  241. package/dist-server/service/material/index.js +0 -12
  242. package/dist-server/service/material/index.js.map +0 -1
  243. package/dist-server/service/material/material-axis-status.d.ts +0 -8
  244. package/dist-server/service/material/material-axis-status.js +0 -19
  245. package/dist-server/service/material/material-axis-status.js.map +0 -1
  246. package/dist-server/service/material/material-class.d.ts +0 -34
  247. package/dist-server/service/material/material-class.js +0 -104
  248. package/dist-server/service/material/material-class.js.map +0 -1
  249. package/dist-server/service/material/material-definition.d.ts +0 -45
  250. package/dist-server/service/material/material-definition.js +0 -125
  251. package/dist-server/service/material/material-definition.js.map +0 -1
  252. package/dist-server/service/material/material-effective-list.d.ts +0 -39
  253. package/dist-server/service/material/material-effective-list.js +0 -54
  254. package/dist-server/service/material/material-effective-list.js.map +0 -1
  255. package/dist-server/service/material/material-master-resolver.d.ts +0 -106
  256. package/dist-server/service/material/material-master-resolver.js +0 -351
  257. package/dist-server/service/material/material-master-resolver.js.map +0 -1
  258. package/dist-server/service/material/material-master.d.ts +0 -9
  259. package/dist-server/service/material/material-master.js +0 -24
  260. package/dist-server/service/material/material-master.js.map +0 -1
  261. package/dist-server/service/material/material-query.d.ts +0 -16
  262. package/dist-server/service/material/material-query.js +0 -79
  263. package/dist-server/service/material/material-query.js.map +0 -1
  264. package/dist-server/service/material/material-revision-content.d.ts +0 -10
  265. package/dist-server/service/material/material-revision-content.js +0 -92
  266. package/dist-server/service/material/material-revision-content.js.map +0 -1
  267. package/dist-server/service/material/material-revision-resolver.d.ts +0 -60
  268. package/dist-server/service/material/material-revision-resolver.js +0 -96
  269. package/dist-server/service/material/material-revision-resolver.js.map +0 -1
  270. package/dist-server/service/material/material-revision-service.d.ts +0 -179
  271. package/dist-server/service/material/material-revision-service.js +0 -687
  272. package/dist-server/service/material/material-revision-service.js.map +0 -1
  273. package/dist-server/service/material/material-revision.d.ts +0 -86
  274. package/dist-server/service/material/material-revision.js +0 -339
  275. package/dist-server/service/material/material-revision.js.map +0 -1
  276. package/dist-server/service/material/recipe-index.d.ts +0 -23
  277. package/dist-server/service/material/recipe-index.js +0 -44
  278. package/dist-server/service/material/recipe-index.js.map +0 -1
  279. package/dist-server/service/operation/index.d.ts +0 -6
  280. package/dist-server/service/operation/index.js +0 -10
  281. package/dist-server/service/operation/index.js.map +0 -1
  282. package/dist-server/service/operation/operation-definition.d.ts +0 -52
  283. package/dist-server/service/operation/operation-definition.js +0 -143
  284. package/dist-server/service/operation/operation-definition.js.map +0 -1
  285. package/dist-server/service/operation/operation-master-resolver.d.ts +0 -52
  286. package/dist-server/service/operation/operation-master-resolver.js +0 -187
  287. package/dist-server/service/operation/operation-master-resolver.js.map +0 -1
  288. package/dist-server/service/operation/operation-master.d.ts +0 -21
  289. package/dist-server/service/operation/operation-master.js +0 -28
  290. package/dist-server/service/operation/operation-master.js.map +0 -1
  291. package/dist-server/service/operation/operation-query.d.ts +0 -15
  292. package/dist-server/service/operation/operation-query.js +0 -56
  293. package/dist-server/service/operation/operation-query.js.map +0 -1
  294. package/dist-server/service/operation/operation-readiness-resolver.d.ts +0 -39
  295. package/dist-server/service/operation/operation-readiness-resolver.js +0 -111
  296. package/dist-server/service/operation/operation-readiness-resolver.js.map +0 -1
  297. package/dist-server/service/operation/operation-readiness.d.ts +0 -34
  298. package/dist-server/service/operation/operation-readiness.js +0 -133
  299. package/dist-server/service/operation/operation-readiness.js.map +0 -1
  300. package/dist-server/service/personnel/index.d.ts +0 -6
  301. package/dist-server/service/personnel/index.js +0 -10
  302. package/dist-server/service/personnel/index.js.map +0 -1
  303. package/dist-server/service/personnel/person.d.ts +0 -51
  304. package/dist-server/service/personnel/person.js +0 -119
  305. package/dist-server/service/personnel/person.js.map +0 -1
  306. package/dist-server/service/personnel/personnel-class-readiness.d.ts +0 -22
  307. package/dist-server/service/personnel/personnel-class-readiness.js +0 -98
  308. package/dist-server/service/personnel/personnel-class-readiness.js.map +0 -1
  309. package/dist-server/service/personnel/personnel-class.d.ts +0 -54
  310. package/dist-server/service/personnel/personnel-class.js +0 -114
  311. package/dist-server/service/personnel/personnel-class.js.map +0 -1
  312. package/dist-server/service/personnel/personnel-master-resolver.d.ts +0 -53
  313. package/dist-server/service/personnel/personnel-master-resolver.js +0 -187
  314. package/dist-server/service/personnel/personnel-master-resolver.js.map +0 -1
  315. package/dist-server/service/personnel/personnel-master.d.ts +0 -39
  316. package/dist-server/service/personnel/personnel-master.js +0 -34
  317. package/dist-server/service/personnel/personnel-master.js.map +0 -1
  318. package/dist-server/service/personnel/personnel-query.d.ts +0 -29
  319. package/dist-server/service/personnel/personnel-query.js +0 -79
  320. package/dist-server/service/personnel/personnel-query.js.map +0 -1
  321. package/dist-server/service/personnel/qualification.d.ts +0 -104
  322. package/dist-server/service/personnel/qualification.js +0 -147
  323. package/dist-server/service/personnel/qualification.js.map +0 -1
  324. package/dist-server/service/quality/index.d.ts +0 -4
  325. package/dist-server/service/quality/index.js +0 -8
  326. package/dist-server/service/quality/index.js.map +0 -1
  327. package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +0 -12
  328. package/dist-server/service/quality/nonconformance-cause-resolver.js +0 -60
  329. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +0 -1
  330. package/dist-server/service/quality/nonconformance-cause.d.ts +0 -20
  331. package/dist-server/service/quality/nonconformance-cause.js +0 -90
  332. package/dist-server/service/quality/nonconformance-cause.js.map +0 -1
  333. package/dist-server/service/recipe/index.d.ts +0 -10
  334. package/dist-server/service/recipe/index.js +0 -16
  335. package/dist-server/service/recipe/index.js.map +0 -1
  336. package/dist-server/service/recipe/recipe-definition.d.ts +0 -75
  337. package/dist-server/service/recipe/recipe-definition.js +0 -143
  338. package/dist-server/service/recipe/recipe-definition.js.map +0 -1
  339. package/dist-server/service/recipe/recipe-effective-list.d.ts +0 -49
  340. package/dist-server/service/recipe/recipe-effective-list.js +0 -96
  341. package/dist-server/service/recipe/recipe-effective-list.js.map +0 -1
  342. package/dist-server/service/recipe/recipe-master-resolver.d.ts +0 -28
  343. package/dist-server/service/recipe/recipe-master-resolver.js +0 -128
  344. package/dist-server/service/recipe/recipe-master-resolver.js.map +0 -1
  345. package/dist-server/service/recipe/recipe-master.d.ts +0 -37
  346. package/dist-server/service/recipe/recipe-master.js +0 -47
  347. package/dist-server/service/recipe/recipe-master.js.map +0 -1
  348. package/dist-server/service/recipe/recipe-query.d.ts +0 -21
  349. package/dist-server/service/recipe/recipe-query.js +0 -82
  350. package/dist-server/service/recipe/recipe-query.js.map +0 -1
  351. package/dist-server/service/recipe/recipe-revision-content.d.ts +0 -32
  352. package/dist-server/service/recipe/recipe-revision-content.js +0 -70
  353. package/dist-server/service/recipe/recipe-revision-content.js.map +0 -1
  354. package/dist-server/service/recipe/recipe-revision-line.d.ts +0 -30
  355. package/dist-server/service/recipe/recipe-revision-line.js +0 -95
  356. package/dist-server/service/recipe/recipe-revision-line.js.map +0 -1
  357. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +0 -65
  358. package/dist-server/service/recipe/recipe-revision-resolver.js +0 -96
  359. package/dist-server/service/recipe/recipe-revision-resolver.js.map +0 -1
  360. package/dist-server/service/recipe/recipe-revision-service.d.ts +0 -183
  361. package/dist-server/service/recipe/recipe-revision-service.js +0 -754
  362. package/dist-server/service/recipe/recipe-revision-service.js.map +0 -1
  363. package/dist-server/service/recipe/recipe-revision.d.ts +0 -102
  364. package/dist-server/service/recipe/recipe-revision.js +0 -373
  365. package/dist-server/service/recipe/recipe-revision.js.map +0 -1
  366. package/dist-server/service/recipe/route-definition.d.ts +0 -51
  367. package/dist-server/service/recipe/route-definition.js +0 -114
  368. package/dist-server/service/recipe/route-definition.js.map +0 -1
  369. package/dist-server/service/resource/class-lineage.d.ts +0 -46
  370. package/dist-server/service/resource/class-lineage.js +0 -80
  371. package/dist-server/service/resource/class-lineage.js.map +0 -1
  372. package/dist-server/service/resource/class-members.d.ts +0 -36
  373. package/dist-server/service/resource/class-members.js +0 -59
  374. package/dist-server/service/resource/class-members.js.map +0 -1
  375. package/dist-server/service/resource/referrers.d.ts +0 -54
  376. package/dist-server/service/resource/referrers.js +0 -99
  377. package/dist-server/service/resource/referrers.js.map +0 -1
  378. package/dist-server/service/resource/resource-class.d.ts +0 -25
  379. package/dist-server/service/resource/resource-class.js +0 -29
  380. package/dist-server/service/resource/resource-class.js.map +0 -1
  381. package/dist-server/service/revision-baseline.d.ts +0 -71
  382. package/dist-server/service/revision-baseline.js +0 -87
  383. package/dist-server/service/revision-baseline.js.map +0 -1
  384. package/dist-server/service/row-lock.d.ts +0 -22
  385. package/dist-server/service/row-lock.js +0 -31
  386. package/dist-server/service/row-lock.js.map +0 -1
  387. package/dist-server/service/status/axis-stamp.d.ts +0 -16
  388. package/dist-server/service/status/axis-stamp.js +0 -22
  389. package/dist-server/service/status/axis-stamp.js.map +0 -1
  390. package/dist-server/service/status/index.d.ts +0 -3
  391. package/dist-server/service/status/index.js +0 -7
  392. package/dist-server/service/status/index.js.map +0 -1
  393. package/dist-server/service/status/master-status.d.ts +0 -38
  394. package/dist-server/service/status/master-status.js +0 -129
  395. package/dist-server/service/status/master-status.js.map +0 -1
  396. package/dist-server/service/test-spec/criteria-check.d.ts +0 -53
  397. package/dist-server/service/test-spec/criteria-check.js +0 -142
  398. package/dist-server/service/test-spec/criteria-check.js.map +0 -1
  399. package/dist-server/service/test-spec/criteria-rows.d.ts +0 -89
  400. package/dist-server/service/test-spec/criteria-rows.js +0 -139
  401. package/dist-server/service/test-spec/criteria-rows.js.map +0 -1
  402. package/dist-server/service/test-spec/index.d.ts +0 -6
  403. package/dist-server/service/test-spec/index.js +0 -11
  404. package/dist-server/service/test-spec/index.js.map +0 -1
  405. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +0 -34
  406. package/dist-server/service/test-spec/test-spec-effective-list.js +0 -42
  407. package/dist-server/service/test-spec/test-spec-effective-list.js.map +0 -1
  408. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +0 -44
  409. package/dist-server/service/test-spec/test-spec-master-resolver.js +0 -144
  410. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +0 -1
  411. package/dist-server/service/test-spec/test-spec-master.d.ts +0 -6
  412. package/dist-server/service/test-spec/test-spec-master.js +0 -18
  413. package/dist-server/service/test-spec/test-spec-master.js.map +0 -1
  414. package/dist-server/service/test-spec/test-spec-query.d.ts +0 -15
  415. package/dist-server/service/test-spec/test-spec-query.js +0 -61
  416. package/dist-server/service/test-spec/test-spec-query.js.map +0 -1
  417. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +0 -59
  418. package/dist-server/service/test-spec/test-spec-revision-resolver.js +0 -96
  419. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +0 -1
  420. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +0 -178
  421. package/dist-server/service/test-spec/test-spec-revision-service.js +0 -685
  422. package/dist-server/service/test-spec/test-spec-revision-service.js.map +0 -1
  423. package/dist-server/service/test-spec/test-spec-revision.d.ts +0 -86
  424. package/dist-server/service/test-spec/test-spec-revision.js +0 -334
  425. package/dist-server/service/test-spec/test-spec-revision.js.map +0 -1
  426. package/dist-server/service/test-spec/test-specification.d.ts +0 -47
  427. package/dist-server/service/test-spec/test-specification.js +0 -119
  428. package/dist-server/service/test-spec/test-specification.js.map +0 -1
  429. package/dist-server/tsconfig.tsbuildinfo +0 -1
@@ -1,313 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.OperationalLocationResolver = exports.OperationalLocationList = void 0;
4
- const tslib_1 = require("tslib");
5
- const type_graphql_1 = require("type-graphql");
6
- const applied_when_1 = require("../assignment/applied-when");
7
- const shell_1 = require("@things-factory/shell");
8
- const type_graphql_2 = require("type-graphql");
9
- const shell_2 = require("@things-factory/shell");
10
- const master_crud_1 = require("../master-crud");
11
- const master_axis_1 = require("../master-axis");
12
- const master_list_1 = require("../master-list");
13
- const operational_location_1 = require("./operational-location");
14
- const person_1 = require("../personnel/person");
15
- const equipment_1 = require("../equipment/equipment");
16
- const physical_asset_1 = require("../asset/physical-asset");
17
- const referrers_1 = require("../resource/referrers");
18
- /**
19
- * 자리 축을 채우고 고친다.
20
- *
21
- * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
22
- * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
23
- * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
24
- * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
25
- *
26
- * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
27
- */
28
- let OperationalLocationList = class OperationalLocationList {
29
- };
30
- exports.OperationalLocationList = OperationalLocationList;
31
- tslib_1.__decorate([
32
- (0, type_graphql_2.Field)(type => [operational_location_1.OperationalLocation]),
33
- tslib_1.__metadata("design:type", Array)
34
- ], OperationalLocationList.prototype, "items", void 0);
35
- tslib_1.__decorate([
36
- (0, type_graphql_2.Field)(type => type_graphql_2.Int),
37
- tslib_1.__metadata("design:type", Number)
38
- ], OperationalLocationList.prototype, "total", void 0);
39
- exports.OperationalLocationList = OperationalLocationList = tslib_1.__decorate([
40
- (0, type_graphql_2.ObjectType)({ description: 'A page of operational locations' })
41
- ], OperationalLocationList);
42
- /**
43
- * 「바로 아래에 몇이 있나」를 세는 곳.
44
- *
45
- * ── 물어본 요청만 센다 ──────────────────────────────────────────────────────
46
- * 처음에는 목록 리졸버가 늘 세게 했다. 그러면 **개수를 쓰지 않는 조회도 값을 치른다** — 고르기 팝업,
47
- * 자동완성, 다른 화면의 목록까지 전부. 로케이션 목록은 여러 곳에서 부른다.
48
- *
49
- * 그래서 `childCount` 를 필드 리졸버로 둔다. GraphQL 이 **물어본 요청에만** 이것을 부르므로, 안 묻는
50
- * 조회는 질의가 한 번뿐이다. 「이 목록은 개수가 필요하다/아니다」를 서버 쪽에 플래그로 두지 않아도
51
- * 된다 — 묻는 것이 곧 그 표시다.
52
- *
53
- * ── 물었으면 한 번에 센다 ───────────────────────────────────────────────────
54
- * 필드 리졸버는 줄마다 불린다. 거기서 그때그때 세면 `limit 20` 에 카운트 20회, 100 이면 100회다 —
55
- * N+1 이다.
56
- *
57
- * 그래서 목록 리졸버가 그 페이지를 요청에 남겨 두고(`locationPage`), 첫 줄이 물을 때 **페이지 전체를
58
- * 한 번에** 세어 요청 안에 담아 둔다. 담는 것은 **결과가 아니라 약속(Promise)** 이다 — 줄들이 거의
59
- * 동시에 묻기 때문에, 결과를 담으면 스무 개가 각자 질의를 띄운 뒤에야 채워진다.
60
- *
61
- * SELECT parent_id, COUNT(1) … WHERE domain = ? AND parent_id IN (…) GROUP BY parent_id
62
- *
63
- * `IN` 에 들어가는 것은 그 페이지의 아이디와 이름뿐이라 표 전체 크기와 무관하다.
64
- * `ix_ops_operational_location_1`(도메인 · 상위)이 이 질의를 받는다.
65
- *
66
- * ── 상위를 두 가지로 찾는다 ──────────────────────────────────────────────────
67
- * `parentId` 는 외래 키가 아니라 문자열이라 쓰는 쪽이 정한다. 지금 데이터는 아이디가 아니라 **이름**을
68
- * 담고 있다(`LINE-1` 의 상위가 `PLANT-1`). 한쪽만 보면 개수가 오류 보고 없이 0 이 된다.
69
- */
70
- async function countChildren(locations, domain) {
71
- const keys = [...new Set(locations.flatMap(location => [location.id, location.name]).filter(Boolean))];
72
- if (!keys.length)
73
- return new Map();
74
- const counted = await (0, shell_2.getRepository)(operational_location_1.OperationalLocation)
75
- .createQueryBuilder('location')
76
- .select('location.parentId', 'parentId')
77
- .addSelect('COUNT(1)', 'count')
78
- .where('location.domain = :domain', { domain: domain.id })
79
- .andWhere('location.parentId IN (:...keys)', { keys })
80
- .groupBy('location.parentId')
81
- .getRawMany();
82
- return new Map(counted.map(row => [row.parentId, Number(row.count)]));
83
- }
84
- /**
85
- * 아이디로 적힌 자식과 이름으로 적힌 자식을 **더한다.**
86
- *
87
- * 같은 자식이 두 규약으로 중복 등록돼 있으면 개수가 부풀 수 있다. 그런 데이터는 이미 결함이지만, 여기서
88
- * 한쪽을 조용히 버리지는 않는다 — 버리면 어느 쪽이 빠졌는지 아무도 모른다.
89
- */
90
- function sumFor(location, counted) {
91
- return (counted.get(location.id) || 0) + (location.name ? counted.get(location.name) || 0 : 0);
92
- }
93
- /**
94
- * **이 자리에 무엇이 있나** — 들어오는 관계.
95
- *
96
- * ── 왜 필요한가 ────────────────────────────────────────────────────────────
97
- * 자리 하나를 열어도 「여기서 누가 일하나 · 무슨 설비가 있나」를 알 수 없었다. 사람 화면을 열어
98
- * 근무 자리로 걸러야 했고, 설비는 또 설비 화면에서 같은 일을 해야 했다. 다른 화면의 참조 칸을
99
- * 눌러 자리로 걸어 들어와도 그 자리가 무엇인지는 이름뿐이었다.
100
- *
101
- * ── 줄마다 세지 않는다 ─────────────────────────────────────────────────────
102
- * `childCount` 와 같은 방식이다. 목록 리졸버가 그 페이지를 요청에 남겨 두고, 첫 줄이 물을 때
103
- * **페이지 전체를 한 번에** 묻는다. 담는 것은 결과가 아니라 **약속**이다 — 줄들이 거의 동시에
104
- * 물으므로 결과를 담으면 스무 개가 각자 질의를 띄운다.
105
- *
106
- * ── 자리를 두 가지로 찾는다 ────────────────────────────────────────────────
107
- * `homeLocation` 은 외래 키가 아니라 문자열이라 쓰는 쪽이 정한다. 지금 자료는 **이름**을 담는다
108
- * (`P-ECU-S-0001` 의 근무 자리가 `ECU-SUB-01`). 아이디도 함께 넣어 묻는다 — 한쪽만 보면 목록이
109
- * 오류 보고 없이 빈다. `childCount` 가 같은 이유로 그렇게 한다.
110
- */
111
- /** 한 자리에 보일 이름 수. 넘치면 몇이 남았는지 함께 낸다. */
112
- const OCCUPANT_SHOWN = 8;
113
- async function scanOccupants(locations, domain) {
114
- const keys = [...new Set(locations.flatMap(one => [one.id, one.name]).filter(Boolean))];
115
- if (keys.length === 0) {
116
- return { staff: new Map(), equipment: new Map(), assets: new Map() };
117
- }
118
- const of = async (Entity) => {
119
- const rows = await (0, shell_2.getRepository)(Entity)
120
- .createQueryBuilder('row')
121
- .select(['row.id', 'row.name', 'row.homeLocation'])
122
- .where('row.domain_id = :domain', { domain: domain.id })
123
- .andWhere('row.home_location IN (:...keys)', { keys })
124
- .getMany();
125
- return (0, referrers_1.indexReferrers)(rows.map(one => ({ points: one.homeLocation, name: one.name })));
126
- };
127
- const [staff, equipment, assets] = await Promise.all([of(person_1.Person), of(equipment_1.Equipment), of(physical_asset_1.PhysicalAsset)]);
128
- return { staff, equipment, assets };
129
- }
130
- /**
131
- * 이 줄의 답을 낸다.
132
- *
133
- * **페이지에 없으면 그 줄만 따로 묻는다.** 한 요청에 목록 조회가 둘 있으면 뒤엣것이 앞엣것의
134
- * 페이지를 덮어쓰고, 그때 남는 줄들이 「아무도 없다」로 나온다 — 자리가 비어 있는 것과 못 본 것이
135
- * 같아 보인다. 들어오는 관계는 **비어 있는 것이 기본**이라 이 거짓말이 특히 안 띈다.
136
- * 틀린 목록보다 질의 한 번이 낫다. `childCount` 가 같은 이유로 같은 자리를 둔다.
137
- */
138
- async function occupantsOf(location, context) {
139
- const state = context.state;
140
- const page = state.locationPage;
141
- const inPage = !!page?.some(one => one.id === location.id);
142
- if (!inPage) {
143
- return scanOccupants([location], state.domain);
144
- }
145
- /* 요청 안에서 한 번만 훑는다. 약속을 담는다. */
146
- state.occupantScan = state.occupantScan || scanOccupants(page, state.domain);
147
- return state.occupantScan;
148
- }
149
- /**
150
- * 한 자리의 이름들을 낸다 — 아이디로도 이름으로도 걸린 것을 합친다.
151
- *
152
- * 자료가 어느 쪽으로 적혔는지 자리마다 다를 수 있어 둘 다 본다. 합칠 때 겹치는 것은 한 번만 센다.
153
- */
154
- function namesAt(index, location) {
155
- const found = [...(index.get(location.id) ?? []), ...(index.get(location.name) ?? [])];
156
- return [...new Set(found)].sort();
157
- }
158
- let OperationalLocationResolver = class OperationalLocationResolver {
159
- async operationalLocations(params, context) {
160
- const { domain } = context.state;
161
- const { items, total } = await (0, master_list_1.listMaster)('operationalLocation', params, domain);
162
- const locations = items;
163
- /*
164
- * 여기서 개수를 세지 않는다. 이 페이지만 요청에 남겨 둔다 — `childCount` 를 **물어본 요청**이
165
- * 있으면 그 리졸버가 이것을 보고 한 번에 센다(위 머리말).
166
- */
167
- context.state.locationPage = locations;
168
- return { items: locations, total };
169
- }
170
- /**
171
- * 이 자리 바로 아래에 몇이 있나.
172
- *
173
- * 계층을 한 단씩 걷는 화면이 이 값으로 「그 줄에 들어갈 것이 있나」를 말한다. 아이콘만으로는 그것을
174
- * 말하지 못한다 — 눌러 보기 전에는 안에 무엇이 있는지, 있기는 한지 알 수 없다.
175
- *
176
- * 세는 방식과 값은 `countChildren` 머리말에 적었다.
177
- */
178
- /**
179
- * 여기서 일하는 사람들.
180
- *
181
- * **넘치면 몇이 남았는지 말한다**(`occupantOverflow`). 조용히 자르면 「셋이 있다」와 「서른이
182
- * 있는데 셋만 보인다」가 같아 보이고, 그 칸을 보고 사람이 판단을 내린다.
183
- *
184
- * 아무도 없으면 빈 목록이다 — 없는 것은 없다고 낸다.
185
- */
186
- async staff(location, context) {
187
- return (0, referrers_1.cappedList)(namesAt((await occupantsOf(location, context)).staff, location), OCCUPANT_SHOWN).shown;
188
- }
189
- /** 여기 있는 설비들. */
190
- async equipmentHere(location, context) {
191
- return (0, referrers_1.cappedList)(namesAt((await occupantsOf(location, context)).equipment, location), OCCUPANT_SHOWN).shown;
192
- }
193
- /** 여기 있는 자산들 — 공구 · 지그처럼 옮겨 다니는 것. */
194
- async assetsHere(location, context) {
195
- return (0, referrers_1.cappedList)(namesAt((await occupantsOf(location, context)).assets, location), OCCUPANT_SHOWN).shown;
196
- }
197
- /**
198
- * 위 세 칸에서 **안 보인 것이 몇인가.**
199
- *
200
- * 셋을 합쳐 하나로 낸다. 칸마다 따로 두면 화면이 숫자 셋을 더 들고 있어야 하는데, 사람이 알고
201
- * 싶은 것은 「이 자리에 더 있나」 하나다.
202
- */
203
- async occupantOverflow(location, context) {
204
- const scan = await occupantsOf(location, context);
205
- return ((0, referrers_1.cappedList)(namesAt(scan.staff, location), OCCUPANT_SHOWN).hidden +
206
- (0, referrers_1.cappedList)(namesAt(scan.equipment, location), OCCUPANT_SHOWN).hidden +
207
- (0, referrers_1.cappedList)(namesAt(scan.assets, location), OCCUPANT_SHOWN).hidden);
208
- }
209
- async childCount(location, context) {
210
- const { domain, locationPage } = context.state;
211
- const page = locationPage;
212
- const inPage = !!page?.some(one => one.id === location.id);
213
- /*
214
- * 목록 조회가 남긴 페이지에 없으면 그 줄만 센다.
215
- *
216
- * 한 요청에 목록 조회가 둘 있으면 뒤엣것이 앞엣것의 페이지를 덮어쓴다. 그때 남는 줄들을 조용히 0 으로
217
- * 두지 않는다 — 틀린 개수보다 질의 한 번이 낫다.
218
- */
219
- if (!inPage) {
220
- const counted = await countChildren([location], domain);
221
- return sumFor(location, counted);
222
- }
223
- /*
224
- * 요청 안에서 한 번만 센다. **약속을 담는다** — 줄들이 거의 동시에 묻기 때문에 결과를 담으면
225
- * 스무 개가 각자 질의를 띄운다.
226
- */
227
- const state = context.state;
228
- state.locationChildCounts = state.locationChildCounts || countChildren(page, domain);
229
- return sumFor(location, await state.locationChildCounts);
230
- }
231
- /**
232
- * 그리드가 보낸 변경을 한 번에 적용한다.
233
- *
234
- * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
235
- * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
236
- * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
237
- */
238
- async updateMultipleOperationalLocation(patches, context, applied) {
239
- const { domain, user, tx } = context.state;
240
- const axis = (0, master_axis_1.masterAxisOf)('operationalLocation');
241
- const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
242
- hasEffectivePeriod: axis.hasEffectivePeriod,
243
- ...(0, applied_when_1.appliedOptions)(applied)
244
- });
245
- return saved;
246
- }
247
- };
248
- exports.OperationalLocationResolver = OperationalLocationResolver;
249
- tslib_1.__decorate([
250
- (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
251
- (0, type_graphql_2.Query)(returns => OperationalLocationList, { description: 'To fetch operational locations' }),
252
- tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
253
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
254
- tslib_1.__metadata("design:type", Function),
255
- tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
256
- tslib_1.__metadata("design:returntype", Promise)
257
- ], OperationalLocationResolver.prototype, "operationalLocations", null);
258
- tslib_1.__decorate([
259
- (0, type_graphql_2.FieldResolver)(type => [String], { description: 'People whose home location is here' }),
260
- tslib_1.__param(0, (0, type_graphql_2.Root)()),
261
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
262
- tslib_1.__metadata("design:type", Function),
263
- tslib_1.__metadata("design:paramtypes", [operational_location_1.OperationalLocation, Object]),
264
- tslib_1.__metadata("design:returntype", Promise)
265
- ], OperationalLocationResolver.prototype, "staff", null);
266
- tslib_1.__decorate([
267
- (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Equipment stationed here' }),
268
- tslib_1.__param(0, (0, type_graphql_2.Root)()),
269
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
270
- tslib_1.__metadata("design:type", Function),
271
- tslib_1.__metadata("design:paramtypes", [operational_location_1.OperationalLocation, Object]),
272
- tslib_1.__metadata("design:returntype", Promise)
273
- ], OperationalLocationResolver.prototype, "equipmentHere", null);
274
- tslib_1.__decorate([
275
- (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Physical assets kept here' }),
276
- tslib_1.__param(0, (0, type_graphql_2.Root)()),
277
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
278
- tslib_1.__metadata("design:type", Function),
279
- tslib_1.__metadata("design:paramtypes", [operational_location_1.OperationalLocation, Object]),
280
- tslib_1.__metadata("design:returntype", Promise)
281
- ], OperationalLocationResolver.prototype, "assetsHere", null);
282
- tslib_1.__decorate([
283
- (0, type_graphql_2.FieldResolver)(type => type_graphql_2.Int, { description: 'How many occupants are not shown in the lists above' }),
284
- tslib_1.__param(0, (0, type_graphql_2.Root)()),
285
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
286
- tslib_1.__metadata("design:type", Function),
287
- tslib_1.__metadata("design:paramtypes", [operational_location_1.OperationalLocation, Object]),
288
- tslib_1.__metadata("design:returntype", Promise)
289
- ], OperationalLocationResolver.prototype, "occupantOverflow", null);
290
- tslib_1.__decorate([
291
- (0, type_graphql_2.FieldResolver)(type => type_graphql_2.Int, { description: 'How many locations sit directly under this one' }),
292
- tslib_1.__param(0, (0, type_graphql_2.Root)()),
293
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
294
- tslib_1.__metadata("design:type", Function),
295
- tslib_1.__metadata("design:paramtypes", [operational_location_1.OperationalLocation, Object]),
296
- tslib_1.__metadata("design:returntype", Promise)
297
- ], OperationalLocationResolver.prototype, "childCount", null);
298
- tslib_1.__decorate([
299
- (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
300
- (0, type_graphql_2.Directive)('@transaction'),
301
- (0, type_graphql_2.Mutation)(returns => [operational_location_1.OperationalLocation], { description: 'To create, change or retire operational locations' }),
302
- tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
303
- tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
304
- tslib_1.__param(2, (0, type_graphql_2.Arg)('applied', type => shell_2.ScalarObject, { nullable: true })),
305
- tslib_1.__metadata("design:type", Function),
306
- tslib_1.__metadata("design:paramtypes", [Array, Object, Object]),
307
- tslib_1.__metadata("design:returntype", Promise)
308
- ], OperationalLocationResolver.prototype, "updateMultipleOperationalLocation", null);
309
- exports.OperationalLocationResolver = OperationalLocationResolver = tslib_1.__decorate([
310
- (0, type_graphql_2.Resolver)(operational_location_1.OperationalLocation),
311
- (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
312
- ], OperationalLocationResolver);
313
- //# sourceMappingURL=location-master-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"location-master-resolver.js","sourceRoot":"","sources":["../../../server/service/location/location-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { AppliedWhen, appliedOptions } from '../assignment/applied-when'\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 { OperationalLocation } from './operational-location'\nimport { Person } from '../personnel/person'\nimport { Equipment } from '../equipment/equipment'\nimport { PhysicalAsset } from '../asset/physical-asset'\nimport { cappedList, indexReferrers } from '../resource/referrers'\n\n/**\n * 자리 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of operational locations' })\nexport class OperationalLocationList {\n @Field(type => [OperationalLocation])\n items: OperationalLocation[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * 「바로 아래에 몇이 있나」를 세는 곳.\n *\n * ── 물어본 요청만 센다 ──────────────────────────────────────────────────────\n * 처음에는 목록 리졸버가 늘 세게 했다. 그러면 **개수를 쓰지 않는 조회도 값을 치른다** — 고르기 팝업,\n * 자동완성, 다른 화면의 목록까지 전부. 로케이션 목록은 여러 곳에서 부른다.\n *\n * 그래서 `childCount` 를 필드 리졸버로 둔다. GraphQL 이 **물어본 요청에만** 이것을 부르므로, 안 묻는\n * 조회는 질의가 한 번뿐이다. 「이 목록은 개수가 필요하다/아니다」를 서버 쪽에 플래그로 두지 않아도\n * 된다 — 묻는 것이 곧 그 표시다.\n *\n * ── 물었으면 한 번에 센다 ───────────────────────────────────────────────────\n * 필드 리졸버는 줄마다 불린다. 거기서 그때그때 세면 `limit 20` 에 카운트 20회, 100 이면 100회다 —\n * N+1 이다.\n *\n * 그래서 목록 리졸버가 그 페이지를 요청에 남겨 두고(`locationPage`), 첫 줄이 물을 때 **페이지 전체를\n * 한 번에** 세어 요청 안에 담아 둔다. 담는 것은 **결과가 아니라 약속(Promise)** 이다 — 줄들이 거의\n * 동시에 묻기 때문에, 결과를 담으면 스무 개가 각자 질의를 띄운 뒤에야 채워진다.\n *\n * SELECT parent_id, COUNT(1) … WHERE domain = ? AND parent_id IN (…) GROUP BY parent_id\n *\n * `IN` 에 들어가는 것은 그 페이지의 아이디와 이름뿐이라 표 전체 크기와 무관하다.\n * `ix_ops_operational_location_1`(도메인 · 상위)이 이 질의를 받는다.\n *\n * ── 상위를 두 가지로 찾는다 ──────────────────────────────────────────────────\n * `parentId` 는 외래 키가 아니라 문자열이라 쓰는 쪽이 정한다. 지금 데이터는 아이디가 아니라 **이름**을\n * 담고 있다(`LINE-1` 의 상위가 `PLANT-1`). 한쪽만 보면 개수가 오류 보고 없이 0 이 된다.\n */\nasync function countChildren(locations: OperationalLocation[], domain: Domain): Promise<Map<string, number>> {\n const keys = [...new Set(locations.flatMap(location => [location.id, location.name]).filter(Boolean))]\n\n if (!keys.length) return new Map()\n\n const counted = await getRepository(OperationalLocation)\n .createQueryBuilder('location')\n .select('location.parentId', 'parentId')\n .addSelect('COUNT(1)', 'count')\n .where('location.domain = :domain', { domain: domain.id })\n .andWhere('location.parentId IN (:...keys)', { keys })\n .groupBy('location.parentId')\n .getRawMany()\n\n return new Map<string, number>(counted.map(row => [row.parentId, Number(row.count)]))\n}\n\n/**\n * 아이디로 적힌 자식과 이름으로 적힌 자식을 **더한다.**\n *\n * 같은 자식이 두 규약으로 중복 등록돼 있으면 개수가 부풀 수 있다. 그런 데이터는 이미 결함이지만, 여기서\n * 한쪽을 조용히 버리지는 않는다 — 버리면 어느 쪽이 빠졌는지 아무도 모른다.\n */\nfunction sumFor(location: OperationalLocation, counted: Map<string, number>): number {\n return (counted.get(location.id) || 0) + (location.name ? counted.get(location.name) || 0 : 0)\n}\n\n/**\n * **이 자리에 무엇이 있나** — 들어오는 관계.\n *\n * ── 왜 필요한가 ────────────────────────────────────────────────────────────\n * 자리 하나를 열어도 「여기서 누가 일하나 · 무슨 설비가 있나」를 알 수 없었다. 사람 화면을 열어\n * 근무 자리로 걸러야 했고, 설비는 또 설비 화면에서 같은 일을 해야 했다. 다른 화면의 참조 칸을\n * 눌러 자리로 걸어 들어와도 그 자리가 무엇인지는 이름뿐이었다.\n *\n * ── 줄마다 세지 않는다 ─────────────────────────────────────────────────────\n * `childCount` 와 같은 방식이다. 목록 리졸버가 그 페이지를 요청에 남겨 두고, 첫 줄이 물을 때\n * **페이지 전체를 한 번에** 묻는다. 담는 것은 결과가 아니라 **약속**이다 — 줄들이 거의 동시에\n * 물으므로 결과를 담으면 스무 개가 각자 질의를 띄운다.\n *\n * ── 자리를 두 가지로 찾는다 ────────────────────────────────────────────────\n * `homeLocation` 은 외래 키가 아니라 문자열이라 쓰는 쪽이 정한다. 지금 자료는 **이름**을 담는다\n * (`P-ECU-S-0001` 의 근무 자리가 `ECU-SUB-01`). 아이디도 함께 넣어 묻는다 — 한쪽만 보면 목록이\n * 오류 보고 없이 빈다. `childCount` 가 같은 이유로 그렇게 한다.\n */\n\n/** 한 자리에 보일 이름 수. 넘치면 몇이 남았는지 함께 낸다. */\nconst OCCUPANT_SHOWN = 8\n\ninterface OccupantScan {\n staff: Map<string, string[]>\n equipment: Map<string, string[]>\n assets: Map<string, string[]>\n}\n\nasync function scanOccupants(locations: OperationalLocation[], domain: Domain): Promise<OccupantScan> {\n const keys = [...new Set(locations.flatMap(one => [one.id, one.name]).filter(Boolean))] as string[]\n\n if (keys.length === 0) {\n return { staff: new Map(), equipment: new Map(), assets: new Map() }\n }\n\n const of = async (Entity: any) => {\n const rows = await getRepository(Entity)\n .createQueryBuilder('row')\n .select(['row.id', 'row.name', 'row.homeLocation'])\n .where('row.domain_id = :domain', { domain: domain.id })\n .andWhere('row.home_location IN (:...keys)', { keys })\n .getMany()\n\n return indexReferrers((rows as any[]).map(one => ({ points: one.homeLocation, name: one.name })))\n }\n\n const [staff, equipment, assets] = await Promise.all([of(Person), of(Equipment), of(PhysicalAsset)])\n\n return { staff, equipment, assets }\n}\n\n/**\n * 이 줄의 답을 낸다.\n *\n * **페이지에 없으면 그 줄만 따로 묻는다.** 한 요청에 목록 조회가 둘 있으면 뒤엣것이 앞엣것의\n * 페이지를 덮어쓰고, 그때 남는 줄들이 「아무도 없다」로 나온다 — 자리가 비어 있는 것과 못 본 것이\n * 같아 보인다. 들어오는 관계는 **비어 있는 것이 기본**이라 이 거짓말이 특히 안 띈다.\n * 틀린 목록보다 질의 한 번이 낫다. `childCount` 가 같은 이유로 같은 자리를 둔다.\n */\nasync function occupantsOf(location: OperationalLocation, context: ResolverContext): Promise<OccupantScan> {\n const state = context.state as {\n domain: Domain\n locationPage?: OperationalLocation[]\n occupantScan?: Promise<OccupantScan>\n }\n\n const page = state.locationPage\n const inPage = !!page?.some(one => one.id === location.id)\n\n if (!inPage) {\n return scanOccupants([location], state.domain)\n }\n\n /* 요청 안에서 한 번만 훑는다. 약속을 담는다. */\n state.occupantScan = state.occupantScan || scanOccupants(page!, state.domain)\n\n return state.occupantScan\n}\n\n/**\n * 한 자리의 이름들을 낸다 — 아이디로도 이름으로도 걸린 것을 합친다.\n *\n * 자료가 어느 쪽으로 적혔는지 자리마다 다를 수 있어 둘 다 본다. 합칠 때 겹치는 것은 한 번만 센다.\n */\nfunction namesAt(index: Map<string, string[]>, location: OperationalLocation): string[] {\n const found = [...(index.get(location.id) ?? []), ...(index.get(location.name) ?? [])]\n\n return [...new Set(found)].sort()\n}\n\n@Resolver(OperationalLocation)\n@UseMiddleware(SpeakRefusals)\nexport class OperationalLocationResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationalLocationList, { description: 'To fetch operational locations' })\n async operationalLocations(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationalLocationList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationalLocation', params, domain)\n\n const locations = items as OperationalLocation[]\n\n /*\n * 여기서 개수를 세지 않는다. 이 페이지만 요청에 남겨 둔다 — `childCount` 를 **물어본 요청**이\n * 있으면 그 리졸버가 이것을 보고 한 번에 센다(위 머리말).\n */\n context.state.locationPage = locations\n\n return { items: locations, total }\n }\n\n /**\n * 이 자리 바로 아래에 몇이 있나.\n *\n * 계층을 한 단씩 걷는 화면이 이 값으로 「그 줄에 들어갈 것이 있나」를 말한다. 아이콘만으로는 그것을\n * 말하지 못한다 — 눌러 보기 전에는 안에 무엇이 있는지, 있기는 한지 알 수 없다.\n *\n * 세는 방식과 값은 `countChildren` 머리말에 적었다.\n */\n /**\n * 여기서 일하는 사람들.\n *\n * **넘치면 몇이 남았는지 말한다**(`occupantOverflow`). 조용히 자르면 「셋이 있다」와 「서른이\n * 있는데 셋만 보인다」가 같아 보이고, 그 칸을 보고 사람이 판단을 내린다.\n *\n * 아무도 없으면 빈 목록이다 — 없는 것은 없다고 낸다.\n */\n @FieldResolver(type => [String], { description: 'People whose home location is here' })\n async staff(@Root() location: OperationalLocation, @Ctx() context: ResolverContext): Promise<string[]> {\n return cappedList(namesAt((await occupantsOf(location, context)).staff, location), OCCUPANT_SHOWN).shown\n }\n\n /** 여기 있는 설비들. */\n @FieldResolver(type => [String], { description: 'Equipment stationed here' })\n async equipmentHere(@Root() location: OperationalLocation, @Ctx() context: ResolverContext): Promise<string[]> {\n return cappedList(namesAt((await occupantsOf(location, context)).equipment, location), OCCUPANT_SHOWN).shown\n }\n\n /** 여기 있는 자산들 — 공구 · 지그처럼 옮겨 다니는 것. */\n @FieldResolver(type => [String], { description: 'Physical assets kept here' })\n async assetsHere(@Root() location: OperationalLocation, @Ctx() context: ResolverContext): Promise<string[]> {\n return cappedList(namesAt((await occupantsOf(location, context)).assets, location), OCCUPANT_SHOWN).shown\n }\n\n /**\n * 위 세 칸에서 **안 보인 것이 몇인가.**\n *\n * 셋을 합쳐 하나로 낸다. 칸마다 따로 두면 화면이 숫자 셋을 더 들고 있어야 하는데, 사람이 알고\n * 싶은 것은 「이 자리에 더 있나」 하나다.\n */\n @FieldResolver(type => Int, { description: 'How many occupants are not shown in the lists above' })\n async occupantOverflow(@Root() location: OperationalLocation, @Ctx() context: ResolverContext): Promise<number> {\n const scan = await occupantsOf(location, context)\n\n return (\n cappedList(namesAt(scan.staff, location), OCCUPANT_SHOWN).hidden +\n cappedList(namesAt(scan.equipment, location), OCCUPANT_SHOWN).hidden +\n cappedList(namesAt(scan.assets, location), OCCUPANT_SHOWN).hidden\n )\n }\n\n @FieldResolver(type => Int, { description: 'How many locations sit directly under this one' })\n async childCount(@Root() location: OperationalLocation, @Ctx() context: ResolverContext): Promise<number> {\n const { domain, locationPage } = context.state as { domain: Domain; locationPage?: OperationalLocation[] }\n\n const page = locationPage as OperationalLocation[] | undefined\n const inPage = !!page?.some(one => one.id === location.id)\n\n /*\n * 목록 조회가 남긴 페이지에 없으면 그 줄만 센다.\n *\n * 한 요청에 목록 조회가 둘 있으면 뒤엣것이 앞엣것의 페이지를 덮어쓴다. 그때 남는 줄들을 조용히 0 으로\n * 두지 않는다 — 틀린 개수보다 질의 한 번이 낫다.\n */\n if (!inPage) {\n const counted = await countChildren([location], domain)\n return sumFor(location, counted)\n }\n\n /*\n * 요청 안에서 한 번만 센다. **약속을 담는다** — 줄들이 거의 동시에 묻기 때문에 결과를 담으면\n * 스무 개가 각자 질의를 띄운다.\n */\n const state = context.state as { locationChildCounts?: Promise<Map<string, number>> }\n state.locationChildCounts = state.locationChildCounts || countChildren(page!, domain)\n\n return sumFor(location, await state.locationChildCounts)\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 => [OperationalLocation], { description: 'To create, change or retire operational locations' })\n async updateMultipleOperationalLocation(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext,\n /** **언제부터 그러한가** — 근무조 선언과 부모 관계를 고칠 때만 온다(§`applied-when`). */\n @Arg('applied', type => ScalarObject, { nullable: true }) applied?: AppliedWhen\n ): Promise<OperationalLocation[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationalLocation')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod,\n ...appliedOptions(applied)\n })\n\n return saved as OperationalLocation[]\n }\n}\n"]}
@@ -1,26 +0,0 @@
1
- import type { OperationalLocation } from './operational-location';
2
- /** 트윈 `ReferenceMaster.locations` 의 한 항목. */
3
- export interface LocationEntry {
4
- id: string;
5
- type: string;
6
- capacity?: number;
7
- parallelism?: number;
8
- parentId?: string;
9
- level?: string;
10
- /** 이 자리를 정의하는 영역(`wms` · `mes` …) — 같은 현장을 비추는 렌즈가 자기 자리와 참조할 자리를 가른다(ADR-0081 보탬). */
11
- system?: string;
12
- properties?: unknown[];
13
- testSpecificationIds?: string[];
14
- effectiveStart?: string;
15
- effectiveEnd?: string;
16
- }
17
- /**
18
- * 자리를 트윈이 받는 모양으로 옮긴다.
19
- *
20
- * **용량이 없으면 칸을 만들지 않는다.** 계약은 `capacity` 를 필수로 적지만, 모르는 값을 임의로 채우면
21
- * 물품 하나에 포화 경고가 난다. 비워 보내고 받는 쪽이 「모른다」로 다루게 한다.
22
- */
23
- export declare function toLocationEntry(location: OperationalLocation): LocationEntry;
24
- export declare function locationMaster(locations: OperationalLocation[]): {
25
- locations: LocationEntry[];
26
- };
@@ -1,28 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toLocationEntry = toLocationEntry;
4
- exports.locationMaster = locationMaster;
5
- const resource_class_1 = require("../resource/resource-class");
6
- /**
7
- * 자리를 트윈이 받는 모양으로 옮긴다.
8
- *
9
- * **용량이 없으면 칸을 만들지 않는다.** 계약은 `capacity` 를 필수로 적지만, 모르는 값을 임의로 채우면
10
- * 물품 하나에 포화 경고가 난다. 비워 보내고 받는 쪽이 「모른다」로 다루게 한다.
11
- */
12
- function toLocationEntry(location) {
13
- const out = { id: location.name, type: location.type };
14
- (0, resource_class_1.put)(out, 'capacity', location.capacity === undefined || location.capacity === null ? undefined : Number(location.capacity));
15
- (0, resource_class_1.put)(out, 'parallelism', location.parallelism === undefined || location.parallelism === null ? undefined : Number(location.parallelism));
16
- (0, resource_class_1.put)(out, 'parentId', location.parentId);
17
- (0, resource_class_1.put)(out, 'level', location.level);
18
- (0, resource_class_1.put)(out, 'system', location.system);
19
- (0, resource_class_1.put)(out, 'properties', location.properties);
20
- (0, resource_class_1.put)(out, 'testSpecificationIds', location.testSpecificationIds);
21
- (0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(location.effectiveStart));
22
- (0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(location.effectiveEnd));
23
- return out;
24
- }
25
- function locationMaster(locations) {
26
- return { locations: locations.map(toLocationEntry) };
27
- }
28
- //# sourceMappingURL=location-master.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"location-master.js","sourceRoot":"","sources":["../../../server/service/location/location-master.ts"],"names":[],"mappings":";;AAyBA,0CAcC;AAED,wCAEC;AA3CD,+DAAqD;AAmBrD;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,QAA6B;IAC3D,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE/E,IAAA,oBAAG,EAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC3H,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAA;IACvI,IAAA,oBAAG,EAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAA,oBAAG,EAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAA;IACjC,IAAA,oBAAG,EAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACnC,IAAA,oBAAG,EAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC3C,IAAA,oBAAG,EAAC,GAAG,EAAE,sBAAsB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IAC/D,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;IACxD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;IAEpD,OAAO,GAA+B,CAAA;AACxC,CAAC;AAED,SAAgB,cAAc,CAAC,SAAgC;IAC7D,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAA;AACtD,CAAC","sourcesContent":["import { iso, put } from '../resource/resource-class'\nimport type { OperationalLocation } from './operational-location'\n\n/** 트윈 `ReferenceMaster.locations` 의 한 항목. */\nexport interface LocationEntry {\n id: string\n type: string\n capacity?: number\n parallelism?: number\n parentId?: string\n level?: string\n /** 이 자리를 정의하는 영역(`wms` · `mes` …) — 같은 현장을 비추는 렌즈가 자기 자리와 참조할 자리를 가른다(ADR-0081 보탬). */\n system?: string\n properties?: unknown[]\n testSpecificationIds?: string[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\n/**\n * 자리를 트윈이 받는 모양으로 옮긴다.\n *\n * **용량이 없으면 칸을 만들지 않는다.** 계약은 `capacity` 를 필수로 적지만, 모르는 값을 임의로 채우면\n * 물품 하나에 포화 경고가 난다. 비워 보내고 받는 쪽이 「모른다」로 다루게 한다.\n */\nexport function toLocationEntry(location: OperationalLocation): LocationEntry {\n const out: Record<string, unknown> = { id: location.name, type: location.type }\n\n put(out, 'capacity', location.capacity === undefined || location.capacity === null ? undefined : Number(location.capacity))\n put(out, 'parallelism', location.parallelism === undefined || location.parallelism === null ? undefined : Number(location.parallelism))\n put(out, 'parentId', location.parentId)\n put(out, 'level', location.level)\n put(out, 'system', location.system)\n put(out, 'properties', location.properties)\n put(out, 'testSpecificationIds', location.testSpecificationIds)\n put(out, 'effectiveStart', iso(location.effectiveStart))\n put(out, 'effectiveEnd', iso(location.effectiveEnd))\n\n return out as unknown as LocationEntry\n}\n\nexport function locationMaster(locations: OperationalLocation[]): { locations: LocationEntry[] } {\n return { locations: locations.map(toLocationEntry) }\n}\n"]}
@@ -1,15 +0,0 @@
1
- export declare class LocationMaster {
2
- locations: string;
3
- /**
4
- * 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**
5
- *
6
- * 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.
7
- */
8
- hasMore: boolean;
9
- /** 이어 받을 자리. 더 없으면 없다. */
10
- next?: string;
11
- }
12
- export declare class LocationQuery {
13
- /** 자리 축 전체 — 자리가 상위 자리를 가리키므로 한 번에 낸다. */
14
- locationMaster(after: string | undefined, limit: number | undefined, context: ResolverContext): Promise<LocationMaster>;
15
- }
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LocationQuery = exports.LocationMaster = void 0;
4
- const tslib_1 = require("tslib");
5
- const type_graphql_1 = require("type-graphql");
6
- const master_page_query_1 = require("../master-page-query");
7
- const location_master_1 = require("./location-master");
8
- const operational_location_1 = require("./operational-location");
9
- let LocationMaster = class LocationMaster {
10
- };
11
- exports.LocationMaster = LocationMaster;
12
- tslib_1.__decorate([
13
- (0, type_graphql_1.Field)(type => String, { description: 'ReferenceMaster locations[] as JSON text' }),
14
- tslib_1.__metadata("design:type", String)
15
- ], LocationMaster.prototype, "locations", void 0);
16
- tslib_1.__decorate([
17
- (0, type_graphql_1.Field)({ description: 'true when more rows remain — keep pulling with next as after' }),
18
- tslib_1.__metadata("design:type", Boolean)
19
- ], LocationMaster.prototype, "hasMore", void 0);
20
- tslib_1.__decorate([
21
- (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' }),
22
- tslib_1.__metadata("design:type", String)
23
- ], LocationMaster.prototype, "next", void 0);
24
- exports.LocationMaster = LocationMaster = tslib_1.__decorate([
25
- (0, type_graphql_1.ObjectType)({ description: 'Location master as the twin receives it' })
26
- ], LocationMaster);
27
- let LocationQuery = class LocationQuery {
28
- /** 자리 축 전체 — 자리가 상위 자리를 가리키므로 한 번에 낸다. */
29
- async locationMaster(after, limit, context) {
30
- const { domain } = context.state;
31
- const request = { after, limit };
32
- const page = await (0, master_page_query_1.pullPage)(operational_location_1.OperationalLocation, domain, request);
33
- /* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */
34
- (0, master_page_query_1.refuseIfTooLarge)('자리', request, page);
35
- const locations = page.rows;
36
- return {
37
- locations: JSON.stringify((0, location_master_1.locationMaster)(locations).locations),
38
- hasMore: page.hasMore,
39
- ...(page.next ? { next: page.next } : {})
40
- };
41
- }
42
- };
43
- exports.LocationQuery = LocationQuery;
44
- tslib_1.__decorate([
45
- (0, type_graphql_1.Query)(returns => LocationMaster, { description: 'Location master for the twin to pull' }),
46
- tslib_1.__param(0, (0, type_graphql_1.Arg)('after', { nullable: true, description: 'resume after this name — the previous page\'s next' })),
47
- tslib_1.__param(1, (0, type_graphql_1.Arg)('limit', type => type_graphql_1.Int, { nullable: true, description: 'rows per page — omit only when the axis is small enough to pull whole' })),
48
- tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
49
- tslib_1.__metadata("design:type", Function),
50
- tslib_1.__metadata("design:paramtypes", [String, Number, Object]),
51
- tslib_1.__metadata("design:returntype", Promise)
52
- ], LocationQuery.prototype, "locationMaster", null);
53
- exports.LocationQuery = LocationQuery = tslib_1.__decorate([
54
- (0, type_graphql_1.Resolver)(operational_location_1.OperationalLocation)
55
- ], LocationQuery);
56
- //# sourceMappingURL=location-query.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"location-query.js","sourceRoot":"","sources":["../../../server/service/location/location-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAgF;AAIhF,4DAAiE;AAEjE,uDAAyE;AACzE,iEAA4D;AAGrD,IAAM,cAAc,GAApB,MAAM,cAAc;CAgB1B,CAAA;AAhBY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;iDAClE;AAQjB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;+CACvE;AAIhB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;;4CACnG;yBAdF,cAAc;IAD1B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;GAC1D,cAAc,CAgB1B;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,0CAA0C;IAEpC,AAAN,KAAK,CAAC,cAAc,CACmF,KAAyB,EACO,KAAyB,EACvJ,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAQ,EAAsB,0CAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEtF,0DAA0D;QAC1D,IAAA,oCAAgB,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAErC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAA;QAE3B,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,gCAAmB,EAAC,SAAS,CAAC,CAAC,SAAS,CAAC;YACnE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC;CACF,CAAA;AAxBY,sCAAa;AAGlB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IAEvF,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAA;IACnG,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE,CAAC,CAAA;IACnI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mDAiBP;wBAvBU,aAAa;IADzB,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,aAAa,CAwBzB","sourcesContent":["import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { pullPage, refuseIfTooLarge } from '../master-page-query'\n\nimport { locationMaster as buildLocationMaster } from './location-master'\nimport { OperationalLocation } from './operational-location'\n\n@ObjectType({ description: 'Location master as the twin receives it' })\nexport class LocationMaster {\n @Field(type => String, { description: 'ReferenceMaster locations[] as JSON text' })\n locations: string\n\n /**\n * 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**\n *\n * 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.\n */\n @Field({ description: 'true when more rows remain — keep pulling with next as after' })\n hasMore: boolean\n\n /** 이어 받을 자리. 더 없으면 없다. */\n @Field(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' })\n next?: string\n\n}\n\n@Resolver(OperationalLocation)\nexport class LocationQuery {\n /** 자리 축 전체 — 자리가 상위 자리를 가리키므로 한 번에 낸다. */\n @Query(returns => LocationMaster, { description: 'Location master for the twin to pull' })\n async locationMaster(\n @Arg('after', { nullable: true, description: 'resume after this name — the previous page\\'s next' }) after: string | undefined,\n @Arg('limit', type => Int, { nullable: true, description: 'rows per page — omit only when the axis is small enough to pull whole' }) limit: number | undefined,\n @Ctx() context: ResolverContext\n ): Promise<LocationMaster> {\n const { domain } = context.state\n\n const request = { after, limit }\n const page = await pullPage<OperationalLocation>(OperationalLocation, domain, request)\n\n /* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */\n refuseIfTooLarge('자리', request, page)\n\n const locations = page.rows\n\n return {\n locations: JSON.stringify(buildLocationMaster(locations).locations),\n hasMore: page.hasMore,\n ...(page.next ? { next: page.next } : {})\n }\n }\n}\n"]}
@@ -1,116 +0,0 @@
1
- import { type DomainSystem } from '@operato/ops-contract';
2
- import { Domain } from '@things-factory/shell';
3
- import { User } from '@things-factory/auth-base';
4
- /**
5
- * 자리 — **ISA-95 `OperationalLocation`**.
6
- *
7
- * 표준 원문은 「자원이 놓이거나 놓일 것으로 예상되는 논리적·물리적 장소」다. 자기 계층을 재귀로 갖고,
8
- * 설비는 자기 자리를 이것으로 가리킨다. 자리와 설비를 나눠 두는 것은 표준의 구조다.
9
- *
10
- * ── 용량을 지어내지 않는다 ──────────────────────────────────────────────────
11
- * `capacity` 는 그 자리에 몇이 들어가는가다. 모르면 비워 둔다. 실측에서 임의로 1 을 넣었더니 물품
12
- * 하나에 포화 경고가 났다 — 없는 것보다 나쁜 수다.
13
- */
14
- export declare class OperationalLocation {
15
- readonly id: string;
16
- domain?: Domain;
17
- domainId?: string;
18
- /** 표준 `ID` — 트윈으로 나갈 때 `locations[].id` 가 된다. */
19
- name: string;
20
- description?: string;
21
- /** 자리 타입 — 도메인 카탈로그가 정한 키(`raw-store` · `weld-station` 같은 것). */
22
- type: string;
23
- /**
24
- * **이 자리의 주인 영역** — 창고(`wms`) · 야드(`yms`) · 공장(`mes`) · 에너지(`ems`)(ADR-0081).
25
- *
26
- * ── 왜 칸이어야 하나 (2026-09-19 에 세어 보고 정함) ─────────────────────────
27
- * 한 현장에 제품이 둘 서면 「이 자리는 누구 것인가」를 물어야 한다. 창고의 재고는 **창고가 주인인 자리에
28
- * 선 것**이고, 라인 쪽 자리에 선 물건은 공장의 것이다. 그 답이 없으면 불출한 자재가 창고 재고에 그대로
29
- * 남아 가용 수와 할당 후보에 든다.
30
- *
31
- * 있는 칸으로는 가를 수 없다 — 전부 **추론**이 된다.
32
- *
33
- * ```
34
- * type WMS 타입(dock · storage …)과 MES 타입(raw-store · weld-station …)이 한 칸에 섞인다.
35
- * 현장이 자기 타입을 선언할 수 있어(DomainDefinition.locationTypes) 새 타입이 생기는 날 틀린다
36
- * level ISA-95 단이라 같은 문제다
37
- * properties 열린 Record 라 읽는 쪽마다 키를 정하고, 그러면 방언이 된다
38
- * parentId 「창고 아래」로 가를 수는 있으나 그 뿌리가 누구 것인지는 여전히 선언이 없다
39
- * ```
40
- *
41
- * ── 모르면 모르는 것이다 ───────────────────────────────────────────────────
42
- * 비어 있으면 **어느 제품의 재고에도 들지 않는다.** `type` 을 보고 채우는 대체값을 두지 않는다 — 그 추론이
43
- * 틀리는 날 남의 자리에 선 물건이 우리 재고가 되고, 아무도 오류를 보지 못한다. 선언되지 않은 자리의 수는
44
- * 화면이 말한다.
45
- *
46
- * 낱말은 계약의 `DOMAIN_SYSTEMS` 다. 글자로 다시 적지 않는다.
47
- */
48
- system?: DomainSystem;
49
- /**
50
- * ISA-95 설비 계층 단 — `ProductionLine` · `WorkCell` · `StorageZone` · `ProcessCell` · `Unit` 등.
51
- *
52
- * 적지 않으면 타입으로 알아낸다. 적으면 그것이 기준이다 — 현장이 자기 계층을 더 잘 안다.
53
- */
54
- level?: string;
55
- /** 이 자리에 몇이 들어가나. **모르면 비운다.** */
56
- capacity?: number;
57
- /** 동시에 몇을 처리하나(대기 이론의 서버 수). 표준에 없는 우리 축이다. */
58
- parallelism?: number;
59
- /** 상위 자리 — 표준 `OperationalLocationChild`(재귀)의 반대 방향. */
60
- parentId?: string;
61
- /**
62
- * 바로 아래에 몇이 있나. **저장하지 않는다** — 목록 리졸버가 채운다(`attachChildCounts`).
63
- *
64
- * 계층을 한 단씩 걷는 화면이 이 값으로 「그 줄에 들어갈 것이 있나」를 말한다. 세어서 넣는 값이라
65
- * 컬럼이 아니다 — 컬럼으로 두면 자식이 생기고 없어질 때마다 이 줄을 함께 고쳐야 하고, 한 번 빠뜨리면
66
- * 틀린 개수가 남는다.
67
- */
68
- childCount?: number;
69
- /** 자리 속성 — 표준 `OperationalLocationProperty`. */
70
- properties?: Record<string, unknown>[];
71
- /**
72
- * 이 자리에서 도는 **근무조 이름들** — 아래 단이 물려받는다.
73
- *
74
- * ── 왜 자리가 드나 (2026-09-07) ─────────────────────────────────────────
75
- * 근무조는 지금까지 도메인 단위 선언이고 **어디에 걸리는지가 없었다.** 그래서 씨앗이 설비마다
76
- * 사본을 뿌렸고(`Equipment.workCalendar`), 한 공장 22대가 같은 값을 22벌 들고 있었다. 3교대를
77
- * 2교대로 바꾸면 22줄을 고쳐야 하고, 한 줄을 빠뜨리면 그 설비만 조용히 옛 근무로 계산된다.
78
- *
79
- * 근무조는 **사람의 일정**이다. 사람은 기계 한 대가 아니라 라인·셀에 배치된다. 그래서 자리가
80
- * 들고 아래가 물려받는다 — 공장에 한 줄 적으면 그 아래 전부가 그것으로 돈다.
81
- *
82
- * ── 비어 있는 것이 정상이다 ───────────────────────────────────────────────
83
- * 채우는 것은 **위와 다를 때뿐**이다. 라인 하나만 주간이면 그 라인에만 적는다. 아무 데도 안 적으면
84
- * 도메인의 근무조 전부로 떨어져 지금 거동 그대로다 — 이 칸이 생겼다고 기존 공장이 바뀌지 않는다.
85
- *
86
- * ── 설비에는 적지 않는다 ──────────────────────────────────────────────────
87
- * 「이 기계만 24시간 돈다」는 근무조가 다른 것이 아니라 **자기 가동 계획이 다른 것**이다(에이징
88
- * 로가 그렇다). 그 사실은 `Equipment.workCalendar` — 이 설비가 가동하도록 계획된 시간 — 에 적힌다.
89
- * 근무조로 적으면 아무도 근무하지 않는 시간이 근무 시간으로 기록된다.
90
- *
91
- * ── 거는 단은 work center 급 이상이다 — 규칙이지 제약이 아니다 ────────────
92
- * ISA-95 Part 1 이 일정과 능력을 work center 에 둔다. 사람은 라인에 배치되지 기계 한 대에
93
- * 배치되지 않으므로, `Site` · `Area` · `ProductionLine` · `WorkCenter` 가 이 칸을 든다.
94
- *
95
- * **거절하지는 않는다.** 아래 단에 적어도 상속이 그것을 먼저 만나 그냥 돈다. 셀 단위 근무가
96
- * 실제로 있는 현장에서 저장을 막으면 그 현장은 모델링 자체가 안 된다 — 적합성 표에 줄 하나가
97
- * 서는 것보다 나쁘다. 어긋난 것은 성숙도가 이름과 함께 낸다.
98
- */
99
- workShiftNames?: string[];
100
- /** 이 자리에 걸리는 `TestSpecification` 참조들 — 구역 온도 기준 같은 것이 여기 붙는다. */
101
- testSpecificationIds?: string[];
102
- /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
103
- effectiveStart?: Date;
104
- /**
105
- * 언제까지 유효한가 — 표준 `EffectiveEndDate`.
106
- *
107
- * **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
108
- */
109
- effectiveEnd?: Date;
110
- createdAt?: Date;
111
- updatedAt?: Date;
112
- creator?: User;
113
- creatorId?: string;
114
- updater?: User;
115
- updaterId?: string;
116
- }