@things-factory/ops-master 10.1.33 → 10.1.35

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 (150) hide show
  1. package/dist-client/index.d.ts +1 -0
  2. package/dist-client/index.js +1 -0
  3. package/dist-client/index.js.map +1 -1
  4. package/dist-client/master-change-approval.d.ts +14 -0
  5. package/dist-client/master-change-approval.js +36 -0
  6. package/dist-client/master-change-approval.js.map +1 -0
  7. package/dist-client/pages/master/material-definition.d.ts +4 -11
  8. package/dist-client/pages/master/material-definition.js +5 -53
  9. package/dist-client/pages/master/material-definition.js.map +1 -1
  10. package/dist-client/pages/master/material-revision-fields.d.ts +2 -0
  11. package/dist-client/pages/master/material-revision-fields.js +43 -0
  12. package/dist-client/pages/master/material-revision-fields.js.map +1 -0
  13. package/dist-client/pages/master/recipe-definition.d.ts +4 -135
  14. package/dist-client/pages/master/recipe-definition.js +7 -397
  15. package/dist-client/pages/master/recipe-definition.js.map +1 -1
  16. package/dist-client/pages/master/revision-comparison.d.ts +48 -0
  17. package/dist-client/pages/master/revision-comparison.js +553 -0
  18. package/dist-client/pages/master/revision-comparison.js.map +1 -0
  19. package/dist-client/pages/master/revision-view.d.ts +19 -0
  20. package/dist-client/pages/master/revision-view.js +133 -0
  21. package/dist-client/pages/master/revision-view.js.map +1 -0
  22. package/dist-client/pages/master/revision-workspace.d.ts +50 -0
  23. package/dist-client/pages/master/revision-workspace.js +752 -0
  24. package/dist-client/pages/master/revision-workspace.js.map +1 -0
  25. package/dist-client/pages/master/test-specification.d.ts +4 -92
  26. package/dist-client/pages/master/test-specification.js +5 -440
  27. package/dist-client/pages/master/test-specification.js.map +1 -1
  28. package/dist-client/tsconfig.tsbuildinfo +1 -1
  29. package/dist-server/service/asset/asset-master-resolver.js +38 -34
  30. package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
  31. package/dist-server/service/asset/index.d.ts +2 -2
  32. package/dist-server/service/equipment/equipment-master-resolver.js +54 -49
  33. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
  34. package/dist-server/service/equipment/index.d.ts +2 -2
  35. package/dist-server/service/index.d.ts +18 -2
  36. package/dist-server/service/index.js +18 -0
  37. package/dist-server/service/index.js.map +1 -1
  38. package/dist-server/service/location/index.d.ts +1 -1
  39. package/dist-server/service/location/location-master-resolver.js +34 -31
  40. package/dist-server/service/location/location-master-resolver.js.map +1 -1
  41. package/dist-server/service/master-axis.js +1 -1
  42. package/dist-server/service/master-axis.js.map +1 -1
  43. package/dist-server/service/master-change-policy.d.ts +23 -0
  44. package/dist-server/service/master-change-policy.js +134 -0
  45. package/dist-server/service/master-change-policy.js.map +1 -0
  46. package/dist-server/service/master-conformance-resolver.js +11 -1
  47. package/dist-server/service/master-conformance-resolver.js.map +1 -1
  48. package/dist-server/service/master-crud.js +9 -0
  49. package/dist-server/service/master-crud.js.map +1 -1
  50. package/dist-server/service/master-list.js +6 -0
  51. package/dist-server/service/master-list.js.map +1 -1
  52. package/dist-server/service/material/index.d.ts +3 -2
  53. package/dist-server/service/material/index.js +4 -2
  54. package/dist-server/service/material/index.js.map +1 -1
  55. package/dist-server/service/material/material-axis-status.d.ts +8 -0
  56. package/dist-server/service/material/material-axis-status.js +19 -0
  57. package/dist-server/service/material/material-axis-status.js.map +1 -0
  58. package/dist-server/service/material/material-definition.d.ts +3 -0
  59. package/dist-server/service/material/material-definition.js +13 -0
  60. package/dist-server/service/material/material-definition.js.map +1 -1
  61. package/dist-server/service/material/material-effective-list.d.ts +39 -0
  62. package/dist-server/service/material/material-effective-list.js +54 -0
  63. package/dist-server/service/material/material-effective-list.js.map +1 -0
  64. package/dist-server/service/material/material-master-resolver.js +59 -61
  65. package/dist-server/service/material/material-master-resolver.js.map +1 -1
  66. package/dist-server/service/material/material-query.js +9 -2
  67. package/dist-server/service/material/material-query.js.map +1 -1
  68. package/dist-server/service/material/material-revision-content.d.ts +10 -0
  69. package/dist-server/service/material/material-revision-content.js +92 -0
  70. package/dist-server/service/material/material-revision-content.js.map +1 -0
  71. package/dist-server/service/material/material-revision-resolver.d.ts +54 -0
  72. package/dist-server/service/material/material-revision-resolver.js +76 -0
  73. package/dist-server/service/material/material-revision-resolver.js.map +1 -0
  74. package/dist-server/service/material/material-revision-service.d.ts +144 -0
  75. package/dist-server/service/material/material-revision-service.js +534 -0
  76. package/dist-server/service/material/material-revision-service.js.map +1 -0
  77. package/dist-server/service/material/material-revision.d.ts +84 -0
  78. package/dist-server/service/material/material-revision.js +339 -0
  79. package/dist-server/service/material/material-revision.js.map +1 -0
  80. package/dist-server/service/operation/index.d.ts +1 -1
  81. package/dist-server/service/operation/operation-definition.js +1 -0
  82. package/dist-server/service/operation/operation-definition.js.map +1 -1
  83. package/dist-server/service/operation/operation-master-resolver.js +30 -30
  84. package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
  85. package/dist-server/service/personnel/index.d.ts +2 -2
  86. package/dist-server/service/personnel/personnel-master-resolver.js +38 -34
  87. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
  88. package/dist-server/service/quality/nonconformance-cause-resolver.js +17 -14
  89. package/dist-server/service/quality/nonconformance-cause-resolver.js.map +1 -1
  90. package/dist-server/service/recipe/index.d.ts +3 -2
  91. package/dist-server/service/recipe/index.js +4 -2
  92. package/dist-server/service/recipe/index.js.map +1 -1
  93. package/dist-server/service/recipe/recipe-definition.d.ts +4 -0
  94. package/dist-server/service/recipe/recipe-definition.js +14 -1
  95. package/dist-server/service/recipe/recipe-definition.js.map +1 -1
  96. package/dist-server/service/recipe/recipe-effective-list.d.ts +49 -0
  97. package/dist-server/service/recipe/recipe-effective-list.js +96 -0
  98. package/dist-server/service/recipe/recipe-effective-list.js.map +1 -0
  99. package/dist-server/service/recipe/recipe-master-resolver.js +32 -28
  100. package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -1
  101. package/dist-server/service/recipe/recipe-query.js +9 -2
  102. package/dist-server/service/recipe/recipe-query.js.map +1 -1
  103. package/dist-server/service/recipe/recipe-revision-content.d.ts +32 -0
  104. package/dist-server/service/recipe/recipe-revision-content.js +65 -0
  105. package/dist-server/service/recipe/recipe-revision-content.js.map +1 -0
  106. package/dist-server/service/recipe/recipe-revision-line.d.ts +30 -0
  107. package/dist-server/service/recipe/recipe-revision-line.js +95 -0
  108. package/dist-server/service/recipe/recipe-revision-line.js.map +1 -0
  109. package/dist-server/service/recipe/recipe-revision-resolver.d.ts +59 -0
  110. package/dist-server/service/recipe/recipe-revision-resolver.js +76 -0
  111. package/dist-server/service/recipe/recipe-revision-resolver.js.map +1 -0
  112. package/dist-server/service/recipe/recipe-revision-service.d.ts +147 -0
  113. package/dist-server/service/recipe/recipe-revision-service.js +591 -0
  114. package/dist-server/service/recipe/recipe-revision-service.js.map +1 -0
  115. package/dist-server/service/recipe/recipe-revision.d.ts +100 -0
  116. package/dist-server/service/recipe/recipe-revision.js +373 -0
  117. package/dist-server/service/recipe/recipe-revision.js.map +1 -0
  118. package/dist-server/service/recipe/route-definition.js +1 -0
  119. package/dist-server/service/recipe/route-definition.js.map +1 -1
  120. package/dist-server/service/resource/class-members.js +9 -0
  121. package/dist-server/service/resource/class-members.js.map +1 -1
  122. package/dist-server/service/status/master-status.js +2 -1
  123. package/dist-server/service/status/master-status.js.map +1 -1
  124. package/dist-server/service/test-spec/index.d.ts +3 -2
  125. package/dist-server/service/test-spec/index.js +4 -2
  126. package/dist-server/service/test-spec/index.js.map +1 -1
  127. package/dist-server/service/test-spec/test-spec-effective-list.d.ts +34 -0
  128. package/dist-server/service/test-spec/test-spec-effective-list.js +42 -0
  129. package/dist-server/service/test-spec/test-spec-effective-list.js.map +1 -0
  130. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +4 -14
  131. package/dist-server/service/test-spec/test-spec-master-resolver.js +12 -83
  132. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
  133. package/dist-server/service/test-spec/test-spec-query.js +7 -1
  134. package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
  135. package/dist-server/service/test-spec/test-spec-revision-resolver.d.ts +53 -0
  136. package/dist-server/service/test-spec/test-spec-revision-resolver.js +76 -0
  137. package/dist-server/service/test-spec/test-spec-revision-resolver.js.map +1 -0
  138. package/dist-server/service/test-spec/test-spec-revision-service.d.ts +138 -0
  139. package/dist-server/service/test-spec/test-spec-revision-service.js +538 -0
  140. package/dist-server/service/test-spec/test-spec-revision-service.js.map +1 -0
  141. package/dist-server/service/test-spec/test-spec-revision.d.ts +84 -0
  142. package/dist-server/service/test-spec/test-spec-revision.js +334 -0
  143. package/dist-server/service/test-spec/test-spec-revision.js.map +1 -0
  144. package/dist-server/service/test-spec/test-specification.d.ts +6 -0
  145. package/dist-server/service/test-spec/test-specification.js +15 -2
  146. package/dist-server/service/test-spec/test-specification.js.map +1 -1
  147. package/dist-server/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +10 -6
  149. package/translations/en.json +148 -0
  150. package/translations/ko.json +148 -0
