@things-factory/ops-master 10.1.248 → 10.1.250
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/bootstrap.d.ts +19 -0
- package/dist-client/bootstrap.js +66 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +17 -0
- package/dist-client/index.js +21 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/master-change-approval.d.ts +14 -0
- package/dist-client/master-change-approval.js +36 -0
- package/dist-client/master-change-approval.js.map +1 -0
- package/dist-client/master-change-policy-axes.d.ts +37 -0
- package/dist-client/master-change-policy-axes.js +29 -0
- package/dist-client/master-change-policy-axes.js.map +1 -0
- package/dist-client/master-change-policy-panel.d.ts +59 -0
- package/dist-client/master-change-policy-panel.js +454 -0
- package/dist-client/master-change-policy-panel.js.map +1 -0
- package/dist-client/master-change-providers.d.ts +4 -0
- package/dist-client/master-change-providers.js +91 -0
- package/dist-client/master-change-providers.js.map +1 -0
- package/dist-client/pages/master/applied-when-dialog.d.ts +48 -0
- package/dist-client/pages/master/applied-when-dialog.js +137 -0
- package/dist-client/pages/master/applied-when-dialog.js.map +1 -0
- package/dist-client/pages/master/assignment-fields.d.ts +27 -0
- package/dist-client/pages/master/assignment-fields.js +62 -0
- package/dist-client/pages/master/assignment-fields.js.map +1 -0
- package/dist-client/pages/master/equipment-class.d.ts +12 -0
- package/dist-client/pages/master/equipment-class.js +42 -0
- package/dist-client/pages/master/equipment-class.js.map +1 -0
- package/dist-client/pages/master/equipment.d.ts +12 -0
- package/dist-client/pages/master/equipment.js +58 -0
- package/dist-client/pages/master/equipment.js.map +1 -0
- package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
- package/dist-client/pages/master/grist-iso-duration.js +70 -0
- package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
- package/dist-client/pages/master/grist-reference.d.ts +91 -0
- package/dist-client/pages/master/grist-reference.js +419 -0
- package/dist-client/pages/master/grist-reference.js.map +1 -0
- package/dist-client/pages/master/import-rows.d.ts +35 -0
- package/dist-client/pages/master/import-rows.js +66 -0
- package/dist-client/pages/master/import-rows.js.map +1 -0
- package/dist-client/pages/master/iso-duration.d.ts +34 -0
- package/dist-client/pages/master/iso-duration.js +76 -0
- package/dist-client/pages/master/iso-duration.js.map +1 -0
- package/dist-client/pages/master/master-options.d.ts +40 -0
- package/dist-client/pages/master/master-options.js +54 -0
- package/dist-client/pages/master/master-options.js.map +1 -0
- package/dist-client/pages/master/master-page-base.d.ts +369 -0
- package/dist-client/pages/master/master-page-base.js +657 -0
- package/dist-client/pages/master/master-page-base.js.map +1 -0
- package/dist-client/pages/master/material-class.d.ts +12 -0
- package/dist-client/pages/master/material-class.js +42 -0
- package/dist-client/pages/master/material-class.js.map +1 -0
- package/dist-client/pages/master/material-definition.d.ts +5 -0
- package/dist-client/pages/master/material-definition.js +14 -0
- package/dist-client/pages/master/material-definition.js.map +1 -0
- package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
- package/dist-client/pages/master/material-revision-fields.js +43 -0
- package/dist-client/pages/master/material-revision-fields.js.map +1 -0
- package/dist-client/pages/master/operation-definition.d.ts +12 -0
- package/dist-client/pages/master/operation-definition.js +49 -0
- package/dist-client/pages/master/operation-definition.js.map +1 -0
- package/dist-client/pages/master/operational-location.d.ts +84 -0
- package/dist-client/pages/master/operational-location.js +432 -0
- package/dist-client/pages/master/operational-location.js.map +1 -0
- package/dist-client/pages/master/person.d.ts +12 -0
- package/dist-client/pages/master/person.js +41 -0
- package/dist-client/pages/master/person.js.map +1 -0
- package/dist-client/pages/master/personnel-class.d.ts +12 -0
- package/dist-client/pages/master/personnel-class.js +43 -0
- package/dist-client/pages/master/personnel-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
- package/dist-client/pages/master/physical-asset-class.js +40 -0
- package/dist-client/pages/master/physical-asset-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset.d.ts +12 -0
- package/dist-client/pages/master/physical-asset.js +41 -0
- package/dist-client/pages/master/physical-asset.js.map +1 -0
- package/dist-client/pages/master/recipe-definition.d.ts +5 -0
- package/dist-client/pages/master/recipe-definition.js +14 -0
- package/dist-client/pages/master/recipe-definition.js.map +1 -0
- package/dist-client/pages/master/reference-targets.d.ts +42 -0
- package/dist-client/pages/master/reference-targets.js +82 -0
- package/dist-client/pages/master/reference-targets.js.map +1 -0
- package/dist-client/pages/master/revision-comparison.d.ts +49 -0
- package/dist-client/pages/master/revision-comparison.js +560 -0
- package/dist-client/pages/master/revision-comparison.js.map +1 -0
- package/dist-client/pages/master/revision-view.d.ts +34 -0
- package/dist-client/pages/master/revision-view.js +145 -0
- package/dist-client/pages/master/revision-view.js.map +1 -0
- package/dist-client/pages/master/revision-workspace.d.ts +50 -0
- package/dist-client/pages/master/revision-workspace.js +763 -0
- package/dist-client/pages/master/revision-workspace.js.map +1 -0
- package/dist-client/pages/master/route-definition.d.ts +19 -0
- package/dist-client/pages/master/route-definition.js +40 -0
- package/dist-client/pages/master/route-definition.js.map +1 -0
- package/dist-client/pages/master/stop-reason.d.ts +12 -0
- package/dist-client/pages/master/stop-reason.js +48 -0
- package/dist-client/pages/master/stop-reason.js.map +1 -0
- package/dist-client/pages/master/test-specification.d.ts +5 -0
- package/dist-client/pages/master/test-specification.js +14 -0
- package/dist-client/pages/master/test-specification.js.map +1 -0
- package/dist-client/pages/master-axes.d.ts +24 -0
- package/dist-client/pages/master-axes.js +39 -0
- package/dist-client/pages/master-axes.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +81 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +19 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/service/ai-entry/master-entry-rules.d.ts +175 -0
- package/dist-server/service/ai-entry/master-entry-rules.js +302 -0
- package/dist-server/service/ai-entry/master-entry-rules.js.map +1 -0
- package/dist-server/service/ai-entry/master-entry-targets.d.ts +23 -0
- package/dist-server/service/ai-entry/master-entry-targets.js +293 -0
- package/dist-server/service/ai-entry/master-entry-targets.js.map +1 -0
- package/dist-server/service/approval-route.d.ts +37 -0
- package/dist-server/service/approval-route.js +34 -0
- package/dist-server/service/approval-route.js.map +1 -0
- package/dist-server/service/asset/asset-lifecycle.d.ts +106 -0
- package/dist-server/service/asset/asset-lifecycle.js +126 -0
- package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
- package/dist-server/service/asset/asset-master-resolver.d.ts +53 -0
- package/dist-server/service/asset/asset-master-resolver.js +185 -0
- package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
- package/dist-server/service/asset/asset-master.d.ts +21 -0
- package/dist-server/service/asset/asset-master.js +25 -0
- package/dist-server/service/asset/asset-master.js.map +1 -0
- package/dist-server/service/asset/asset-query.d.ts +16 -0
- package/dist-server/service/asset/asset-query.js +72 -0
- package/dist-server/service/asset/asset-query.js.map +1 -0
- package/dist-server/service/asset/index.d.ts +6 -0
- package/dist-server/service/asset/index.js +10 -0
- package/dist-server/service/asset/index.js.map +1 -0
- package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
- package/dist-server/service/asset/physical-asset-class.js +104 -0
- package/dist-server/service/asset/physical-asset-class.js.map +1 -0
- package/dist-server/service/asset/physical-asset.d.ts +66 -0
- package/dist-server/service/asset/physical-asset.js +123 -0
- package/dist-server/service/asset/physical-asset.js.map +1 -0
- package/dist-server/service/assignment/applied-when.d.ts +24 -0
- package/dist-server/service/assignment/applied-when.js +16 -0
- package/dist-server/service/assignment/applied-when.js.map +1 -0
- package/dist-server/service/assignment/assignment-history.d.ts +92 -0
- package/dist-server/service/assignment/assignment-history.js +289 -0
- package/dist-server/service/assignment/assignment-history.js.map +1 -0
- package/dist-server/service/assignment/assignment-write.d.ts +42 -0
- package/dist-server/service/assignment/assignment-write.js +101 -0
- package/dist-server/service/assignment/assignment-write.js.map +1 -0
- package/dist-server/service/assignment/master-value-claim.d.ts +135 -0
- package/dist-server/service/assignment/master-value-claim.js +174 -0
- package/dist-server/service/assignment/master-value-claim.js.map +1 -0
- package/dist-server/service/equipment/equipment-class.d.ts +34 -0
- package/dist-server/service/equipment/equipment-class.js +104 -0
- package/dist-server/service/equipment/equipment-class.js.map +1 -0
- package/dist-server/service/equipment/equipment-master-resolver.d.ts +77 -0
- package/dist-server/service/equipment/equipment-master-resolver.js +266 -0
- package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
- package/dist-server/service/equipment/equipment-master.d.ts +30 -0
- package/dist-server/service/equipment/equipment-master.js +53 -0
- package/dist-server/service/equipment/equipment-master.js.map +1 -0
- package/dist-server/service/equipment/equipment-query.d.ts +16 -0
- package/dist-server/service/equipment/equipment-query.js +72 -0
- package/dist-server/service/equipment/equipment-query.js.map +1 -0
- package/dist-server/service/equipment/equipment.d.ts +71 -0
- package/dist-server/service/equipment/equipment.js +138 -0
- package/dist-server/service/equipment/equipment.js.map +1 -0
- package/dist-server/service/equipment/index.d.ts +8 -0
- package/dist-server/service/equipment/index.js +12 -0
- package/dist-server/service/equipment/index.js.map +1 -0
- package/dist-server/service/equipment/state-period-rules.d.ts +95 -0
- package/dist-server/service/equipment/state-period-rules.js +122 -0
- package/dist-server/service/equipment/state-period-rules.js.map +1 -0
- package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
- package/dist-server/service/equipment/stop-reason-query.js +39 -0
- package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
- package/dist-server/service/equipment/stop-reason.d.ts +58 -0
- package/dist-server/service/equipment/stop-reason.js +114 -0
- package/dist-server/service/equipment/stop-reason.js.map +1 -0
- package/dist-server/service/index.d.ts +82 -0
- package/dist-server/service/index.js +145 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/location/index.d.ts +5 -0
- package/dist-server/service/location/index.js +9 -0
- package/dist-server/service/location/index.js.map +1 -0
- package/dist-server/service/location/location-master-resolver.d.ts +60 -0
- package/dist-server/service/location/location-master-resolver.js +313 -0
- package/dist-server/service/location/location-master-resolver.js.map +1 -0
- package/dist-server/service/location/location-master.d.ts +26 -0
- package/dist-server/service/location/location-master.js +28 -0
- package/dist-server/service/location/location-master.js.map +1 -0
- package/dist-server/service/location/location-query.d.ts +15 -0
- package/dist-server/service/location/location-query.js +56 -0
- package/dist-server/service/location/location-query.js.map +1 -0
- package/dist-server/service/location/operational-location.d.ts +116 -0
- package/dist-server/service/location/operational-location.js +157 -0
- package/dist-server/service/location/operational-location.js.map +1 -0
- package/dist-server/service/master-axis.d.ts +40 -0
- package/dist-server/service/master-axis.js +57 -0
- package/dist-server/service/master-axis.js.map +1 -0
- package/dist-server/service/master-change-approval/approval-input.d.ts +17 -0
- package/dist-server/service/master-change-approval/approval-input.js +35 -0
- package/dist-server/service/master-change-approval/approval-input.js.map +1 -0
- package/dist-server/service/master-change-approval/builtin-axes.d.ts +4 -0
- package/dist-server/service/master-change-approval/builtin-axes.js +96 -0
- package/dist-server/service/master-change-approval/builtin-axes.js.map +1 -0
- package/dist-server/service/master-change-approval/index.d.ts +14 -0
- package/dist-server/service/master-change-approval/index.js +37 -0
- package/dist-server/service/master-change-approval/index.js.map +1 -0
- package/dist-server/service/master-change-approval/master-change-axis.d.ts +54 -0
- package/dist-server/service/master-change-approval/master-change-axis.js +17 -0
- package/dist-server/service/master-change-approval/master-change-axis.js.map +1 -0
- package/dist-server/service/master-change-approval/master-change-flow.d.ts +65 -0
- package/dist-server/service/master-change-approval/master-change-flow.js +125 -0
- package/dist-server/service/master-change-approval/master-change-flow.js.map +1 -0
- package/dist-server/service/master-change-approval/master-change-resolver.d.ts +18 -0
- package/dist-server/service/master-change-approval/master-change-resolver.js +58 -0
- package/dist-server/service/master-change-approval/master-change-resolver.js.map +1 -0
- package/dist-server/service/master-change-policy.d.ts +122 -0
- package/dist-server/service/master-change-policy.js +304 -0
- package/dist-server/service/master-change-policy.js.map +1 -0
- package/dist-server/service/master-conformance-resolver.d.ts +34 -0
- package/dist-server/service/master-conformance-resolver.js +153 -0
- package/dist-server/service/master-conformance-resolver.js.map +1 -0
- package/dist-server/service/master-conformance.d.ts +80 -0
- package/dist-server/service/master-conformance.js +266 -0
- package/dist-server/service/master-conformance.js.map +1 -0
- package/dist-server/service/master-crud.d.ts +55 -0
- package/dist-server/service/master-crud.js +93 -0
- package/dist-server/service/master-crud.js.map +1 -0
- package/dist-server/service/master-list.d.ts +12 -0
- package/dist-server/service/master-list.js +30 -0
- package/dist-server/service/master-list.js.map +1 -0
- package/dist-server/service/master-page-query.d.ts +33 -0
- package/dist-server/service/master-page-query.js +55 -0
- package/dist-server/service/master-page-query.js.map +1 -0
- package/dist-server/service/master-page.d.ts +85 -0
- package/dist-server/service/master-page.js +104 -0
- package/dist-server/service/master-page.js.map +1 -0
- package/dist-server/service/material/index.d.ts +7 -0
- package/dist-server/service/material/index.js +12 -0
- package/dist-server/service/material/index.js.map +1 -0
- package/dist-server/service/material/material-axis-status.d.ts +8 -0
- package/dist-server/service/material/material-axis-status.js +19 -0
- package/dist-server/service/material/material-axis-status.js.map +1 -0
- package/dist-server/service/material/material-class.d.ts +34 -0
- package/dist-server/service/material/material-class.js +104 -0
- package/dist-server/service/material/material-class.js.map +1 -0
- package/dist-server/service/material/material-definition.d.ts +45 -0
- package/dist-server/service/material/material-definition.js +125 -0
- package/dist-server/service/material/material-definition.js.map +1 -0
- package/dist-server/service/material/material-effective-list.d.ts +39 -0
- package/dist-server/service/material/material-effective-list.js +54 -0
- package/dist-server/service/material/material-effective-list.js.map +1 -0
- package/dist-server/service/material/material-master-resolver.d.ts +106 -0
- package/dist-server/service/material/material-master-resolver.js +351 -0
- package/dist-server/service/material/material-master-resolver.js.map +1 -0
- package/dist-server/service/material/material-master.d.ts +9 -0
- package/dist-server/service/material/material-master.js +24 -0
- package/dist-server/service/material/material-master.js.map +1 -0
- package/dist-server/service/material/material-query.d.ts +16 -0
- package/dist-server/service/material/material-query.js +79 -0
- package/dist-server/service/material/material-query.js.map +1 -0
- package/dist-server/service/material/material-revision-content.d.ts +10 -0
- package/dist-server/service/material/material-revision-content.js +92 -0
- package/dist-server/service/material/material-revision-content.js.map +1 -0
- package/dist-server/service/material/material-revision-resolver.d.ts +60 -0
- package/dist-server/service/material/material-revision-resolver.js +96 -0
- package/dist-server/service/material/material-revision-resolver.js.map +1 -0
- package/dist-server/service/material/material-revision-service.d.ts +179 -0
- package/dist-server/service/material/material-revision-service.js +687 -0
- package/dist-server/service/material/material-revision-service.js.map +1 -0
- package/dist-server/service/material/material-revision.d.ts +86 -0
- package/dist-server/service/material/material-revision.js +339 -0
- package/dist-server/service/material/material-revision.js.map +1 -0
- package/dist-server/service/material/recipe-index.d.ts +23 -0
- package/dist-server/service/material/recipe-index.js +44 -0
- package/dist-server/service/material/recipe-index.js.map +1 -0
- package/dist-server/service/operation/index.d.ts +6 -0
- package/dist-server/service/operation/index.js +10 -0
- package/dist-server/service/operation/index.js.map +1 -0
- package/dist-server/service/operation/operation-definition.d.ts +52 -0
- package/dist-server/service/operation/operation-definition.js +143 -0
- package/dist-server/service/operation/operation-definition.js.map +1 -0
- package/dist-server/service/operation/operation-master-resolver.d.ts +52 -0
- package/dist-server/service/operation/operation-master-resolver.js +187 -0
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
- package/dist-server/service/operation/operation-master.d.ts +21 -0
- package/dist-server/service/operation/operation-master.js +28 -0
- package/dist-server/service/operation/operation-master.js.map +1 -0
- package/dist-server/service/operation/operation-query.d.ts +15 -0
- package/dist-server/service/operation/operation-query.js +56 -0
- package/dist-server/service/operation/operation-query.js.map +1 -0
- package/dist-server/service/operation/operation-readiness-resolver.d.ts +39 -0
- package/dist-server/service/operation/operation-readiness-resolver.js +111 -0
- package/dist-server/service/operation/operation-readiness-resolver.js.map +1 -0
- package/dist-server/service/operation/operation-readiness.d.ts +34 -0
- package/dist-server/service/operation/operation-readiness.js +133 -0
- package/dist-server/service/operation/operation-readiness.js.map +1 -0
- package/dist-server/service/personnel/index.d.ts +6 -0
- package/dist-server/service/personnel/index.js +10 -0
- package/dist-server/service/personnel/index.js.map +1 -0
- package/dist-server/service/personnel/person.d.ts +51 -0
- package/dist-server/service/personnel/person.js +119 -0
- package/dist-server/service/personnel/person.js.map +1 -0
- package/dist-server/service/personnel/personnel-class-readiness.d.ts +22 -0
- package/dist-server/service/personnel/personnel-class-readiness.js +98 -0
- package/dist-server/service/personnel/personnel-class-readiness.js.map +1 -0
- package/dist-server/service/personnel/personnel-class.d.ts +54 -0
- package/dist-server/service/personnel/personnel-class.js +114 -0
- package/dist-server/service/personnel/personnel-class.js.map +1 -0
- package/dist-server/service/personnel/personnel-master-resolver.d.ts +53 -0
- package/dist-server/service/personnel/personnel-master-resolver.js +187 -0
- package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
- package/dist-server/service/personnel/personnel-master.d.ts +39 -0
- package/dist-server/service/personnel/personnel-master.js +34 -0
- package/dist-server/service/personnel/personnel-master.js.map +1 -0
- package/dist-server/service/personnel/personnel-query.d.ts +29 -0
- package/dist-server/service/personnel/personnel-query.js +79 -0
- package/dist-server/service/personnel/personnel-query.js.map +1 -0
- package/dist-server/service/personnel/qualification.d.ts +104 -0
- package/dist-server/service/personnel/qualification.js +147 -0
- package/dist-server/service/personnel/qualification.js.map +1 -0
- package/dist-server/service/quality/index.d.ts +4 -0
- package/dist-server/service/quality/index.js +8 -0
- package/dist-server/service/quality/index.js.map +1 -0
- package/dist-server/service/quality/nonconformance-cause-resolver.d.ts +12 -0
- package/dist-server/service/quality/nonconformance-cause-resolver.js +60 -0
- package/dist-server/service/quality/nonconformance-cause-resolver.js.map +1 -0
- package/dist-server/service/quality/nonconformance-cause.d.ts +20 -0
- package/dist-server/service/quality/nonconformance-cause.js +90 -0
- package/dist-server/service/quality/nonconformance-cause.js.map +1 -0
- package/dist-server/service/recipe/index.d.ts +10 -0
- package/dist-server/service/recipe/index.js +16 -0
- package/dist-server/service/recipe/index.js.map +1 -0
- package/dist-server/service/recipe/recipe-definition.d.ts +75 -0
- package/dist-server/service/recipe/recipe-definition.js +143 -0
- package/dist-server/service/recipe/recipe-definition.js.map +1 -0
- package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
- package/dist-server/service/recipe/recipe-effective-list.js +96 -0
- package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
- package/dist-server/service/recipe/recipe-master-resolver.d.ts +28 -0
- package/dist-server/service/recipe/recipe-master-resolver.js +128 -0
- package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -0
- package/dist-server/service/recipe/recipe-master.d.ts +37 -0
- package/dist-server/service/recipe/recipe-master.js +47 -0
- package/dist-server/service/recipe/recipe-master.js.map +1 -0
- package/dist-server/service/recipe/recipe-query.d.ts +21 -0
- package/dist-server/service/recipe/recipe-query.js +82 -0
- package/dist-server/service/recipe/recipe-query.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
- package/dist-server/service/recipe/recipe-revision-content.js +70 -0
- package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
- package/dist-server/service/recipe/recipe-revision-line.js +95 -0
- package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-resolver.d.ts +65 -0
- package/dist-server/service/recipe/recipe-revision-resolver.js +96 -0
- package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision-service.d.ts +183 -0
- package/dist-server/service/recipe/recipe-revision-service.js +754 -0
- package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
- package/dist-server/service/recipe/recipe-revision.d.ts +102 -0
- package/dist-server/service/recipe/recipe-revision.js +373 -0
- package/dist-server/service/recipe/recipe-revision.js.map +1 -0
- package/dist-server/service/recipe/route-definition.d.ts +51 -0
- package/dist-server/service/recipe/route-definition.js +114 -0
- package/dist-server/service/recipe/route-definition.js.map +1 -0
- package/dist-server/service/resource/class-lineage.d.ts +46 -0
- package/dist-server/service/resource/class-lineage.js +80 -0
- package/dist-server/service/resource/class-lineage.js.map +1 -0
- package/dist-server/service/resource/class-members.d.ts +36 -0
- package/dist-server/service/resource/class-members.js +59 -0
- package/dist-server/service/resource/class-members.js.map +1 -0
- package/dist-server/service/resource/referrers.d.ts +54 -0
- package/dist-server/service/resource/referrers.js +99 -0
- package/dist-server/service/resource/referrers.js.map +1 -0
- package/dist-server/service/resource/resource-class.d.ts +25 -0
- package/dist-server/service/resource/resource-class.js +29 -0
- package/dist-server/service/resource/resource-class.js.map +1 -0
- package/dist-server/service/revision-baseline.d.ts +71 -0
- package/dist-server/service/revision-baseline.js +87 -0
- package/dist-server/service/revision-baseline.js.map +1 -0
- package/dist-server/service/row-lock.d.ts +22 -0
- package/dist-server/service/row-lock.js +31 -0
- package/dist-server/service/row-lock.js.map +1 -0
- package/dist-server/service/status/axis-stamp.d.ts +16 -0
- package/dist-server/service/status/axis-stamp.js +22 -0
- package/dist-server/service/status/axis-stamp.js.map +1 -0
- package/dist-server/service/status/index.d.ts +3 -0
- package/dist-server/service/status/index.js +7 -0
- package/dist-server/service/status/index.js.map +1 -0
- package/dist-server/service/status/master-status.d.ts +38 -0
- package/dist-server/service/status/master-status.js +129 -0
- package/dist-server/service/status/master-status.js.map +1 -0
- package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
- package/dist-server/service/test-spec/criteria-check.js +142 -0
- package/dist-server/service/test-spec/criteria-check.js.map +1 -0
- package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
- package/dist-server/service/test-spec/criteria-rows.js +139 -0
- package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
- package/dist-server/service/test-spec/index.d.ts +6 -0
- package/dist-server/service/test-spec/index.js +11 -0
- package/dist-server/service/test-spec/index.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-effective-list.d.ts +34 -0
- package/dist-server/service/test-spec/test-spec-effective-list.js +42 -0
- package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +44 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js +144 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
- package/dist-server/service/test-spec/test-spec-master.js +18 -0
- package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-query.d.ts +15 -0
- package/dist-server/service/test-spec/test-spec-query.js +61 -0
- package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +59 -0
- package/dist-server/service/test-spec/test-spec-revision-resolver.js +96 -0
- package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-revision-service.d.ts +178 -0
- package/dist-server/service/test-spec/test-spec-revision-service.js +685 -0
- package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-revision.d.ts +86 -0
- package/dist-server/service/test-spec/test-spec-revision.js +334 -0
- package/dist-server/service/test-spec/test-spec-revision.js.map +1 -0
- package/dist-server/service/test-spec/test-specification.d.ts +47 -0
- package/dist-server/service/test-spec/test-specification.js +119 -0
- package/dist-server/service/test-spec/test-specification.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toOperationEntry = toOperationEntry;
|
|
4
|
+
exports.operationMaster = operationMaster;
|
|
5
|
+
const resource_class_1 = require("../resource/resource-class");
|
|
6
|
+
function toOperationEntry(operation) {
|
|
7
|
+
/* `key` 와 `label` 과 `intent` 는 비울 수 없다 — 셋이 없으면 그 공정은 실행 단위가 되지 못한다. */
|
|
8
|
+
const out = {
|
|
9
|
+
key: operation.name,
|
|
10
|
+
label: operation.description ?? operation.name,
|
|
11
|
+
intent: operation.intent
|
|
12
|
+
};
|
|
13
|
+
(0, resource_class_1.put)(out, 'locationType', operation.locationType);
|
|
14
|
+
(0, resource_class_1.put)(out, 'resourceType', operation.resourceType);
|
|
15
|
+
(0, resource_class_1.put)(out, 'bizStep', operation.bizStep);
|
|
16
|
+
(0, resource_class_1.put)(out, 'duration', operation.duration);
|
|
17
|
+
(0, resource_class_1.put)(out, 'variability', operation.variability);
|
|
18
|
+
(0, resource_class_1.put)(out, 'parameters', operation.parameters);
|
|
19
|
+
(0, resource_class_1.put)(out, 'personnelSpecification', operation.personnelSpecification);
|
|
20
|
+
(0, resource_class_1.put)(out, 'physicalAssetSpecification', operation.physicalAssetSpecification);
|
|
21
|
+
(0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(operation.effectiveStart));
|
|
22
|
+
(0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(operation.effectiveEnd));
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
function operationMaster(operations) {
|
|
26
|
+
return { operations: operations.map(toOperationEntry) };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=operation-master.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-master.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master.ts"],"names":[],"mappings":";;AAoBA,4CAoBC;AAED,0CAEC;AA5CD,+DAAqD;AAoBrD,SAAgB,gBAAgB,CAAC,SAA8B;IAC7D,wEAAwE;IACxE,MAAM,GAAG,GAA4B;QACnC,GAAG,EAAE,SAAS,CAAC,IAAI;QACnB,KAAK,EAAE,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI;QAC9C,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAA;IAED,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,SAAS,CAAC,YAAY,CAAC,CAAA;IAChD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,SAAS,CAAC,YAAY,CAAC,CAAA;IAChD,IAAA,oBAAG,EAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;IACtC,IAAA,oBAAG,EAAC,GAAG,EAAE,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC,CAAA;IAC9C,IAAA,oBAAG,EAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC,CAAA;IAC5C,IAAA,oBAAG,EAAC,GAAG,EAAE,wBAAwB,EAAE,SAAS,CAAC,sBAAsB,CAAC,CAAA;IACpE,IAAA,oBAAG,EAAC,GAAG,EAAE,4BAA4B,EAAE,SAAS,CAAC,0BAA0B,CAAC,CAAA;IAC5E,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAA;IACzD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAA;IAErD,OAAO,GAAgC,CAAA;AACzC,CAAC;AAED,SAAgB,eAAe,CAAC,UAAiC;IAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAA;AACzD,CAAC","sourcesContent":["import { iso, put } from '../resource/resource-class'\nimport type { OperationDefinition } from './operation-definition'\n\n/** 트윈 선언의 `operations` 한 항목 — 계약의 `OperationDef` 모양이다. */\nexport interface OperationEntry {\n key: string\n label: string\n intent: string\n locationType?: string\n resourceType?: string\n bizStep?: string\n duration?: string\n variability?: unknown\n parameters?: unknown[]\n personnelSpecification?: unknown[]\n physicalAssetSpecification?: unknown[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\nexport function toOperationEntry(operation: OperationDefinition): OperationEntry {\n /* `key` 와 `label` 과 `intent` 는 비울 수 없다 — 셋이 없으면 그 공정은 실행 단위가 되지 못한다. */\n const out: Record<string, unknown> = {\n key: operation.name,\n label: operation.description ?? operation.name,\n intent: operation.intent\n }\n\n put(out, 'locationType', operation.locationType)\n put(out, 'resourceType', operation.resourceType)\n put(out, 'bizStep', operation.bizStep)\n put(out, 'duration', operation.duration)\n put(out, 'variability', operation.variability)\n put(out, 'parameters', operation.parameters)\n put(out, 'personnelSpecification', operation.personnelSpecification)\n put(out, 'physicalAssetSpecification', operation.physicalAssetSpecification)\n put(out, 'effectiveStart', iso(operation.effectiveStart))\n put(out, 'effectiveEnd', iso(operation.effectiveEnd))\n\n return out as unknown as OperationEntry\n}\n\nexport function operationMaster(operations: OperationDefinition[]): { operations: OperationEntry[] } {\n return { operations: operations.map(toOperationEntry) }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class OperationMaster {
|
|
2
|
+
operations: string;
|
|
3
|
+
/**
|
|
4
|
+
* 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**
|
|
5
|
+
*
|
|
6
|
+
* 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.
|
|
7
|
+
*/
|
|
8
|
+
hasMore: boolean;
|
|
9
|
+
/** 이어 받을 자리. 더 없으면 없다. */
|
|
10
|
+
next?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class OperationQuery {
|
|
13
|
+
/** 공정 정의 전체 — 라우팅의 단계가 이 키를 가리킨다. */
|
|
14
|
+
operationMaster(after: string | undefined, limit: number | undefined, context: ResolverContext): Promise<OperationMaster>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OperationQuery = exports.OperationMaster = 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 operation_definition_1 = require("./operation-definition");
|
|
8
|
+
const operation_master_1 = require("./operation-master");
|
|
9
|
+
let OperationMaster = class OperationMaster {
|
|
10
|
+
};
|
|
11
|
+
exports.OperationMaster = OperationMaster;
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
(0, type_graphql_1.Field)(type => String, { description: 'OperationDef[] as JSON text' }),
|
|
14
|
+
tslib_1.__metadata("design:type", String)
|
|
15
|
+
], OperationMaster.prototype, "operations", void 0);
|
|
16
|
+
tslib_1.__decorate([
|
|
17
|
+
(0, type_graphql_1.Field)({ description: 'true when more rows remain — keep pulling with next as after' }),
|
|
18
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
19
|
+
], OperationMaster.prototype, "hasMore", void 0);
|
|
20
|
+
tslib_1.__decorate([
|
|
21
|
+
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' }),
|
|
22
|
+
tslib_1.__metadata("design:type", String)
|
|
23
|
+
], OperationMaster.prototype, "next", void 0);
|
|
24
|
+
exports.OperationMaster = OperationMaster = tslib_1.__decorate([
|
|
25
|
+
(0, type_graphql_1.ObjectType)({ description: 'Operation definitions as the twin receives them' })
|
|
26
|
+
], OperationMaster);
|
|
27
|
+
let OperationQuery = class OperationQuery {
|
|
28
|
+
/** 공정 정의 전체 — 라우팅의 단계가 이 키를 가리킨다. */
|
|
29
|
+
async operationMaster(after, limit, context) {
|
|
30
|
+
const { domain } = context.state;
|
|
31
|
+
const request = { after, limit };
|
|
32
|
+
const page = await (0, master_page_query_1.pullPage)(operation_definition_1.OperationDefinition, domain, request);
|
|
33
|
+
/* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */
|
|
34
|
+
(0, master_page_query_1.refuseIfTooLarge)('공정', request, page);
|
|
35
|
+
const operations = page.rows;
|
|
36
|
+
return {
|
|
37
|
+
operations: JSON.stringify((0, operation_master_1.operationMaster)(operations).operations),
|
|
38
|
+
hasMore: page.hasMore,
|
|
39
|
+
...(page.next ? { next: page.next } : {})
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
exports.OperationQuery = OperationQuery;
|
|
44
|
+
tslib_1.__decorate([
|
|
45
|
+
(0, type_graphql_1.Query)(returns => OperationMaster, { description: 'Operation definitions 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
|
+
], OperationQuery.prototype, "operationMaster", null);
|
|
53
|
+
exports.OperationQuery = OperationQuery = tslib_1.__decorate([
|
|
54
|
+
(0, type_graphql_1.Resolver)(operation_definition_1.OperationDefinition)
|
|
55
|
+
], OperationQuery);
|
|
56
|
+
//# sourceMappingURL=operation-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-query.js","sourceRoot":"","sources":["../../../server/service/operation/operation-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAgF;AAIhF,4DAAiE;AAEjE,iEAA4D;AAC5D,yDAA4E;AAGrE,IAAM,eAAe,GAArB,MAAM,eAAe;CAgB3B,CAAA;AAhBY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;;mDACpD;AAQlB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;gDACvE;AAIhB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;;6CACnG;0BAdF,eAAe;IAD3B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;GAClE,eAAe,CAgB3B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,qCAAqC;IAE/B,AAAN,KAAK,CAAC,eAAe,CACkF,KAAyB,EACO,KAAyB,EACvJ,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAQ,EAAsB,0CAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEtF,0DAA0D;QAC1D,IAAA,oCAAgB,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAA;QAE5B,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,kCAAoB,EAAC,UAAU,CAAC,CAAC,UAAU,CAAC;YACvE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC;CACF,CAAA;AAxBY,wCAAc;AAGnB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAE9F,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAA;IACnG,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE,CAAC,CAAA;IACnI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAiBP;yBAvBU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,cAAc,CAwB1B","sourcesContent":["import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { pullPage, refuseIfTooLarge } from '../master-page-query'\n\nimport { OperationDefinition } from './operation-definition'\nimport { operationMaster as buildOperationMaster } from './operation-master'\n\n@ObjectType({ description: 'Operation definitions as the twin receives them' })\nexport class OperationMaster {\n @Field(type => String, { description: 'OperationDef[] as JSON text' })\n operations: string\n\n /**\n * 더 있나 — **이 값을 안 보고 쓰면 조용히 잘린 마스터로 트윈을 세우게 된다.**\n *\n * 거짓이 될 때까지 `next` 를 `after` 로 넘겨 이어 받는다.\n */\n @Field({ description: 'true when more rows remain — keep pulling with next as after' })\n hasMore: boolean\n\n /** 이어 받을 자리. 더 없으면 없다. */\n @Field(type => String, { nullable: true, description: 'cursor for the next page — the last name in this page' })\n next?: string\n\n}\n\n@Resolver(OperationDefinition)\nexport class OperationQuery {\n /** 공정 정의 전체 — 라우팅의 단계가 이 키를 가리킨다. */\n @Query(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' })\n async operationMaster(\n @Arg('after', { nullable: true, description: 'resume after this name — the previous page\\'s next' }) after: string | undefined,\n @Arg('limit', type => Int, { nullable: true, description: 'rows per page — omit only when the axis is small enough to pull whole' }) limit: number | undefined,\n @Ctx() context: ResolverContext\n ): Promise<OperationMaster> {\n const { domain } = context.state\n\n const request = { after, limit }\n const page = await pullPage<OperationDefinition>(OperationDefinition, domain, request)\n\n /* 통째로 달라고 했는데 한도를 넘으면 **자르지 않고 거절한다**(§`master-page`). */\n refuseIfTooLarge('공정', request, page)\n\n const operations = page.rows\n\n return {\n operations: JSON.stringify(buildOperationMaster(operations).operations),\n hasMore: page.hasMore,\n ...(page.next ? { next: page.next } : {})\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { OperationDefinition } from './operation-definition';
|
|
2
|
+
export declare class PersonnelReadinessType {
|
|
3
|
+
classId: string;
|
|
4
|
+
required: number;
|
|
5
|
+
qualified: number;
|
|
6
|
+
/** 곧 끊기는 것을 따로 센다 — 합쳐 세면 만료가 닥쳐서야 알게 된다. */
|
|
7
|
+
expiringSoon: number;
|
|
8
|
+
sample: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare class AssetReadinessType {
|
|
11
|
+
classId: string;
|
|
12
|
+
required: number;
|
|
13
|
+
/** 수명과 교정은 세지 않는다 — 이 화면이 답하는 물음은 「채울 자산이 있나」다. */
|
|
14
|
+
registered: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class OperationReadinessType {
|
|
17
|
+
operation: OperationDefinition;
|
|
18
|
+
personnel: PersonnelReadinessType[];
|
|
19
|
+
assets: AssetReadinessType[];
|
|
20
|
+
/** 품목당 표준 시간(분). 선언되지 않았으면 없다 — 0 으로 두면 「즉시 끝난다」가 된다. */
|
|
21
|
+
standardMinutes?: number;
|
|
22
|
+
peopleTotal: number;
|
|
23
|
+
/**
|
|
24
|
+
* 그중 자격을 실제로 확인한 수.
|
|
25
|
+
*
|
|
26
|
+
* `peopleTotal` 보다 작으면 잘린 것이다. 화면이 그 사실을 말해야 한다 — 자른 것을 말하지 않으면
|
|
27
|
+
* 「자격자 3명」이 실제로는 더 많을 수 있다.
|
|
28
|
+
*/
|
|
29
|
+
peopleScanned: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 선언 옆에 현실을 놓는다.
|
|
33
|
+
*
|
|
34
|
+
* 「용접 자격자 2명이 필요하다」는 선언이고, 그 선언이 지금 채워지는지는 다른 곳에 있었다. 두 화면을
|
|
35
|
+
* 오가며 사람이 머릿속으로 맞춰야 했고, 맞춰 보지 않으면 아무도 몰랐다.
|
|
36
|
+
*/
|
|
37
|
+
export declare class OperationReadinessResolver {
|
|
38
|
+
operationReadiness(name: string, context: ResolverContext): Promise<OperationReadinessType | undefined>;
|
|
39
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OperationReadinessResolver = exports.OperationReadinessType = exports.AssetReadinessType = exports.PersonnelReadinessType = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const type_graphql_1 = require("type-graphql");
|
|
6
|
+
const shell_1 = require("@things-factory/shell");
|
|
7
|
+
const operation_definition_1 = require("./operation-definition");
|
|
8
|
+
const operation_readiness_1 = require("./operation-readiness");
|
|
9
|
+
let PersonnelReadinessType = class PersonnelReadinessType {
|
|
10
|
+
};
|
|
11
|
+
exports.PersonnelReadinessType = PersonnelReadinessType;
|
|
12
|
+
tslib_1.__decorate([
|
|
13
|
+
(0, type_graphql_1.Field)(),
|
|
14
|
+
tslib_1.__metadata("design:type", String)
|
|
15
|
+
], PersonnelReadinessType.prototype, "classId", void 0);
|
|
16
|
+
tslib_1.__decorate([
|
|
17
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'how many the operation declares it needs' }),
|
|
18
|
+
tslib_1.__metadata("design:type", Number)
|
|
19
|
+
], PersonnelReadinessType.prototype, "required", void 0);
|
|
20
|
+
tslib_1.__decorate([
|
|
21
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'how many people hold that qualification right now' }),
|
|
22
|
+
tslib_1.__metadata("design:type", Number)
|
|
23
|
+
], PersonnelReadinessType.prototype, "qualified", void 0);
|
|
24
|
+
tslib_1.__decorate([
|
|
25
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'of those, how many lose it within 30 days' }),
|
|
26
|
+
tslib_1.__metadata("design:type", Number)
|
|
27
|
+
], PersonnelReadinessType.prototype, "expiringSoon", void 0);
|
|
28
|
+
tslib_1.__decorate([
|
|
29
|
+
(0, type_graphql_1.Field)(type => [String], { description: 'a few names — not the whole list' }),
|
|
30
|
+
tslib_1.__metadata("design:type", Array)
|
|
31
|
+
], PersonnelReadinessType.prototype, "sample", void 0);
|
|
32
|
+
exports.PersonnelReadinessType = PersonnelReadinessType = tslib_1.__decorate([
|
|
33
|
+
(0, type_graphql_1.ObjectType)({ description: 'A required personnel class, and how well it is covered right now' })
|
|
34
|
+
], PersonnelReadinessType);
|
|
35
|
+
let AssetReadinessType = class AssetReadinessType {
|
|
36
|
+
};
|
|
37
|
+
exports.AssetReadinessType = AssetReadinessType;
|
|
38
|
+
tslib_1.__decorate([
|
|
39
|
+
(0, type_graphql_1.Field)(),
|
|
40
|
+
tslib_1.__metadata("design:type", String)
|
|
41
|
+
], AssetReadinessType.prototype, "classId", void 0);
|
|
42
|
+
tslib_1.__decorate([
|
|
43
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int),
|
|
44
|
+
tslib_1.__metadata("design:type", Number)
|
|
45
|
+
], AssetReadinessType.prototype, "required", void 0);
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'how many are registered and still in service — lifecycle is not counted here' }),
|
|
48
|
+
tslib_1.__metadata("design:type", Number)
|
|
49
|
+
], AssetReadinessType.prototype, "registered", void 0);
|
|
50
|
+
exports.AssetReadinessType = AssetReadinessType = tslib_1.__decorate([
|
|
51
|
+
(0, type_graphql_1.ObjectType)({ description: 'A required asset class, and how many are registered' })
|
|
52
|
+
], AssetReadinessType);
|
|
53
|
+
let OperationReadinessType = class OperationReadinessType {
|
|
54
|
+
};
|
|
55
|
+
exports.OperationReadinessType = OperationReadinessType;
|
|
56
|
+
tslib_1.__decorate([
|
|
57
|
+
(0, type_graphql_1.Field)(type => operation_definition_1.OperationDefinition),
|
|
58
|
+
tslib_1.__metadata("design:type", operation_definition_1.OperationDefinition)
|
|
59
|
+
], OperationReadinessType.prototype, "operation", void 0);
|
|
60
|
+
tslib_1.__decorate([
|
|
61
|
+
(0, type_graphql_1.Field)(type => [PersonnelReadinessType]),
|
|
62
|
+
tslib_1.__metadata("design:type", Array)
|
|
63
|
+
], OperationReadinessType.prototype, "personnel", void 0);
|
|
64
|
+
tslib_1.__decorate([
|
|
65
|
+
(0, type_graphql_1.Field)(type => [AssetReadinessType]),
|
|
66
|
+
tslib_1.__metadata("design:type", Array)
|
|
67
|
+
], OperationReadinessType.prototype, "assets", void 0);
|
|
68
|
+
tslib_1.__decorate([
|
|
69
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Float, { nullable: true, description: 'standard time per item in minutes — absent when not declared' }),
|
|
70
|
+
tslib_1.__metadata("design:type", Number)
|
|
71
|
+
], OperationReadinessType.prototype, "standardMinutes", void 0);
|
|
72
|
+
tslib_1.__decorate([
|
|
73
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'people registered in this domain' }),
|
|
74
|
+
tslib_1.__metadata("design:type", Number)
|
|
75
|
+
], OperationReadinessType.prototype, "peopleTotal", void 0);
|
|
76
|
+
tslib_1.__decorate([
|
|
77
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.Int, { description: 'how many of them were actually checked' }),
|
|
78
|
+
tslib_1.__metadata("design:type", Number)
|
|
79
|
+
], OperationReadinessType.prototype, "peopleScanned", void 0);
|
|
80
|
+
exports.OperationReadinessType = OperationReadinessType = tslib_1.__decorate([
|
|
81
|
+
(0, type_graphql_1.ObjectType)({ description: 'What one operation declares it needs, and whether that is met today' })
|
|
82
|
+
], OperationReadinessType);
|
|
83
|
+
/**
|
|
84
|
+
* 선언 옆에 현실을 놓는다.
|
|
85
|
+
*
|
|
86
|
+
* 「용접 자격자 2명이 필요하다」는 선언이고, 그 선언이 지금 채워지는지는 다른 곳에 있었다. 두 화면을
|
|
87
|
+
* 오가며 사람이 머릿속으로 맞춰야 했고, 맞춰 보지 않으면 아무도 몰랐다.
|
|
88
|
+
*/
|
|
89
|
+
let OperationReadinessResolver = class OperationReadinessResolver {
|
|
90
|
+
async operationReadiness(name, context) {
|
|
91
|
+
const { domain } = context.state;
|
|
92
|
+
return (0, operation_readiness_1.operationReadiness)((0, shell_1.getRepository)(operation_definition_1.OperationDefinition).manager, domain, name);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
exports.OperationReadinessResolver = OperationReadinessResolver;
|
|
96
|
+
tslib_1.__decorate([
|
|
97
|
+
(0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
|
|
98
|
+
(0, type_graphql_1.Query)(returns => OperationReadinessType, {
|
|
99
|
+
nullable: true,
|
|
100
|
+
description: 'To read what an operation requires and whether that is met today'
|
|
101
|
+
}),
|
|
102
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('name')),
|
|
103
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
104
|
+
tslib_1.__metadata("design:type", Function),
|
|
105
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
106
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
107
|
+
], OperationReadinessResolver.prototype, "operationReadiness", null);
|
|
108
|
+
exports.OperationReadinessResolver = OperationReadinessResolver = tslib_1.__decorate([
|
|
109
|
+
(0, type_graphql_1.Resolver)()
|
|
110
|
+
], OperationReadinessResolver);
|
|
111
|
+
//# sourceMappingURL=operation-readiness-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-readiness-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-readiness-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Directive, Field, Float, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { OperationDefinition } from './operation-definition'\nimport { operationReadiness } from './operation-readiness'\n\n@ObjectType({ description: 'A required personnel class, and how well it is covered right now' })\nexport class PersonnelReadinessType {\n @Field()\n classId: string\n\n @Field(type => Int, { description: 'how many the operation declares it needs' })\n required: number\n\n @Field(type => Int, { description: 'how many people hold that qualification right now' })\n qualified: number\n\n /** 곧 끊기는 것을 따로 센다 — 합쳐 세면 만료가 닥쳐서야 알게 된다. */\n @Field(type => Int, { description: 'of those, how many lose it within 30 days' })\n expiringSoon: number\n\n @Field(type => [String], { description: 'a few names — not the whole list' })\n sample: string[]\n}\n\n@ObjectType({ description: 'A required asset class, and how many are registered' })\nexport class AssetReadinessType {\n @Field()\n classId: string\n\n @Field(type => Int)\n required: number\n\n /** 수명과 교정은 세지 않는다 — 이 화면이 답하는 물음은 「채울 자산이 있나」다. */\n @Field(type => Int, { description: 'how many are registered and still in service — lifecycle is not counted here' })\n registered: number\n}\n\n@ObjectType({ description: 'What one operation declares it needs, and whether that is met today' })\nexport class OperationReadinessType {\n @Field(type => OperationDefinition)\n operation: OperationDefinition\n\n @Field(type => [PersonnelReadinessType])\n personnel: PersonnelReadinessType[]\n\n @Field(type => [AssetReadinessType])\n assets: AssetReadinessType[]\n\n /** 품목당 표준 시간(분). 선언되지 않았으면 없다 — 0 으로 두면 「즉시 끝난다」가 된다. */\n @Field(type => Float, { nullable: true, description: 'standard time per item in minutes — absent when not declared' })\n standardMinutes?: number\n\n @Field(type => Int, { description: 'people registered in this domain' })\n peopleTotal: number\n\n /**\n * 그중 자격을 실제로 확인한 수.\n *\n * `peopleTotal` 보다 작으면 잘린 것이다. 화면이 그 사실을 말해야 한다 — 자른 것을 말하지 않으면\n * 「자격자 3명」이 실제로는 더 많을 수 있다.\n */\n @Field(type => Int, { description: 'how many of them were actually checked' })\n peopleScanned: number\n}\n\n/**\n * 선언 옆에 현실을 놓는다.\n *\n * 「용접 자격자 2명이 필요하다」는 선언이고, 그 선언이 지금 채워지는지는 다른 곳에 있었다. 두 화면을\n * 오가며 사람이 머릿속으로 맞춰야 했고, 맞춰 보지 않으면 아무도 몰랐다.\n */\n@Resolver()\nexport class OperationReadinessResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationReadinessType, {\n nullable: true,\n description: 'To read what an operation requires and whether that is met today'\n })\n async operationReadiness(\n @Arg('name') name: string,\n @Ctx() context: ResolverContext\n ): Promise<OperationReadinessType | undefined> {\n const { domain } = context.state\n\n return operationReadiness(getRepository(OperationDefinition).manager, domain, name)\n }\n}\n"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { EntityManager } from 'typeorm';
|
|
2
|
+
import { Domain } from '@things-factory/shell';
|
|
3
|
+
import { OperationDefinition } from './operation-definition';
|
|
4
|
+
export interface PersonnelReadiness {
|
|
5
|
+
classId: string;
|
|
6
|
+
required: number;
|
|
7
|
+
/** 지금 이 등급의 자격을 갖춘 인원 수. */
|
|
8
|
+
qualified: number;
|
|
9
|
+
/** 그중 곧 자격이 끊기는 인원 수. */
|
|
10
|
+
expiringSoon: number;
|
|
11
|
+
/** 보여 줄 이름 몇 개. 전부 내려보내지 않는다. */
|
|
12
|
+
sample: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface AssetReadiness {
|
|
15
|
+
classId: string;
|
|
16
|
+
required: number;
|
|
17
|
+
/**
|
|
18
|
+
* 이 등급으로 등록된 자산 수.
|
|
19
|
+
*
|
|
20
|
+
* **수명과 교정은 세지 않는다.** 그것을 세려면 자산마다 사용 횟수를 물어야 하고, 이 화면이 답하는
|
|
21
|
+
* 물음은 「선언을 채울 자산이 있나」이지 「지금 쓸 수 있나」가 아니다. 화면이 그 차이를 밝힌다.
|
|
22
|
+
*/
|
|
23
|
+
registered: number;
|
|
24
|
+
}
|
|
25
|
+
export interface OperationReadiness {
|
|
26
|
+
operation: OperationDefinition;
|
|
27
|
+
personnel: PersonnelReadiness[];
|
|
28
|
+
assets: AssetReadiness[];
|
|
29
|
+
/** 품목당 표준 시간(분). 선언되지 않았으면 없다. */
|
|
30
|
+
standardMinutes?: number;
|
|
31
|
+
peopleTotal: number;
|
|
32
|
+
peopleScanned: number;
|
|
33
|
+
}
|
|
34
|
+
export declare function operationReadiness(manager: EntityManager, domain: Domain, operationName: string, now?: Date): Promise<OperationReadiness | undefined>;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.operationReadiness = operationReadiness;
|
|
4
|
+
const ops_contract_1 = require("@operato/ops-contract");
|
|
5
|
+
const physical_asset_1 = require("../asset/physical-asset");
|
|
6
|
+
const physical_asset_class_1 = require("../asset/physical-asset-class");
|
|
7
|
+
const person_1 = require("../personnel/person");
|
|
8
|
+
const personnel_class_1 = require("../personnel/personnel-class");
|
|
9
|
+
const qualification_1 = require("../personnel/qualification");
|
|
10
|
+
const resource_class_1 = require("../resource/resource-class");
|
|
11
|
+
const operation_definition_1 = require("./operation-definition");
|
|
12
|
+
/**
|
|
13
|
+
* 공정 하나의 **선언과 현재 채움 상태**.
|
|
14
|
+
*
|
|
15
|
+
* ── 왜 둘을 한 화면에서 보나 ───────────────────────────────────────────────
|
|
16
|
+
* 「용접 자격자 2명이 필요하다」는 선언이다. 그 선언이 지금 채워지는지는 다른 화면에 있다. 표로 나눠
|
|
17
|
+
* 두면 사람이 두 화면을 오가며 머릿속으로 맞춰야 하고, 맞춰 보지 않으면 아무도 모른다.
|
|
18
|
+
*
|
|
19
|
+
* 선언을 적는 자리에서 **그 선언이 지금 성립하는지** 함께 보인다.
|
|
20
|
+
*
|
|
21
|
+
* ── 곧 끊기는 것을 따로 센다 ───────────────────────────────────────────────
|
|
22
|
+
* 「자격자 3명」과 「자격자 3명인데 그중 1명이 다음 주 만료」는 다른 상황이다. 합쳐 세면 만료가
|
|
23
|
+
* 닥쳐서야 알게 된다.
|
|
24
|
+
*
|
|
25
|
+
* ── 조용히 자르지 않는다 ───────────────────────────────────────────────────
|
|
26
|
+
* 자격은 사람마다 계산해야 한다(등급 상속과 검사 만료를 봐야 하므로). 인원이 아주 많으면 상한까지만
|
|
27
|
+
* 보고, **몇 명 중 몇 명을 봤는지 함께 낸다.**
|
|
28
|
+
*/
|
|
29
|
+
/** 한 번에 자격을 확인하는 인원 수의 상한. */
|
|
30
|
+
const MAX_PEOPLE_SCANNED = 2000;
|
|
31
|
+
/** 이 기간 안에 끊기는 자격을 「곧 만료」로 센다. */
|
|
32
|
+
const EXPIRING_SOON_DAYS = 30;
|
|
33
|
+
async function operationReadiness(manager, domain, operationName, now = new Date()) {
|
|
34
|
+
const operation = await manager.findOne(operation_definition_1.OperationDefinition, {
|
|
35
|
+
where: { domain: { id: domain.id }, name: operationName }
|
|
36
|
+
});
|
|
37
|
+
if (!operation) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const at = now.toISOString();
|
|
41
|
+
const spec = (0, qualification_1.personnelSpecificationOf)(operation.personnelSpecification);
|
|
42
|
+
const [personnelClasses, people] = await Promise.all([
|
|
43
|
+
manager.find(personnel_class_1.PersonnelClass, { where: { domain: { id: domain.id } } }),
|
|
44
|
+
spec.length
|
|
45
|
+
? manager.find(person_1.Person, { where: { domain: { id: domain.id } }, take: MAX_PEOPLE_SCANNED })
|
|
46
|
+
: Promise.resolve([])
|
|
47
|
+
]);
|
|
48
|
+
const peopleTotal = spec.length ? await manager.count(person_1.Person, { where: { domain: { id: domain.id } } }) : 0;
|
|
49
|
+
const classDefs = personnelClasses.map(resource_class_1.toResourceClassDef);
|
|
50
|
+
const soonMs = now.getTime() + EXPIRING_SOON_DAYS * 24 * 3_600_000;
|
|
51
|
+
const personnel = spec.map(({ personnelClassId, quantity }) => {
|
|
52
|
+
const qualified = [];
|
|
53
|
+
let expiringSoon = 0;
|
|
54
|
+
for (const person of people) {
|
|
55
|
+
const judgeable = {
|
|
56
|
+
name: person.name,
|
|
57
|
+
personnelClassIds: person.personnelClassIds,
|
|
58
|
+
testResults: person.testResults,
|
|
59
|
+
effectiveStart: person.effectiveStart,
|
|
60
|
+
effectiveEnd: person.effectiveEnd
|
|
61
|
+
};
|
|
62
|
+
if ((0, qualification_1.qualificationGapsFor)(judgeable, personnelClassId, classDefs, at).length) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
qualified.push(person.name);
|
|
66
|
+
const expiry = (0, qualification_1.nearestQualificationExpiry)(judgeable, personnelClassId, classDefs, at);
|
|
67
|
+
if (expiry && Date.parse(expiry) <= soonMs) {
|
|
68
|
+
expiringSoon += 1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
classId: personnelClassId,
|
|
73
|
+
required: quantity ?? 1,
|
|
74
|
+
qualified: qualified.length,
|
|
75
|
+
expiringSoon,
|
|
76
|
+
sample: qualified.slice(0, 5)
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
operation,
|
|
81
|
+
personnel,
|
|
82
|
+
assets: await assetReadiness(manager, domain, operation, at),
|
|
83
|
+
standardMinutes: minutesOf(operation.duration),
|
|
84
|
+
peopleTotal,
|
|
85
|
+
peopleScanned: people.length
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** 선언된 요구 자산을 읽는다. 등급 이름이 없는 줄은 걸러 낸다 — 아무도 못 채우는 요구가 된다. */
|
|
89
|
+
function assetSpecificationOf(raw) {
|
|
90
|
+
const entries = [];
|
|
91
|
+
for (const row of raw ?? []) {
|
|
92
|
+
const classId = row?.physicalAssetClassId ?? row?.assetClassId ?? row?.classId;
|
|
93
|
+
if (typeof classId !== 'string' || !classId) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const quantity = Number(row?.quantity);
|
|
97
|
+
entries.push({ classId, quantity: Number.isFinite(quantity) && quantity > 0 ? quantity : 1 });
|
|
98
|
+
}
|
|
99
|
+
return entries;
|
|
100
|
+
}
|
|
101
|
+
async function assetReadiness(manager, domain, operation, at) {
|
|
102
|
+
const spec = assetSpecificationOf(operation.physicalAssetSpecification);
|
|
103
|
+
if (!spec.length) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
const [classes, assets] = await Promise.all([
|
|
107
|
+
manager.find(physical_asset_class_1.PhysicalAssetClass, { where: { domain: { id: domain.id } } }),
|
|
108
|
+
manager.find(physical_asset_1.PhysicalAsset, { where: { domain: { id: domain.id } } })
|
|
109
|
+
]);
|
|
110
|
+
const classDefs = classes.map(resource_class_1.toResourceClassDef);
|
|
111
|
+
return spec.map(({ classId, quantity }) => {
|
|
112
|
+
let registered = 0;
|
|
113
|
+
for (const asset of assets) {
|
|
114
|
+
const period = { effectiveStart: iso(asset.effectiveStart), effectiveEnd: iso(asset.effectiveEnd) };
|
|
115
|
+
if ((0, ops_contract_1.effectivityAt)(period, at) !== undefined) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if ((0, ops_contract_1.classClosure)(asset.assetClassIds, classDefs, at).has(classId)) {
|
|
119
|
+
registered += 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { classId, required: quantity, registered };
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/** ISO 8601 기간을 분으로. 해석할 수 없으면 없다 — 0 분으로 두면 「즉시 끝난다」가 된다. */
|
|
126
|
+
function minutesOf(duration) {
|
|
127
|
+
const ms = (0, ops_contract_1.parseIsoDuration)(duration);
|
|
128
|
+
return ms == null ? undefined : Math.round((ms / 60_000) * 10) / 10;
|
|
129
|
+
}
|
|
130
|
+
function iso(at) {
|
|
131
|
+
return at ? new Date(at).toISOString() : undefined;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=operation-readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-readiness.js","sourceRoot":"","sources":["../../../server/service/operation/operation-readiness.ts"],"names":[],"mappings":"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","sourcesContent":["import { EntityManager } from 'typeorm'\n\nimport { Domain } from '@things-factory/shell'\nimport { classClosure, effectivityAt, parseIsoDuration } from '@operato/ops-contract'\nimport type { ResourceClassDef, TestResult } from '@operato/ops-contract'\n\nimport { PhysicalAsset } from '../asset/physical-asset'\nimport { PhysicalAssetClass } from '../asset/physical-asset-class'\nimport { Person } from '../personnel/person'\nimport { PersonnelClass } from '../personnel/personnel-class'\nimport { nearestQualificationExpiry, personnelSpecificationOf, qualificationGapsFor } from '../personnel/qualification'\nimport { toResourceClassDef } from '../resource/resource-class'\nimport { OperationDefinition } from './operation-definition'\n\n/**\n * 공정 하나의 **선언과 현재 채움 상태**.\n *\n * ── 왜 둘을 한 화면에서 보나 ───────────────────────────────────────────────\n * 「용접 자격자 2명이 필요하다」는 선언이다. 그 선언이 지금 채워지는지는 다른 화면에 있다. 표로 나눠\n * 두면 사람이 두 화면을 오가며 머릿속으로 맞춰야 하고, 맞춰 보지 않으면 아무도 모른다.\n *\n * 선언을 적는 자리에서 **그 선언이 지금 성립하는지** 함께 보인다.\n *\n * ── 곧 끊기는 것을 따로 센다 ───────────────────────────────────────────────\n * 「자격자 3명」과 「자격자 3명인데 그중 1명이 다음 주 만료」는 다른 상황이다. 합쳐 세면 만료가\n * 닥쳐서야 알게 된다.\n *\n * ── 조용히 자르지 않는다 ───────────────────────────────────────────────────\n * 자격은 사람마다 계산해야 한다(등급 상속과 검사 만료를 봐야 하므로). 인원이 아주 많으면 상한까지만\n * 보고, **몇 명 중 몇 명을 봤는지 함께 낸다.**\n */\n\n/** 한 번에 자격을 확인하는 인원 수의 상한. */\nconst MAX_PEOPLE_SCANNED = 2000\n\n/** 이 기간 안에 끊기는 자격을 「곧 만료」로 센다. */\nconst EXPIRING_SOON_DAYS = 30\n\nexport interface PersonnelReadiness {\n classId: string\n required: number\n /** 지금 이 등급의 자격을 갖춘 인원 수. */\n qualified: number\n /** 그중 곧 자격이 끊기는 인원 수. */\n expiringSoon: number\n /** 보여 줄 이름 몇 개. 전부 내려보내지 않는다. */\n sample: string[]\n}\n\nexport interface AssetReadiness {\n classId: string\n required: number\n /**\n * 이 등급으로 등록된 자산 수.\n *\n * **수명과 교정은 세지 않는다.** 그것을 세려면 자산마다 사용 횟수를 물어야 하고, 이 화면이 답하는\n * 물음은 「선언을 채울 자산이 있나」이지 「지금 쓸 수 있나」가 아니다. 화면이 그 차이를 밝힌다.\n */\n registered: number\n}\n\nexport interface OperationReadiness {\n operation: OperationDefinition\n personnel: PersonnelReadiness[]\n assets: AssetReadiness[]\n /** 품목당 표준 시간(분). 선언되지 않았으면 없다. */\n standardMinutes?: number\n peopleTotal: number\n peopleScanned: number\n}\n\nexport async function operationReadiness(\n manager: EntityManager,\n domain: Domain,\n operationName: string,\n now = new Date()\n): Promise<OperationReadiness | undefined> {\n const operation = await manager.findOne(OperationDefinition, {\n where: { domain: { id: domain.id }, name: operationName }\n })\n\n if (!operation) {\n return undefined\n }\n\n const at = now.toISOString()\n const spec = personnelSpecificationOf(operation.personnelSpecification)\n\n const [personnelClasses, people] = await Promise.all([\n manager.find(PersonnelClass, { where: { domain: { id: domain.id } } }),\n spec.length\n ? manager.find(Person, { where: { domain: { id: domain.id } }, take: MAX_PEOPLE_SCANNED })\n : Promise.resolve([] as Person[])\n ])\n\n const peopleTotal = spec.length ? await manager.count(Person, { where: { domain: { id: domain.id } } }) : 0\n const classDefs = personnelClasses.map(toResourceClassDef)\n const soonMs = now.getTime() + EXPIRING_SOON_DAYS * 24 * 3_600_000\n\n const personnel = spec.map(({ personnelClassId, quantity }) => {\n const qualified: string[] = []\n let expiringSoon = 0\n\n for (const person of people) {\n const judgeable = {\n name: person.name,\n personnelClassIds: person.personnelClassIds,\n testResults: person.testResults as unknown as TestResult[] | undefined,\n effectiveStart: person.effectiveStart,\n effectiveEnd: person.effectiveEnd\n }\n\n if (qualificationGapsFor(judgeable, personnelClassId, classDefs, at).length) {\n continue\n }\n\n qualified.push(person.name)\n\n const expiry = nearestQualificationExpiry(judgeable, personnelClassId, classDefs, at)\n if (expiry && Date.parse(expiry) <= soonMs) {\n expiringSoon += 1\n }\n }\n\n return {\n classId: personnelClassId,\n required: quantity ?? 1,\n qualified: qualified.length,\n expiringSoon,\n sample: qualified.slice(0, 5)\n }\n })\n\n return {\n operation,\n personnel,\n assets: await assetReadiness(manager, domain, operation, at),\n standardMinutes: minutesOf(operation.duration),\n peopleTotal,\n peopleScanned: people.length\n }\n}\n\n/** 선언된 요구 자산을 읽는다. 등급 이름이 없는 줄은 걸러 낸다 — 아무도 못 채우는 요구가 된다. */\nfunction assetSpecificationOf(raw: readonly Record<string, unknown>[] | undefined) {\n const entries: { classId: string; quantity: number }[] = []\n\n for (const row of raw ?? []) {\n const classId = row?.physicalAssetClassId ?? row?.assetClassId ?? row?.classId\n if (typeof classId !== 'string' || !classId) {\n continue\n }\n const quantity = Number(row?.quantity)\n entries.push({ classId, quantity: Number.isFinite(quantity) && quantity > 0 ? quantity : 1 })\n }\n\n return entries\n}\n\nasync function assetReadiness(\n manager: EntityManager,\n domain: Domain,\n operation: OperationDefinition,\n at: string\n): Promise<AssetReadiness[]> {\n const spec = assetSpecificationOf(operation.physicalAssetSpecification)\n if (!spec.length) {\n return []\n }\n\n const [classes, assets] = await Promise.all([\n manager.find(PhysicalAssetClass, { where: { domain: { id: domain.id } } }),\n manager.find(PhysicalAsset, { where: { domain: { id: domain.id } } })\n ])\n\n const classDefs: ResourceClassDef[] = classes.map(toResourceClassDef)\n\n return spec.map(({ classId, quantity }) => {\n let registered = 0\n\n for (const asset of assets) {\n const period = { effectiveStart: iso(asset.effectiveStart), effectiveEnd: iso(asset.effectiveEnd) }\n if (effectivityAt(period, at) !== undefined) {\n continue\n }\n if (classClosure(asset.assetClassIds, classDefs, at).has(classId)) {\n registered += 1\n }\n }\n\n return { classId, required: quantity, registered }\n })\n}\n\n/** ISO 8601 기간을 분으로. 해석할 수 없으면 없다 — 0 분으로 두면 「즉시 끝난다」가 된다. */\nfunction minutesOf(duration: string | undefined): number | undefined {\n const ms = parseIsoDuration(duration)\n\n return ms == null ? undefined : Math.round((ms / 60_000) * 10) / 10\n}\n\nfunction iso(at: Date | undefined): string | undefined {\n return at ? new Date(at).toISOString() : undefined\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Person } from './person';
|
|
2
|
+
import { PersonnelClass } from './personnel-class';
|
|
3
|
+
import { PersonnelQuery } from './personnel-query';
|
|
4
|
+
import { PersonnelClassResolver, PersonResolver } from './personnel-master-resolver';
|
|
5
|
+
export declare const entities: (typeof Person | typeof PersonnelClass)[];
|
|
6
|
+
export declare const resolvers: (typeof PersonnelClassResolver | typeof PersonResolver | typeof PersonnelQuery)[];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolvers = exports.entities = void 0;
|
|
4
|
+
const person_1 = require("./person");
|
|
5
|
+
const personnel_class_1 = require("./personnel-class");
|
|
6
|
+
const personnel_query_1 = require("./personnel-query");
|
|
7
|
+
const personnel_master_resolver_1 = require("./personnel-master-resolver");
|
|
8
|
+
exports.entities = [personnel_class_1.PersonnelClass, person_1.Person];
|
|
9
|
+
exports.resolvers = [personnel_query_1.PersonnelQuery, personnel_master_resolver_1.PersonnelClassResolver, personnel_master_resolver_1.PersonResolver];
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/personnel/index.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;AACjC,uDAAkD;AAClD,uDAAkD;AAClD,2EAAoF;AAEvE,QAAA,QAAQ,GAAG,CAAC,gCAAc,EAAE,eAAM,CAAC,CAAA;AACnC,QAAA,SAAS,GAAG,CAAC,gCAAc,EAAE,kDAAsB,EAAE,0CAAc,CAAC,CAAA","sourcesContent":["import { Person } from './person'\nimport { PersonnelClass } from './personnel-class'\nimport { PersonnelQuery } from './personnel-query'\nimport { PersonnelClassResolver, PersonResolver } from './personnel-master-resolver'\n\nexport const entities = [PersonnelClass, Person]\nexport const resolvers = [PersonnelQuery, PersonnelClassResolver, PersonResolver]\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Domain } from '@things-factory/shell';
|
|
2
|
+
import { User } from '@things-factory/auth-base';
|
|
3
|
+
/**
|
|
4
|
+
* 작업자 — **ISA-95 `Person`**.
|
|
5
|
+
*
|
|
6
|
+
* 사람은 설비와 다르게 산다. 고장 나지 않고 교대로 일하며, 자격이 만료된다. 그래서 자원 넷을 한 그릇에
|
|
7
|
+
* 담지 않는다 — 한쪽의 어휘가 다른 쪽에 붙으면 둘 다 거짓이 된다.
|
|
8
|
+
*
|
|
9
|
+
* 필드 이름은 커널 계약의 `persons` 항목과 같다(`@operato/ops-contract`). 옮길 때 번역이 없다.
|
|
10
|
+
*/
|
|
11
|
+
export declare class Person {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
domain?: Domain;
|
|
14
|
+
domainId?: string;
|
|
15
|
+
/** 표준 `PersonID` — 트윈으로 나갈 때 `persons[].id` 가 된다. */
|
|
16
|
+
name: string;
|
|
17
|
+
/** 사람이 읽는 이름. 표준 `PersonName`. */
|
|
18
|
+
description?: string;
|
|
19
|
+
/**
|
|
20
|
+
* 속한 등급들 — 표준 `PersonnelClassID`(복수).
|
|
21
|
+
*
|
|
22
|
+
* 복수인 것이 중요하다. 한 사람이 용접 자격과 지게차 자격을 함께 갖는 일이 흔하고, 하나만 담으면
|
|
23
|
+
* 그 사람은 한쪽 공정에서 보이지 않는다.
|
|
24
|
+
*/
|
|
25
|
+
personnelClassIds?: string[];
|
|
26
|
+
/** 이 사람이 주로 있는 자리 — 표준 `OperationalLocation`. */
|
|
27
|
+
homeLocation?: string;
|
|
28
|
+
/** 근무 캘린더 — 표준 `WorkCalendar`. 교대 이름과 구간이 여기 있다. */
|
|
29
|
+
workCalendar?: Record<string, unknown>[];
|
|
30
|
+
/** 개체 속성 — 표준 `PersonProperty`. `classPropertyId` 로 등급 속성을 구체화한다. */
|
|
31
|
+
properties?: Record<string, unknown>[];
|
|
32
|
+
/** 이 사람에게 요구되는 `TestSpecification` 참조들 — 표준 `TestSpecificationID`. 참조만 갖는다. */
|
|
33
|
+
testSpecificationIds?: string[];
|
|
34
|
+
/**
|
|
35
|
+
* `TestResult` — 표준 `TestResult`.
|
|
36
|
+
*
|
|
37
|
+
* 등급이 `TestSpecification` 을 요구하는데 그 사람에게 결과가 아예 없으면, 자격이 성립하는지 판단할 수 없다.
|
|
38
|
+
* 만료되었거나 떨어졌으면 그 사람에게 작업이 가지 않는다.
|
|
39
|
+
*/
|
|
40
|
+
testResults?: Record<string, unknown>[];
|
|
41
|
+
/** 언제부터 이 사람이 현장에 있나 — 표준 `EffectiveStartDate`. 입사 예정자를 미리 등록할 수 있다. */
|
|
42
|
+
effectiveStart?: Date;
|
|
43
|
+
/** 언제까지 — 표준 `EffectiveEndDate`. 퇴사한 사람이 영원히 배정 대상으로 남지 않게 한다. */
|
|
44
|
+
effectiveEnd?: Date;
|
|
45
|
+
createdAt?: Date;
|
|
46
|
+
updatedAt?: Date;
|
|
47
|
+
creator?: User;
|
|
48
|
+
creatorId?: string;
|
|
49
|
+
updater?: User;
|
|
50
|
+
updaterId?: string;
|
|
51
|
+
}
|