@@ -4,11 +4,14 @@ exports.OperationDefinitionResolver = exports.OperationDefinitionList = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const shell_1 = require("@things-factory/shell");
7
+ const type_graphql_2 = require("type-graphql");
8
+ const shell_2 = require("@things-factory/shell");
7
9
  const master_crud_1 = require("../master-crud");
8
10
  const master_axis_1 = require("../master-axis");
9
11
  const master_list_1 = require("../master-list");
10
12
  const operation_definition_1 = require("./operation-definition");
11
13
  const recipe_definition_1 = require("../recipe/recipe-definition");
14
+ const recipe_effective_list_1 = require("../recipe/recipe-effective-list");
12
15
  const route_definition_1 = require("../recipe/route-definition");
13
16
  const referrers_1 = require("../resource/referrers");
14
17
  /**
@@ -25,15 +28,15 @@ let OperationDefinitionList = class OperationDefinitionList {
25
28
  };
26
29
  exports.OperationDefinitionList = OperationDefinitionList;
27
30
  tslib_1.__decorate([
28
- (0, type_graphql_1.Field)(type => [operation_definition_1.OperationDefinition]),
31
+ (0, type_graphql_2.Field)(type => [operation_definition_1.OperationDefinition]),
29
32
  tslib_1.__metadata("design:type", Array)
30
33
  ], OperationDefinitionList.prototype, "items", void 0);
31
34
  tslib_1.__decorate([
32
- (0, type_graphql_1.Field)(type => type_graphql_1.Int),
35
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
33
36
  tslib_1.__metadata("design:type", Number)
34
37
  ], OperationDefinitionList.prototype, "total", void 0);
35
38
  exports.OperationDefinitionList = OperationDefinitionList = tslib_1.__decorate([
36
- (0, type_graphql_1.ObjectType)({ description: 'A page of operation definitions' })
39
+ (0, type_graphql_2.ObjectType)({ description: 'A page of operation definitions' })
37
40
  ], OperationDefinitionList);
38
41
  /**
39
42
  * **이 공정을 누가 쓰나** — 들어오는 관계.
@@ -53,8 +56,8 @@ exports.OperationDefinitionList = OperationDefinitionList = tslib_1.__decorate([
53
56
  */
54
57
  const OPERATION_SCAN_LIMIT = 2000;
55
58
  async function scanOperationUse(domain) {
56
- const routeRepo = (0, shell_1.getRepository)(route_definition_1.RouteDefinition);
57
- const recipeRepo = (0, shell_1.getRepository)(recipe_definition_1.RecipeDefinition);
59
+ const routeRepo = (0, shell_2.getRepository)(route_definition_1.RouteDefinition);
60
+ const recipeRepo = (0, shell_2.getRepository)(recipe_definition_1.RecipeDefinition);
58
61
  const [routeTotal, recipeTotal] = await Promise.all([
59
62
  routeRepo.count({ where: { domain: { id: domain.id } } }),
60
63
  recipeRepo.count({ where: { domain: { id: domain.id } } })
@@ -69,11 +72,7 @@ async function scanOperationUse(domain) {
69
72
  select: ['id', 'name', 'steps'],
70
73
  take: OPERATION_SCAN_LIMIT
71
74
  }),
72
- recipeRepo.find({
73
- where: { domain: { id: domain.id } },
74
- select: ['id', 'name', 'inputs'],
75
- take: OPERATION_SCAN_LIMIT
76
- })
75
+ (0, recipe_effective_list_1.listEffectiveRecipes)(recipeRepo.manager, domain, { pagination: { page: 1, limit: OPERATION_SCAN_LIMIT } }).then(page => page.items)
77
76
  ]);
78
77
  const routes = (0, referrers_1.indexMultiReferrers)(routeRows, one => one.steps ?? [], one => one.name);
79
78
  const recipes = (0, referrers_1.indexMultiReferrers)(recipeRows, one => (one.inputs ?? []).map((part) => part?.operation), one => one.name);
@@ -139,49 +138,50 @@ let OperationDefinitionResolver = class OperationDefinitionResolver {
139
138
  };
140
139
  exports.OperationDefinitionResolver = OperationDefinitionResolver;
141
140
  tslib_1.__decorate([
142
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
143
- (0, type_graphql_1.Query)(returns => OperationDefinitionList, { description: 'To fetch operation definitions' }),
144
- tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
145
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
141
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
142
+ (0, type_graphql_2.Query)(returns => OperationDefinitionList, { description: 'To fetch operation definitions' }),
143
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
144
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
146
145
  tslib_1.__metadata("design:type", Function),
147
- tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
146
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
148
147
  tslib_1.__metadata("design:returntype", Promise)
149
148
  ], OperationDefinitionResolver.prototype, "operationDefinitions", null);
150
149
  tslib_1.__decorate([
151
- (0, type_graphql_1.FieldResolver)(type => [String], { description: 'Routes that include this operation as a step' }),
152
- tslib_1.__param(0, (0, type_graphql_1.Root)()),
153
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
150
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Routes that include this operation as a step' }),
151
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
152
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
154
153
  tslib_1.__metadata("design:type", Function),
155
154
  tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
156
155
  tslib_1.__metadata("design:returntype", Promise)
157
156
  ], OperationDefinitionResolver.prototype, "usedInRoutes", null);
158
157
  tslib_1.__decorate([
159
- (0, type_graphql_1.FieldResolver)(type => [String], { description: 'Recipes that consume materials at this operation' }),
160
- tslib_1.__param(0, (0, type_graphql_1.Root)()),
161
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
158
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'Recipes that consume materials at this operation' }),
159
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
160
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
162
161
  tslib_1.__metadata("design:type", Function),
163
162
  tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
164
163
  tslib_1.__metadata("design:returntype", Promise)
165
164
  ], OperationDefinitionResolver.prototype, "consumedAt", null);
166
165
  tslib_1.__decorate([
167
- (0, type_graphql_1.FieldResolver)(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' }),
168
- tslib_1.__param(0, (0, type_graphql_1.Root)()),
169
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
166
+ (0, type_graphql_2.FieldResolver)(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' }),
167
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
168
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
170
169
  tslib_1.__metadata("design:type", Function),
171
170
  tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
172
171
  tslib_1.__metadata("design:returntype", Promise)
173
172
  ], OperationDefinitionResolver.prototype, "referrerScanCapped", null);
174
173
  tslib_1.__decorate([
175
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
176
- (0, type_graphql_1.Directive)('@transaction'),
177
- (0, type_graphql_1.Mutation)(returns => [operation_definition_1.OperationDefinition], { description: 'To create, change or retire operation definitions' }),
178
- tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
179
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
174
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
175
+ (0, type_graphql_2.Directive)('@transaction'),
176
+ (0, type_graphql_2.Mutation)(returns => [operation_definition_1.OperationDefinition], { description: 'To create, change or retire operation definitions' }),
177
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
178
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
180
179
  tslib_1.__metadata("design:type", Function),
181
180
  tslib_1.__metadata("design:paramtypes", [Array, Object]),
182
181
  tslib_1.__metadata("design:returntype", Promise)
183
182
  ], OperationDefinitionResolver.prototype, "updateMultipleOperationDefinition", null);
184
183
  exports.OperationDefinitionResolver = OperationDefinitionResolver = tslib_1.__decorate([
185
- (0, type_graphql_1.Resolver)(operation_definition_1.OperationDefinition)
184
+ (0, type_graphql_2.Resolver)(operation_definition_1.OperationDefinition),
185
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
186
186
  ], OperationDefinitionResolver);
187
187
  //# sourceMappingURL=operation-master-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Arg, Ctx, Directive, FieldResolver, Int, Mutation, ObjectType, Field, Query, Resolver, Root } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { OperationDefinition } from './operation-definition'\nimport { RecipeDefinition } from '../recipe/recipe-definition'\nimport { RouteDefinition } from '../recipe/route-definition'\nimport { indexMultiReferrers } from '../resource/referrers'\n\n/**\n * 공정 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **이 공정을 누가 쓰나** — 들어오는 관계.\n *\n * ── 왜 필요한가 ────────────────────────────────────────────────────────────\n * 공정 하나를 고치거나 없앨 때 무엇이 딸려 무너지는지 알 수 없었다. 라우팅과 제조법을 하나씩 열어\n * 단계 목록을 눈으로 훑는 수밖에 없었다. 지금 miratek 은 라우팅 다섯에 제조법 다섯이라 그것이\n * 되지만, 제품이 늘면 안 된다.\n *\n * ── 배열 칸이라 훑는다 ─────────────────────────────────────────────────────\n * `RouteDefinition.steps` 와 `RecipeDefinition.inputs[].operation` 은 `simple-json` 이다.\n * 데이터베이스가 그 안을 못 보므로 `IN` 으로 못 좁힌다. 표를 훑어 뒤집는 수밖에 없다.\n *\n * **그래서 상한이 있고, 상한에 걸리면 말한다**(`referrerScanCapped`). 조용히 자르면 「이 공정을\n * 아무도 안 쓴다」와 「너무 많아 다 못 봤다」가 같아 보인다. 앞엣것은 지워도 되는 공정이고\n * 뒤엣것은 지우면 라인이 선다. 품목의 제조법 훑기가 같은 자리에 같은 것을 둔다.\n */\nconst OPERATION_SCAN_LIMIT = 2000\n\ninterface OperationUse {\n /** 이 공정을 단계로 갖는 라우팅들. */\n routes: Map<string, string[]>\n /** 이 공정에서 자재를 넣는 제조법들. */\n recipes: Map<string, string[]>\n /** 상한에 걸려 다 보지 못했나. */\n capped: boolean\n}\n\nasync function scanOperationUse(domain: Domain): Promise<OperationUse> {\n const routeRepo = getRepository(RouteDefinition)\n const recipeRepo = getRepository(RecipeDefinition)\n\n const [routeTotal, recipeTotal] = await Promise.all([\n routeRepo.count({ where: { domain: { id: domain.id } } as any }),\n recipeRepo.count({ where: { domain: { id: domain.id } } as any })\n ])\n\n const [routeRows, recipeRows] = await Promise.all([\n /*\n * `id` 를 함께 뽑는다. 빼면 TypeORM 이 「no such column: distinctAlias.…_id」로 터진다 —\n * `take` 를 쓰면 중복 제거를 위해 기본 키로 한 번 더 감싸는데, 그 키를 안 뽑으면 감쌀 것이 없다.\n */\n routeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'steps'] as any,\n take: OPERATION_SCAN_LIMIT\n }),\n recipeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'inputs'] as any,\n take: OPERATION_SCAN_LIMIT\n })\n ])\n\n const routes = indexMultiReferrers(\n routeRows as any[],\n one => one.steps ?? [],\n one => one.name\n )\n\n const recipes = indexMultiReferrers(\n recipeRows as any[],\n one => (one.inputs ?? []).map((part: any) => part?.operation),\n one => one.name\n )\n\n return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length }\n}\n\n/** 요청 안에서 한 번만 훑는다. **약속을 담는다** — 줄들이 거의 동시에 묻는다. */\nfunction operationUseOf(context: ResolverContext): Promise<OperationUse> {\n const state = context.state as { domain: Domain; operationUse?: Promise<OperationUse> }\n\n state.operationUse = state.operationUse || scanOperationUse(state.domain)\n\n return state.operationUse\n}\n\n@Resolver(OperationDefinition)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * 이 공정을 단계로 갖는 **라우팅들.**\n *\n * 공정을 고치기 전에 무엇이 딸려 오는지 여기서 본다. 여럿일 수 있다 — 같은 공정을 여러 라우팅이\n * 지난다(절단은 표준에도 빠른 것에도 있다).\n *\n * 아무도 안 쓰면 빈 목록이다. 다만 그것이 「안 쓴다」인지 「다 못 봤다」인지는\n * `referrerScanCapped` 가 말한다.\n */\n @FieldResolver(type => [String], { description: 'Routes that include this operation as a step' })\n async usedInRoutes(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).routes.get(operation.name) ?? []\n }\n\n /**\n * 이 공정에서 자재를 넣는 **제조법들.**\n *\n * 라우팅은 「어디를 지나나」이고 이것은 「거기서 무엇이 빠지나」다. 공정을 없애면 그 자재가\n * 빠질 자리를 잃는다.\n */\n @FieldResolver(type => [String], { description: 'Recipes that consume materials at this operation' })\n async consumedAt(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).recipes.get(operation.name) ?? []\n }\n\n /**\n * 라우팅·제조법을 다 보지 못했나.\n *\n * **조용히 자르지 않는다.** 상한에 걸리면 위의 두 칸이 덜 찬 답이고, 그것을 말하지 않으면\n * 「쓰는 데가 없다」와 「못 봤다」가 같아 보인다.\n */\n @FieldResolver(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' })\n async referrerScanCapped(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await operationUseOf(context)).capped\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
1
+ {"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { Args, Arg, Ctx, Directive, FieldResolver, Int, Mutation, ObjectType, Field, Query, Resolver, Root } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { OperationDefinition } from './operation-definition'\nimport { RecipeDefinition } from '../recipe/recipe-definition'\nimport { listEffectiveRecipes } from '../recipe/recipe-effective-list'\nimport { RouteDefinition } from '../recipe/route-definition'\nimport { indexMultiReferrers } from '../resource/referrers'\n\n/**\n * 공정 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **이 공정을 누가 쓰나** — 들어오는 관계.\n *\n * ── 왜 필요한가 ────────────────────────────────────────────────────────────\n * 공정 하나를 고치거나 없앨 때 무엇이 딸려 무너지는지 알 수 없었다. 라우팅과 제조법을 하나씩 열어\n * 단계 목록을 눈으로 훑는 수밖에 없었다. 지금 miratek 은 라우팅 다섯에 제조법 다섯이라 그것이\n * 되지만, 제품이 늘면 안 된다.\n *\n * ── 배열 칸이라 훑는다 ─────────────────────────────────────────────────────\n * `RouteDefinition.steps` 와 `RecipeDefinition.inputs[].operation` 은 `simple-json` 이다.\n * 데이터베이스가 그 안을 못 보므로 `IN` 으로 못 좁힌다. 표를 훑어 뒤집는 수밖에 없다.\n *\n * **그래서 상한이 있고, 상한에 걸리면 말한다**(`referrerScanCapped`). 조용히 자르면 「이 공정을\n * 아무도 안 쓴다」와 「너무 많아 다 못 봤다」가 같아 보인다. 앞엣것은 지워도 되는 공정이고\n * 뒤엣것은 지우면 라인이 선다. 품목의 제조법 훑기가 같은 자리에 같은 것을 둔다.\n */\nconst OPERATION_SCAN_LIMIT = 2000\n\ninterface OperationUse {\n /** 이 공정을 단계로 갖는 라우팅들. */\n routes: Map<string, string[]>\n /** 이 공정에서 자재를 넣는 제조법들. */\n recipes: Map<string, string[]>\n /** 상한에 걸려 다 보지 못했나. */\n capped: boolean\n}\n\nasync function scanOperationUse(domain: Domain): Promise<OperationUse> {\n const routeRepo = getRepository(RouteDefinition)\n const recipeRepo = getRepository(RecipeDefinition)\n\n const [routeTotal, recipeTotal] = await Promise.all([\n routeRepo.count({ where: { domain: { id: domain.id } } as any }),\n recipeRepo.count({ where: { domain: { id: domain.id } } as any })\n ])\n\n const [routeRows, recipeRows] = await Promise.all([\n /*\n * `id` 를 함께 뽑는다. 빼면 TypeORM 이 「no such column: distinctAlias.…_id」로 터진다 —\n * `take` 를 쓰면 중복 제거를 위해 기본 키로 한 번 더 감싸는데, 그 키를 안 뽑으면 감쌀 것이 없다.\n */\n routeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'steps'] as any,\n take: OPERATION_SCAN_LIMIT\n }),\n listEffectiveRecipes(recipeRepo.manager, domain, { pagination: { page:1, limit:OPERATION_SCAN_LIMIT } } as any).then(page => page.items)\n ])\n\n const routes = indexMultiReferrers(\n routeRows as any[],\n one => one.steps ?? [],\n one => one.name\n )\n\n const recipes = indexMultiReferrers(\n recipeRows as any[],\n one => (one.inputs ?? []).map((part: any) => part?.operation),\n one => one.name\n )\n\n return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length }\n}\n\n/** 요청 안에서 한 번만 훑는다. **약속을 담는다** — 줄들이 거의 동시에 묻는다. */\nfunction operationUseOf(context: ResolverContext): Promise<OperationUse> {\n const state = context.state as { domain: Domain; operationUse?: Promise<OperationUse> }\n\n state.operationUse = state.operationUse || scanOperationUse(state.domain)\n\n return state.operationUse\n}\n\n@Resolver(OperationDefinition)\n@UseMiddleware(SpeakRefusals)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * 이 공정을 단계로 갖는 **라우팅들.**\n *\n * 공정을 고치기 전에 무엇이 딸려 오는지 여기서 본다. 여럿일 수 있다 — 같은 공정을 여러 라우팅이\n * 지난다(절단은 표준에도 빠른 것에도 있다).\n *\n * 아무도 안 쓰면 빈 목록이다. 다만 그것이 「안 쓴다」인지 「다 못 봤다」인지는\n * `referrerScanCapped` 가 말한다.\n */\n @FieldResolver(type => [String], { description: 'Routes that include this operation as a step' })\n async usedInRoutes(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).routes.get(operation.name) ?? []\n }\n\n /**\n * 이 공정에서 자재를 넣는 **제조법들.**\n *\n * 라우팅은 「어디를 지나나」이고 이것은 「거기서 무엇이 빠지나」다. 공정을 없애면 그 자재가\n * 빠질 자리를 잃는다.\n */\n @FieldResolver(type => [String], { description: 'Recipes that consume materials at this operation' })\n async consumedAt(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).recipes.get(operation.name) ?? []\n }\n\n /**\n * 라우팅·제조법을 다 보지 못했나.\n *\n * **조용히 자르지 않는다.** 상한에 걸리면 위의 두 칸이 덜 찬 답이고, 그것을 말하지 않으면\n * 「쓰는 데가 없다」와 「못 봤다」가 같아 보인다.\n */\n @FieldResolver(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' })\n async referrerScanCapped(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await operationUseOf(context)).capped\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
@@ -2,5 +2,5 @@ import { Person } from './person';
2
2
  import { PersonnelClass } from './personnel-class';
3
3
  import { PersonnelQuery } from './personnel-query';
4
4
  import { PersonnelClassResolver, PersonResolver } from './personnel-master-resolver';
5
- export declare const entities: (typeof PersonnelClass | typeof Person)[];
6
- export declare const resolvers: (typeof PersonnelQuery | typeof PersonnelClassResolver | typeof PersonResolver)[];
5
+ export declare const entities: (typeof Person | typeof PersonnelClass)[];
6
+ export declare const resolvers: (typeof PersonnelClassResolver | typeof PersonResolver | typeof PersonnelQuery)[];
@@ -4,6 +4,8 @@ exports.PersonResolver = exports.PersonList = exports.PersonnelClassResolver = e
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const shell_1 = require("@things-factory/shell");
7
+ const type_graphql_2 = require("type-graphql");
8
+ const shell_2 = require("@things-factory/shell");
7
9
  const master_crud_1 = require("../master-crud");
8
10
  const master_axis_1 = require("../master-axis");
9
11
  const master_list_1 = require("../master-list");
@@ -24,15 +26,15 @@ let PersonnelClassList = class PersonnelClassList {
24
26
  };
25
27
  exports.PersonnelClassList = PersonnelClassList;
26
28
  tslib_1.__decorate([
27
- (0, type_graphql_1.Field)(type => [personnel_class_1.PersonnelClass]),
29
+ (0, type_graphql_2.Field)(type => [personnel_class_1.PersonnelClass]),
28
30
  tslib_1.__metadata("design:type", Array)
29
31
  ], PersonnelClassList.prototype, "items", void 0);
30
32
  tslib_1.__decorate([
31
- (0, type_graphql_1.Field)(type => type_graphql_1.Int),
33
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
32
34
  tslib_1.__metadata("design:type", Number)
33
35
  ], PersonnelClassList.prototype, "total", void 0);
34
36
  exports.PersonnelClassList = PersonnelClassList = tslib_1.__decorate([
35
- (0, type_graphql_1.ObjectType)({ description: 'A page of personnel classes' })
37
+ (0, type_graphql_2.ObjectType)({ description: 'A page of personnel classes' })
36
38
  ], PersonnelClassList);
37
39
  /**
38
40
  * **이 등급에 무엇이 드나** — 들어오는 관계.
@@ -84,56 +86,57 @@ let PersonnelClassResolver = class PersonnelClassResolver {
84
86
  };
85
87
  exports.PersonnelClassResolver = PersonnelClassResolver;
86
88
  tslib_1.__decorate([
87
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
88
- (0, type_graphql_1.Query)(returns => PersonnelClassList, { description: 'To fetch personnel classes' }),
89
- tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
90
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
89
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
90
+ (0, type_graphql_2.Query)(returns => PersonnelClassList, { description: 'To fetch personnel classes' }),
91
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
92
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
91
93
  tslib_1.__metadata("design:type", Function),
92
- tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
94
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
93
95
  tslib_1.__metadata("design:returntype", Promise)
94
96
  ], PersonnelClassResolver.prototype, "personnelClasses", null);
95
97
  tslib_1.__decorate([
96
- (0, type_graphql_1.FieldResolver)(type => [String], { description: 'People holding this class' }),
97
- tslib_1.__param(0, (0, type_graphql_1.Root)()),
98
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
98
+ (0, type_graphql_2.FieldResolver)(type => [String], { description: 'People holding this class' }),
99
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
100
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
99
101
  tslib_1.__metadata("design:type", Function),
100
102
  tslib_1.__metadata("design:paramtypes", [personnel_class_1.PersonnelClass, Object]),
101
103
  tslib_1.__metadata("design:returntype", Promise)
102
104
  ], PersonnelClassResolver.prototype, "members", null);
103
105
  tslib_1.__decorate([
104
- (0, type_graphql_1.FieldResolver)(type => Boolean, { description: 'True when members were too many to scan fully' }),
105
- tslib_1.__param(0, (0, type_graphql_1.Root)()),
106
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
106
+ (0, type_graphql_2.FieldResolver)(type => Boolean, { description: 'True when members were too many to scan fully' }),
107
+ tslib_1.__param(0, (0, type_graphql_2.Root)()),
108
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
107
109
  tslib_1.__metadata("design:type", Function),
108
110
  tslib_1.__metadata("design:paramtypes", [personnel_class_1.PersonnelClass, Object]),
109
111
  tslib_1.__metadata("design:returntype", Promise)
110
112
  ], PersonnelClassResolver.prototype, "memberScanCapped", null);
111
113
  tslib_1.__decorate([
112
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
113
- (0, type_graphql_1.Directive)('@transaction'),
114
- (0, type_graphql_1.Mutation)(returns => [personnel_class_1.PersonnelClass], { description: 'To create, change or retire personnel classes' }),
115
- tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
116
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
114
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
115
+ (0, type_graphql_2.Directive)('@transaction'),
116
+ (0, type_graphql_2.Mutation)(returns => [personnel_class_1.PersonnelClass], { description: 'To create, change or retire personnel classes' }),
117
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
118
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
117
119
  tslib_1.__metadata("design:type", Function),
118
120
  tslib_1.__metadata("design:paramtypes", [Array, Object]),
119
121
  tslib_1.__metadata("design:returntype", Promise)
120
122
  ], PersonnelClassResolver.prototype, "updateMultiplePersonnelClass", null);
121
123
  exports.PersonnelClassResolver = PersonnelClassResolver = tslib_1.__decorate([
122
- (0, type_graphql_1.Resolver)(personnel_class_1.PersonnelClass)
124
+ (0, type_graphql_2.Resolver)(personnel_class_1.PersonnelClass),
125
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
123
126
  ], PersonnelClassResolver);
124
127
  let PersonList = class PersonList {
125
128
  };
126
129
  exports.PersonList = PersonList;
127
130
  tslib_1.__decorate([
128
- (0, type_graphql_1.Field)(type => [person_1.Person]),
131
+ (0, type_graphql_2.Field)(type => [person_1.Person]),
129
132
  tslib_1.__metadata("design:type", Array)
130
133
  ], PersonList.prototype, "items", void 0);
131
134
  tslib_1.__decorate([
132
- (0, type_graphql_1.Field)(type => type_graphql_1.Int),
135
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
133
136
  tslib_1.__metadata("design:type", Number)
134
137
  ], PersonList.prototype, "total", void 0);
135
138
  exports.PersonList = PersonList = tslib_1.__decorate([
136
- (0, type_graphql_1.ObjectType)({ description: 'A page of people' })
139
+ (0, type_graphql_2.ObjectType)({ description: 'A page of people' })
137
140
  ], PersonList);
138
141
  let PersonResolver = class PersonResolver {
139
142
  async persons(params, context) {
@@ -159,25 +162,26 @@ let PersonResolver = class PersonResolver {
159
162
  };
160
163
  exports.PersonResolver = PersonResolver;
161
164
  tslib_1.__decorate([
162
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
163
- (0, type_graphql_1.Query)(returns => PersonList, { description: 'To fetch people' }),
164
- tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
165
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
165
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
166
+ (0, type_graphql_2.Query)(returns => PersonList, { description: 'To fetch people' }),
167
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
168
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
166
169
  tslib_1.__metadata("design:type", Function),
167
- tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
170
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
168
171
  tslib_1.__metadata("design:returntype", Promise)
169
172
  ], PersonResolver.prototype, "persons", null);
170
173
  tslib_1.__decorate([
171
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
172
- (0, type_graphql_1.Directive)('@transaction'),
173
- (0, type_graphql_1.Mutation)(returns => [person_1.Person], { description: 'To create, change or retire people' }),
174
- tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
175
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
174
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
175
+ (0, type_graphql_2.Directive)('@transaction'),
176
+ (0, type_graphql_2.Mutation)(returns => [person_1.Person], { description: 'To create, change or retire people' }),
177
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
178
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
176
179
  tslib_1.__metadata("design:type", Function),
177
180
  tslib_1.__metadata("design:paramtypes", [Array, Object]),
178
181
  tslib_1.__metadata("design:returntype", Promise)
179
182
  ], PersonResolver.prototype, "updateMultiplePerson", null);
180
183
  exports.PersonResolver = PersonResolver = tslib_1.__decorate([
181
- (0, type_graphql_1.Resolver)(person_1.Person)
184
+ (0, type_graphql_2.Resolver)(person_1.Person),
185
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
182
186
  ], PersonResolver);
183
187
  //# sourceMappingURL=personnel-master-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"personnel-master-resolver.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { FieldResolver, Root, Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { ClassMembers, scanClassMembers } from '../resource/class-members'\nimport { PersonnelClass } from './personnel-class'\nimport { Person } from './person'\n\n/**\n * 인원 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of personnel classes' })\nexport class PersonnelClassList {\n @Field(type => [PersonnelClass])\n items: PersonnelClass[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **이 등급에 무엇이 드나** — 들어오는 관계.\n *\n * 등급을 만들어 놓고 아무도 안 들어 있는 일이 실제로 있었다. 화면에는 등급 이름만 있어서 그 사실이\n * 안 보였다. 없앨 때 무엇이 딸려 자격을 잃는지도 알 수 없었다.\n *\n * 세는 방식과 상한은 `class-members.ts` 머리말에 적었다 — 등급 넷이 같은 함수를 쓴다.\n */\nfunction personnelClassMembersOf(context: ResolverContext): Promise<ClassMembers> {\n const state = context.state as { domain: Domain; personnelClassMembers?: Promise<ClassMembers> }\n\n state.personnelClassMembers = state.personnelClassMembers || scanClassMembers(Person, 'personnelClassIds', state.domain)\n\n return state.personnelClassMembers\n}\n\n@Resolver(PersonnelClass)\nexport class PersonnelClassResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonnelClassList, { description: 'To fetch personnel classes' })\n async personnelClasses(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonnelClassList> {\n const { domain } = context.state\n const { items, total } = await listMaster('personnelClass', params, domain)\n\n return { items: items as PersonnelClass[], total }\n }\n\n /**\n * 이 등급을 가진 사람들\n *\n * 아무도 안 들면 빈 목록이다. 다만 그것이 「없다」인지 「다 못 봤다」인지는 `memberScanCapped`\n * 가 말한다 — 조용히 자르면 고쳐야 할 선언과 멀쩡한 등급이 같아 보인다.\n */\n @FieldResolver(type => [String], { description: 'People holding this class' })\n async members(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await personnelClassMembersOf(context)).members.get(klass.name) ?? []\n }\n\n /** 소속을 다 보지 못했나. */\n @FieldResolver(type => Boolean, { description: 'True when members were too many to scan fully' })\n async memberScanCapped(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await personnelClassMembersOf(context)).capped\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [PersonnelClass], { description: 'To create, change or retire personnel classes' })\n async updateMultiplePersonnelClass(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<PersonnelClass[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('personnelClass')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as PersonnelClass[]\n }\n}\n\n@ObjectType({ description: 'A page of people' })\nexport class PersonList {\n @Field(type => [Person])\n items: Person[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(Person)\nexport class PersonResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonList, { description: 'To fetch people' })\n async persons(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonList> {\n const { domain } = context.state\n const { items, total } = await listMaster('person', params, domain)\n\n return { items: items as Person[], total }\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [Person], { description: 'To create, change or retire people' })\n async updateMultiplePerson(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Person[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('person')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as Person[]\n }\n}\n"]}
1
+ {"version":3,"file":"personnel-master-resolver.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { FieldResolver, Root, Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { ClassMembers, scanClassMembers } from '../resource/class-members'\nimport { PersonnelClass } from './personnel-class'\nimport { Person } from './person'\n\n/**\n * 인원 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of personnel classes' })\nexport class PersonnelClassList {\n @Field(type => [PersonnelClass])\n items: PersonnelClass[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **이 등급에 무엇이 드나** — 들어오는 관계.\n *\n * 등급을 만들어 놓고 아무도 안 들어 있는 일이 실제로 있었다. 화면에는 등급 이름만 있어서 그 사실이\n * 안 보였다. 없앨 때 무엇이 딸려 자격을 잃는지도 알 수 없었다.\n *\n * 세는 방식과 상한은 `class-members.ts` 머리말에 적었다 — 등급 넷이 같은 함수를 쓴다.\n */\nfunction personnelClassMembersOf(context: ResolverContext): Promise<ClassMembers> {\n const state = context.state as { domain: Domain; personnelClassMembers?: Promise<ClassMembers> }\n\n state.personnelClassMembers = state.personnelClassMembers || scanClassMembers(Person, 'personnelClassIds', state.domain)\n\n return state.personnelClassMembers\n}\n\n@Resolver(PersonnelClass)\n@UseMiddleware(SpeakRefusals)\nexport class PersonnelClassResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonnelClassList, { description: 'To fetch personnel classes' })\n async personnelClasses(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonnelClassList> {\n const { domain } = context.state\n const { items, total } = await listMaster('personnelClass', params, domain)\n\n return { items: items as PersonnelClass[], total }\n }\n\n /**\n * 이 등급을 가진 사람들\n *\n * 아무도 안 들면 빈 목록이다. 다만 그것이 「없다」인지 「다 못 봤다」인지는 `memberScanCapped`\n * 가 말한다 — 조용히 자르면 고쳐야 할 선언과 멀쩡한 등급이 같아 보인다.\n */\n @FieldResolver(type => [String], { description: 'People holding this class' })\n async members(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await personnelClassMembersOf(context)).members.get(klass.name) ?? []\n }\n\n /** 소속을 다 보지 못했나. */\n @FieldResolver(type => Boolean, { description: 'True when members were too many to scan fully' })\n async memberScanCapped(@Root() klass: PersonnelClass, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await personnelClassMembersOf(context)).capped\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [PersonnelClass], { description: 'To create, change or retire personnel classes' })\n async updateMultiplePersonnelClass(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<PersonnelClass[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('personnelClass')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as PersonnelClass[]\n }\n}\n\n@ObjectType({ description: 'A page of people' })\nexport class PersonList {\n @Field(type => [Person])\n items: Person[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(Person)\n@UseMiddleware(SpeakRefusals)\nexport class PersonResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => PersonList, { description: 'To fetch people' })\n async persons(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<PersonList> {\n const { domain } = context.state\n const { items, total } = await listMaster('person', params, domain)\n\n return { items: items as Person[], total }\n }\n\n /**\n * 그리드가 보낸 변경을 한 번에 적용한다.\n *\n * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을\n * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는\n * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [Person], { description: 'To create, change or retire people' })\n async updateMultiplePerson(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Person[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('person')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as Person[]\n }\n}\n"]}
@@ -4,6 +4,8 @@ exports.NonconformanceCauseResolver = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const type_graphql_1 = require("type-graphql");
6
6
  const shell_1 = require("@things-factory/shell");
7
+ const type_graphql_2 = require("type-graphql");
8
+ const shell_2 = require("@things-factory/shell");
7
9
  const master_crud_1 = require("../master-crud");
8
10
  const master_axis_1 = require("../master-axis");
9
11
  const master_list_1 = require("../master-list");
@@ -11,15 +13,15 @@ const nonconformance_cause_1 = require("./nonconformance-cause");
11
13
  let NonconformanceCauseList = class NonconformanceCauseList {
12
14
  };
13
15
  tslib_1.__decorate([
14
- (0, type_graphql_1.Field)(type => [nonconformance_cause_1.NonconformanceCause]),
16
+ (0, type_graphql_2.Field)(type => [nonconformance_cause_1.NonconformanceCause]),
15
17
  tslib_1.__metadata("design:type", Array)
16
18
  ], NonconformanceCauseList.prototype, "items", void 0);
17
19
  tslib_1.__decorate([
18
- (0, type_graphql_1.Field)(type => type_graphql_1.Int),
20
+ (0, type_graphql_2.Field)(type => type_graphql_2.Int),
19
21
  tslib_1.__metadata("design:type", Number)
20
22
  ], NonconformanceCauseList.prototype, "total", void 0);
21
23
  NonconformanceCauseList = tslib_1.__decorate([
22
- (0, type_graphql_1.ObjectType)()
24
+ (0, type_graphql_2.ObjectType)()
23
25
  ], NonconformanceCauseList);
24
26
  let NonconformanceCauseResolver = class NonconformanceCauseResolver {
25
27
  async nonconformanceCauseList(params, context) {
@@ -33,25 +35,26 @@ let NonconformanceCauseResolver = class NonconformanceCauseResolver {
33
35
  };
34
36
  exports.NonconformanceCauseResolver = NonconformanceCauseResolver;
35
37
  tslib_1.__decorate([
36
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
37
- (0, type_graphql_1.Query)(returns => NonconformanceCauseList),
38
- tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
39
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
38
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
39
+ (0, type_graphql_2.Query)(returns => NonconformanceCauseList),
40
+ tslib_1.__param(0, (0, type_graphql_2.Args)(type => shell_2.ListParam)),
41
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
40
42
  tslib_1.__metadata("design:type", Function),
41
- tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
43
+ tslib_1.__metadata("design:paramtypes", [shell_2.ListParam, Object]),
42
44
  tslib_1.__metadata("design:returntype", Promise)
43
45
  ], NonconformanceCauseResolver.prototype, "nonconformanceCauseList", null);
44
46
  tslib_1.__decorate([
45
- (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
46
- (0, type_graphql_1.Directive)('@transaction'),
47
- (0, type_graphql_1.Mutation)(returns => [nonconformance_cause_1.NonconformanceCause]),
48
- tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
49
- tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
47
+ (0, type_graphql_2.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
48
+ (0, type_graphql_2.Directive)('@transaction'),
49
+ (0, type_graphql_2.Mutation)(returns => [nonconformance_cause_1.NonconformanceCause]),
50
+ tslib_1.__param(0, (0, type_graphql_2.Arg)('patches', type => [shell_2.ScalarObject])),
51
+ tslib_1.__param(1, (0, type_graphql_2.Ctx)()),
50
52
  tslib_1.__metadata("design:type", Function),
51
53
  tslib_1.__metadata("design:paramtypes", [Array, Object]),
52
54
  tslib_1.__metadata("design:returntype", Promise)
53
55
  ], NonconformanceCauseResolver.prototype, "updateMultipleNonconformanceCause", null);
54
56
  exports.NonconformanceCauseResolver = NonconformanceCauseResolver = tslib_1.__decorate([
55
- (0, type_graphql_1.Resolver)(nonconformance_cause_1.NonconformanceCause)
57
+ (0, type_graphql_2.Resolver)(nonconformance_cause_1.NonconformanceCause),
58
+ (0, type_graphql_1.UseMiddleware)(shell_1.SpeakRefusals)
56
59
  ], NonconformanceCauseResolver);
57
60
  //# sourceMappingURL=nonconformance-cause-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nonconformance-cause-resolver.js","sourceRoot":"","sources":["../../../server/service/quality/nonconformance-cause-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2G;AAC3G,iDAA+D;AAC/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,iEAA4D;AAG5D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAA0G,CAAA;AAAjE;IAArC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;;sDAA8B;AAAqB;IAAnB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;sDAAc;AAA/H,uBAAuB;IAD5B,IAAA,yBAAU,GAAE;GACP,uBAAuB,CAA0G;AAGhI,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGhC,AAAN,KAAK,CAAC,uBAAuB,CAA0B,MAAiB,EAAS,OAAwB;QACvG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC9F,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAIK,AAAN,KAAK,CAAC,iCAAiC,CAAyC,OAAsB,EAAS,OAAwB;QACrI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,OAAO,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAA,0BAAY,EAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAA0B,CAAA;IAC9J,CAAC;CACF,CAAA;AAdY,kEAA2B;AAGhC;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,CAAC;IACX,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;0EAGvE;AAIK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;IACF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oFAG7G;sCAbU,2BAA2B;IADvC,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,2BAA2B,CAcvC","sourcesContent":["import { Arg, Args, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\nimport { ListParam, ScalarObject } from '@things-factory/shell'\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { NonconformanceCause } from './nonconformance-cause'\n\n@ObjectType()\nclass NonconformanceCauseList { @Field(type => [NonconformanceCause]) items: NonconformanceCause[]; @Field(type => Int) total: number }\n\n@Resolver(NonconformanceCause)\nexport class NonconformanceCauseResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => NonconformanceCauseList)\n async nonconformanceCauseList(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<NonconformanceCauseList> {\n const { items, total } = await listMaster('nonconformanceCause', params, context.state.domain)\n return { items: items as NonconformanceCause[], total }\n }\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [NonconformanceCause])\n async updateMultipleNonconformanceCause(@Arg('patches', type => [ScalarObject]) patches: MasterPatch[], @Ctx() context: ResolverContext): Promise<NonconformanceCause[]> {\n const { domain, user, tx } = context.state\n return await saveMasterPatches(tx, domain, masterAxisOf('nonconformanceCause').entity, patches, user, { hasEffectivePeriod: true }) as NonconformanceCause[]\n }\n}\n"]}
1
+ {"version":3,"file":"nonconformance-cause-resolver.js","sourceRoot":"","sources":["../../../server/service/quality/nonconformance-cause-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA4C;AAC5C,iDAAqD;AACrD,+CAA2G;AAC3G,iDAA+D;AAC/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,iEAA4D;AAG5D,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAA0G,CAAA;AAAjE;IAArC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;;sDAA8B;AAAqB;IAAnB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;sDAAc;AAA/H,uBAAuB;IAD5B,IAAA,yBAAU,GAAE;GACP,uBAAuB,CAA0G;AAIhI,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGhC,AAAN,KAAK,CAAC,uBAAuB,CAA0B,MAAiB,EAAS,OAAwB;QACvG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAC9F,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAIK,AAAN,KAAK,CAAC,iCAAiC,CAAyC,OAAsB,EAAS,OAAwB;QACrI,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,OAAO,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAA,0BAAY,EAAC,qBAAqB,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAA0B,CAAA;IAC9J,CAAC;CACF,CAAA;AAdY,kEAA2B;AAGhC;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,CAAC;IACX,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;0EAGvE;AAIK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;IACF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IAA0B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oFAG7G;sCAbU,2BAA2B;IAFvC,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;IAC7B,IAAA,4BAAa,EAAC,qBAAa,CAAC;GAChB,2BAA2B,CAcvC","sourcesContent":["import { UseMiddleware } from 'type-graphql'\nimport { SpeakRefusals } from '@things-factory/shell'\nimport { Arg, Args, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\nimport { ListParam, ScalarObject } from '@things-factory/shell'\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { NonconformanceCause } from './nonconformance-cause'\n\n@ObjectType()\nclass NonconformanceCauseList { @Field(type => [NonconformanceCause]) items: NonconformanceCause[]; @Field(type => Int) total: number }\n\n@Resolver(NonconformanceCause)\n@UseMiddleware(SpeakRefusals)\nexport class NonconformanceCauseResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => NonconformanceCauseList)\n async nonconformanceCauseList(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<NonconformanceCauseList> {\n const { items, total } = await listMaster('nonconformanceCause', params, context.state.domain)\n return { items: items as NonconformanceCause[], total }\n }\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [NonconformanceCause])\n async updateMultipleNonconformanceCause(@Arg('patches', type => [ScalarObject]) patches: MasterPatch[], @Ctx() context: ResolverContext): Promise<NonconformanceCause[]> {\n const { domain, user, tx } = context.state\n return await saveMasterPatches(tx, domain, masterAxisOf('nonconformanceCause').entity, patches, user, { hasEffectivePeriod: true }) as NonconformanceCause[]\n }\n}\n"]}
@@ -2,8 +2,9 @@ import { RecipeDefinition } from './recipe-definition';
2
2
  import { RouteDefinition } from './route-definition';
3
3
  import { RecipeDefinitionResolver, RouteDefinitionResolver } from './recipe-master-resolver';
4
4
  import { RecipeQuery } from './recipe-query';
5
- export declare const entities: (typeof RouteDefinition | typeof RecipeDefinition)[];
6
- export declare const resolvers: (typeof RecipeQuery | typeof RecipeDefinitionResolver | typeof RouteDefinitionResolver)[];
5
+ import { RecipeRevisionResolver } from './recipe-revision-resolver';
6
+ export declare const entities: (typeof RecipeDefinition | typeof RouteDefinition | typeof import("./recipe-revision-line").RecipeRevisionOutput | typeof import("./recipe-revision").RecipeRevision | typeof import("./recipe-revision").RecipePlan | typeof import("./recipe-revision").RecipeSegment | typeof import("./recipe-revision").RecipeBasis)[];
7
+ export declare const resolvers: (typeof RecipeDefinitionResolver | typeof RouteDefinitionResolver | typeof RecipeRevisionResolver | typeof RecipeQuery)[];
7
8
  export * from './recipe-definition';
8
9
  export * from './route-definition';
9
10
  export * from './recipe-master';
@@ -6,8 +6,10 @@ const recipe_definition_1 = require("./recipe-definition");
6
6
  const route_definition_1 = require("./route-definition");
7
7
  const recipe_master_resolver_1 = require("./recipe-master-resolver");
8
8
  const recipe_query_1 = require("./recipe-query");
9
- exports.entities = [recipe_definition_1.RecipeDefinition, route_definition_1.RouteDefinition];
10
- exports.resolvers = [recipe_master_resolver_1.RecipeDefinitionResolver, recipe_master_resolver_1.RouteDefinitionResolver, recipe_query_1.RecipeQuery];
9
+ const recipe_revision_1 = require("./recipe-revision");
10
+ const recipe_revision_resolver_1 = require("./recipe-revision-resolver");
11
+ exports.entities = [recipe_definition_1.RecipeDefinition, route_definition_1.RouteDefinition, ...recipe_revision_1.RECIPE_REVISION_ENTITIES];
12
+ exports.resolvers = [recipe_master_resolver_1.RecipeDefinitionResolver, recipe_master_resolver_1.RouteDefinitionResolver, recipe_query_1.RecipeQuery, recipe_revision_resolver_1.RecipeRevisionResolver];
11
13
  tslib_1.__exportStar(require("./recipe-definition"), exports);
12
14
  tslib_1.__exportStar(require("./route-definition"), exports);
13
15
  tslib_1.__exportStar(require("./recipe-master"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/recipe/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAsD;AACtD,yDAAoD;AACpD,qEAA4F;AAC5F,iDAA4C;AAE/B,QAAA,QAAQ,GAAG,CAAC,oCAAgB,EAAE,kCAAe,CAAC,CAAA;AAC9C,QAAA,SAAS,GAAG,CAAC,iDAAwB,EAAE,gDAAuB,EAAE,0BAAW,CAAC,CAAA;AAEzF,8DAAmC;AACnC,6DAAkC;AAClC,0DAA+B","sourcesContent":["import { RecipeDefinition } from './recipe-definition'\nimport { RouteDefinition } from './route-definition'\nimport { RecipeDefinitionResolver, RouteDefinitionResolver } from './recipe-master-resolver'\nimport { RecipeQuery } from './recipe-query'\n\nexport const entities = [RecipeDefinition, RouteDefinition]\nexport const resolvers = [RecipeDefinitionResolver, RouteDefinitionResolver, RecipeQuery]\n\nexport * from './recipe-definition'\nexport * from './route-definition'\nexport * from './recipe-master'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/recipe/index.ts"],"names":[],"mappings":";;;;AAAA,2DAAsD;AACtD,yDAAoD;AACpD,qEAA4F;AAC5F,iDAA4C;AAC5C,uDAA4D;AAC5D,yEAAmE;AAEtD,QAAA,QAAQ,GAAG,CAAC,oCAAgB,EAAE,kCAAe,EAAE,GAAG,0CAAwB,CAAC,CAAA;AAC3E,QAAA,SAAS,GAAG,CAAC,iDAAwB,EAAE,gDAAuB,EAAE,0BAAW,EAAE,iDAAsB,CAAC,CAAA;AAEjH,8DAAmC;AACnC,6DAAkC;AAClC,0DAA+B","sourcesContent":["import { RecipeDefinition } from './recipe-definition'\nimport { RouteDefinition } from './route-definition'\nimport { RecipeDefinitionResolver, RouteDefinitionResolver } from './recipe-master-resolver'\nimport { RecipeQuery } from './recipe-query'\nimport { RECIPE_REVISION_ENTITIES } from './recipe-revision'\nimport { RecipeRevisionResolver } from './recipe-revision-resolver'\n\nexport const entities = [RecipeDefinition, RouteDefinition, ...RECIPE_REVISION_ENTITIES]\nexport const resolvers = [RecipeDefinitionResolver, RouteDefinitionResolver, RecipeQuery, RecipeRevisionResolver]\n\nexport * from './recipe-definition'\nexport * from './route-definition'\nexport * from './recipe-master'\n"]}
@@ -22,6 +22,10 @@ import { User } from '@things-factory/auth-base';
22
22
  * 가리키지 않고 레시피가 품목을 가리킨다** — 품목은 하나를 고를 수 없다.
23
23
  */
24
24
  export declare class RecipeDefinition {
25
+ /** Read projection of the effective revision, not a mutable identity column. */
26
+ revisionNumber?: number;
27
+ planGeneration: number;
28
+ revisionLock: number;
25
29
  readonly id: string;
26
30
  domain?: Domain;
27
31
  domainId?: string;
@@ -30,6 +30,18 @@ const auth_base_1 = require("@things-factory/auth-base");
30
30
  let RecipeDefinition = class RecipeDefinition {
31
31
  };
32
32
  exports.RecipeDefinition = RecipeDefinition;
33
+ tslib_1.__decorate([
34
+ (0, type_graphql_1.Field)(() => type_graphql_1.Int, { nullable: true }),
35
+ tslib_1.__metadata("design:type", Number)
36
+ ], RecipeDefinition.prototype, "revisionNumber", void 0);
37
+ tslib_1.__decorate([
38
+ (0, typeorm_1.Column)('int', { default: 0 }),
39
+ tslib_1.__metadata("design:type", Number)
40
+ ], RecipeDefinition.prototype, "planGeneration", void 0);
41
+ tslib_1.__decorate([
42
+ (0, typeorm_1.Column)('int', { default: 0 }),
43
+ tslib_1.__metadata("design:type", Number)
44
+ ], RecipeDefinition.prototype, "revisionLock", void 0);
33
45
  tslib_1.__decorate([
34
46
  (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
35
47
  (0, type_graphql_1.Field)(type => type_graphql_1.ID),
@@ -56,7 +68,7 @@ tslib_1.__decorate([
56
68
  ], RecipeDefinition.prototype, "description", void 0);
57
69
  tslib_1.__decorate([
58
70
  (0, typeorm_1.Column)(),
59
- (0, type_graphql_1.Field)(),
71
+ (0, type_graphql_1.Field)({ nullable: true }),
60
72
  tslib_1.__metadata("design:type", String)
61
73
  ], RecipeDefinition.prototype, "materialDefinitionName", void 0);
62
74
  tslib_1.__decorate([
@@ -121,6 +133,7 @@ tslib_1.__decorate([
121
133
  ], RecipeDefinition.prototype, "updaterId", void 0);
122
134
  exports.RecipeDefinition = RecipeDefinition = tslib_1.__decorate([
123
135
  (0, typeorm_1.Entity)({ name: 'ops_recipe_definition' }),
136
+ (0, typeorm_1.Index)('ix_ops_recipe_domain_identity', ['domain', 'id'], { unique: true }),
124
137
  (0, typeorm_1.Index)('ix_ops_recipe_definition_0', (recipe) => [recipe.domain, recipe.name], { unique: true })
125
138
  /* 「이 품목을 만드는 레시피」로 묻는 질의가 이 축으로 온다 — MES 가 지시를 받을 때마다 부른다. */
126
139
  ,