@things-factory/ops-master 10.0.18

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 (181) hide show
  1. package/.dockerignore +31 -0
  2. package/dist-client/index.d.ts +1 -0
  3. package/dist-client/index.js +2 -0
  4. package/dist-client/index.js.map +1 -0
  5. package/dist-client/pages/master-axes.d.ts +33 -0
  6. package/dist-client/pages/master-axes.js +176 -0
  7. package/dist-client/pages/master-axes.js.map +1 -0
  8. package/dist-client/pages/master-list.d.ts +68 -0
  9. package/dist-client/pages/master-list.js +267 -0
  10. package/dist-client/pages/master-list.js.map +1 -0
  11. package/dist-client/route.d.ts +1 -0
  12. package/dist-client/route.js +8 -0
  13. package/dist-client/route.js.map +1 -0
  14. package/dist-client/tsconfig.tsbuildinfo +1 -0
  15. package/dist-server/index.d.ts +1 -0
  16. package/dist-server/index.js +5 -0
  17. package/dist-server/index.js.map +1 -0
  18. package/dist-server/service/asset/asset-lifecycle.d.ts +83 -0
  19. package/dist-server/service/asset/asset-lifecycle.js +99 -0
  20. package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
  21. package/dist-server/service/asset/asset-master-resolver.d.ts +44 -0
  22. package/dist-server/service/asset/asset-master-resolver.js +140 -0
  23. package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
  24. package/dist-server/service/asset/asset-master.d.ts +21 -0
  25. package/dist-server/service/asset/asset-master.js +25 -0
  26. package/dist-server/service/asset/asset-master.js.map +1 -0
  27. package/dist-server/service/asset/asset-query.d.ts +8 -0
  28. package/dist-server/service/asset/asset-query.js +50 -0
  29. package/dist-server/service/asset/asset-query.js.map +1 -0
  30. package/dist-server/service/asset/index.d.ts +6 -0
  31. package/dist-server/service/asset/index.js +10 -0
  32. package/dist-server/service/asset/index.js.map +1 -0
  33. package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
  34. package/dist-server/service/asset/physical-asset-class.js +104 -0
  35. package/dist-server/service/asset/physical-asset-class.js.map +1 -0
  36. package/dist-server/service/asset/physical-asset.d.ts +53 -0
  37. package/dist-server/service/asset/physical-asset.js +123 -0
  38. package/dist-server/service/asset/physical-asset.js.map +1 -0
  39. package/dist-server/service/equipment/equipment-class.d.ts +34 -0
  40. package/dist-server/service/equipment/equipment-class.js +104 -0
  41. package/dist-server/service/equipment/equipment-class.js.map +1 -0
  42. package/dist-server/service/equipment/equipment-master-resolver.d.ts +60 -0
  43. package/dist-server/service/equipment/equipment-master-resolver.js +200 -0
  44. package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
  45. package/dist-server/service/equipment/equipment-master.d.ts +29 -0
  46. package/dist-server/service/equipment/equipment-master.js +36 -0
  47. package/dist-server/service/equipment/equipment-master.js.map +1 -0
  48. package/dist-server/service/equipment/equipment-query.d.ts +8 -0
  49. package/dist-server/service/equipment/equipment-query.js +50 -0
  50. package/dist-server/service/equipment/equipment-query.js.map +1 -0
  51. package/dist-server/service/equipment/equipment.d.ts +45 -0
  52. package/dist-server/service/equipment/equipment.js +133 -0
  53. package/dist-server/service/equipment/equipment.js.map +1 -0
  54. package/dist-server/service/equipment/index.d.ts +8 -0
  55. package/dist-server/service/equipment/index.js +12 -0
  56. package/dist-server/service/equipment/index.js.map +1 -0
  57. package/dist-server/service/equipment/state-period-rules.d.ts +76 -0
  58. package/dist-server/service/equipment/state-period-rules.js +88 -0
  59. package/dist-server/service/equipment/state-period-rules.js.map +1 -0
  60. package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
  61. package/dist-server/service/equipment/stop-reason-query.js +39 -0
  62. package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
  63. package/dist-server/service/equipment/stop-reason.d.ts +58 -0
  64. package/dist-server/service/equipment/stop-reason.js +114 -0
  65. package/dist-server/service/equipment/stop-reason.js.map +1 -0
  66. package/dist-server/service/index.d.ts +46 -0
  67. package/dist-server/service/index.js +80 -0
  68. package/dist-server/service/index.js.map +1 -0
  69. package/dist-server/service/location/index.d.ts +5 -0
  70. package/dist-server/service/location/index.js +9 -0
  71. package/dist-server/service/location/index.js.map +1 -0
  72. package/dist-server/service/location/location-master-resolver.d.ts +28 -0
  73. package/dist-server/service/location/location-master-resolver.js +80 -0
  74. package/dist-server/service/location/location-master-resolver.js.map +1 -0
  75. package/dist-server/service/location/location-master.d.ts +24 -0
  76. package/dist-server/service/location/location-master.js +27 -0
  77. package/dist-server/service/location/location-master.js.map +1 -0
  78. package/dist-server/service/location/location-query.d.ts +7 -0
  79. package/dist-server/service/location/location-query.js +41 -0
  80. package/dist-server/service/location/location-query.js.map +1 -0
  81. package/dist-server/service/location/operational-location.d.ts +52 -0
  82. package/dist-server/service/location/operational-location.js +132 -0
  83. package/dist-server/service/location/operational-location.js.map +1 -0
  84. package/dist-server/service/master-axis.d.ts +29 -0
  85. package/dist-server/service/master-axis.js +39 -0
  86. package/dist-server/service/master-axis.js.map +1 -0
  87. package/dist-server/service/master-crud.d.ts +44 -0
  88. package/dist-server/service/master-crud.js +73 -0
  89. package/dist-server/service/master-crud.js.map +1 -0
  90. package/dist-server/service/master-list.d.ts +12 -0
  91. package/dist-server/service/master-list.js +24 -0
  92. package/dist-server/service/master-list.js.map +1 -0
  93. package/dist-server/service/material/index.d.ts +6 -0
  94. package/dist-server/service/material/index.js +10 -0
  95. package/dist-server/service/material/index.js.map +1 -0
  96. package/dist-server/service/material/material-class.d.ts +34 -0
  97. package/dist-server/service/material/material-class.js +104 -0
  98. package/dist-server/service/material/material-class.js.map +1 -0
  99. package/dist-server/service/material/material-definition.d.ts +42 -0
  100. package/dist-server/service/material/material-definition.js +112 -0
  101. package/dist-server/service/material/material-definition.js.map +1 -0
  102. package/dist-server/service/material/material-master-resolver.d.ts +44 -0
  103. package/dist-server/service/material/material-master-resolver.js +140 -0
  104. package/dist-server/service/material/material-master-resolver.js.map +1 -0
  105. package/dist-server/service/material/material-master.d.ts +9 -0
  106. package/dist-server/service/material/material-master.js +24 -0
  107. package/dist-server/service/material/material-master.js.map +1 -0
  108. package/dist-server/service/material/material-query.d.ts +8 -0
  109. package/dist-server/service/material/material-query.js +50 -0
  110. package/dist-server/service/material/material-query.js.map +1 -0
  111. package/dist-server/service/operation/index.d.ts +5 -0
  112. package/dist-server/service/operation/index.js +9 -0
  113. package/dist-server/service/operation/index.js.map +1 -0
  114. package/dist-server/service/operation/operation-definition.d.ts +52 -0
  115. package/dist-server/service/operation/operation-definition.js +142 -0
  116. package/dist-server/service/operation/operation-definition.js.map +1 -0
  117. package/dist-server/service/operation/operation-master-resolver.d.ts +28 -0
  118. package/dist-server/service/operation/operation-master-resolver.js +80 -0
  119. package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
  120. package/dist-server/service/operation/operation-master.d.ts +21 -0
  121. package/dist-server/service/operation/operation-master.js +28 -0
  122. package/dist-server/service/operation/operation-master.js.map +1 -0
  123. package/dist-server/service/operation/operation-query.d.ts +7 -0
  124. package/dist-server/service/operation/operation-query.js +41 -0
  125. package/dist-server/service/operation/operation-query.js.map +1 -0
  126. package/dist-server/service/personnel/index.d.ts +6 -0
  127. package/dist-server/service/personnel/index.js +10 -0
  128. package/dist-server/service/personnel/index.js.map +1 -0
  129. package/dist-server/service/personnel/person.d.ts +51 -0
  130. package/dist-server/service/personnel/person.js +119 -0
  131. package/dist-server/service/personnel/person.js.map +1 -0
  132. package/dist-server/service/personnel/personnel-class.d.ts +54 -0
  133. package/dist-server/service/personnel/personnel-class.js +114 -0
  134. package/dist-server/service/personnel/personnel-class.js.map +1 -0
  135. package/dist-server/service/personnel/personnel-master-resolver.d.ts +44 -0
  136. package/dist-server/service/personnel/personnel-master-resolver.js +140 -0
  137. package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
  138. package/dist-server/service/personnel/personnel-master.d.ts +39 -0
  139. package/dist-server/service/personnel/personnel-master.js +34 -0
  140. package/dist-server/service/personnel/personnel-master.js.map +1 -0
  141. package/dist-server/service/personnel/personnel-query.d.ts +21 -0
  142. package/dist-server/service/personnel/personnel-query.js +57 -0
  143. package/dist-server/service/personnel/personnel-query.js.map +1 -0
  144. package/dist-server/service/personnel/qualification.d.ts +97 -0
  145. package/dist-server/service/personnel/qualification.js +122 -0
  146. package/dist-server/service/personnel/qualification.js.map +1 -0
  147. package/dist-server/service/resource/resource-class.d.ts +25 -0
  148. package/dist-server/service/resource/resource-class.js +29 -0
  149. package/dist-server/service/resource/resource-class.js.map +1 -0
  150. package/dist-server/service/status/axis-stamp.d.ts +16 -0
  151. package/dist-server/service/status/axis-stamp.js +22 -0
  152. package/dist-server/service/status/axis-stamp.js.map +1 -0
  153. package/dist-server/service/status/index.d.ts +3 -0
  154. package/dist-server/service/status/index.js +7 -0
  155. package/dist-server/service/status/index.js.map +1 -0
  156. package/dist-server/service/status/master-status.d.ts +45 -0
  157. package/dist-server/service/status/master-status.js +129 -0
  158. package/dist-server/service/status/master-status.js.map +1 -0
  159. package/dist-server/service/test-spec/index.d.ts +5 -0
  160. package/dist-server/service/test-spec/index.js +9 -0
  161. package/dist-server/service/test-spec/index.js.map +1 -0
  162. package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +28 -0
  163. package/dist-server/service/test-spec/test-spec-master-resolver.js +80 -0
  164. package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
  165. package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
  166. package/dist-server/service/test-spec/test-spec-master.js +18 -0
  167. package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
  168. package/dist-server/service/test-spec/test-spec-query.d.ts +7 -0
  169. package/dist-server/service/test-spec/test-spec-query.js +41 -0
  170. package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
  171. package/dist-server/service/test-spec/test-specification.d.ts +41 -0
  172. package/dist-server/service/test-spec/test-specification.js +106 -0
  173. package/dist-server/service/test-spec/test-specification.js.map +1 -0
  174. package/dist-server/tsconfig.tsbuildinfo +1 -0
  175. package/package.json +50 -0
  176. package/things-factory.config.js +12 -0
  177. package/translations/en.json +53 -0
  178. package/translations/ja.json +1 -0
  179. package/translations/ko.json +53 -0
  180. package/translations/ms.json +1 -0
  181. package/translations/zh.json +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-class.js","sourceRoot":"","sources":["../../../server/service/material/material-class.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * 품목 등급 — **ISA-95 `MaterialClass`**.\n *\n * 「원자재」·「완제품」처럼 품목을 묶는 상위 개념이다. 레시피가 특정 품번 대신 등급으로 투입을 적을 수 있고,\n * 화면이 재고를 그 단위로 모은다.\n *\n * 구조는 인원 등급 · 설비 등급과 같다(표준이 넷을 같은 모양으로 정의한다).\n */\n@Entity({ name: 'ops_material_class' })\n@Index('ix_ops_material_class_0', (klass: MaterialClass) => [klass.domain, klass.name], { unique: true })\n@ObjectType({ description: 'ISA-95 MaterialClass — a grouping of material definitions' })\nexport class MaterialClass {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((klass: MaterialClass) => klass.domain)\n domainId?: string\n\n /** 표준 `MaterialClassID`. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** 상위 등급들 — 표준 `MaterialClassBaseID`(복수). 「6축 용접기」가 「용접기」를 상속한다. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n baseIds?: string[]\n\n /** 이 등급의 적격을 정하는 `TestSpecification` 참조들 — 표준 `TestSpecificationID`. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /** 등급 속성 — 표준 `MaterialClassProperty`. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' })\n properties?: Record<string, unknown>[]\n\n /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** 언제까지 유효한가 — 표준 `EffectiveEndDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((klass: MaterialClass) => klass.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((klass: MaterialClass) => klass.updater)\n updaterId?: string\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 품목 정의 — **ISA-95 `MaterialDefinition`**.
5
+ *
6
+ * 식별자는 **GTIN** 이다(`urn:epc:idpat:sgtin:…`). 정체성의 기준이 EPCIS 이기 때문이고, 사건과 마스터가
7
+ * 같은 이름을 써야 「이 로트가 무엇인가」를 이을 수 있다.
8
+ *
9
+ * GTIN 이 아직 없는 품목은 비워 두지 않고 사내 코드를 `name` 에 적되, **회사 프리픽스를 지어내
10
+ * GTIN 을 만들지 않는다.** 지어낸 식별자는 나중에 진짜 코드가 왔을 때 두 개가 된다.
11
+ */
12
+ export declare class MaterialDefinition {
13
+ readonly id: string;
14
+ domain?: Domain;
15
+ domainId?: string;
16
+ /** 표준 `ID` — GTIN 이 있으면 GTIN 이다. 트윈으로 나갈 때 `materialDefinitions[].id` 가 된다. */
17
+ name: string;
18
+ description?: string;
19
+ /** 속한 등급들 — 표준 `MaterialClassID`(복수). */
20
+ materialClassIds?: string[];
21
+ /**
22
+ * 품목 속성 — 표준 `MaterialDefinitionProperty`. **환산 계수가 여기 들어간다.**
23
+ *
24
+ * 계약이 정한 이름은 `perBaseUnit` 이고, 값은 기준 단위 하나당 그 단위의 양이다.
25
+ * 한 개(EA)가 2.5 kg 이면 `{ id: 'perBaseUnit', value: 2.5, uom: 'KGM' }`.
26
+ */
27
+ properties?: Record<string, unknown>[];
28
+ /** 적격을 검증하는 `TestSpecification` 참조들 — 입고 검사가 이 모양에 맞는다. */
29
+ testSpecificationIds?: string[];
30
+ /** `TestResult` — 참조만 있으면 「무엇으로 검증한다」까지고, 결과가 있어야 적격이 성립한다. */
31
+ testResults?: Record<string, unknown>[];
32
+ /** 언제부터 이 품목을 쓰나 — 표준 `EffectiveStartDate`. 단종 예정 품목을 미리 적을 수 있다. */
33
+ effectiveStart?: Date;
34
+ /** 언제까지 — 표준 `EffectiveEndDate`. */
35
+ effectiveEnd?: Date;
36
+ createdAt?: Date;
37
+ updatedAt?: Date;
38
+ creator?: User;
39
+ creatorId?: string;
40
+ updater?: User;
41
+ updaterId?: string;
42
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaterialDefinition = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const typeorm_1 = require("typeorm");
6
+ const type_graphql_1 = require("type-graphql");
7
+ const shell_1 = require("@things-factory/shell");
8
+ const auth_base_1 = require("@things-factory/auth-base");
9
+ /**
10
+ * 품목 정의 — **ISA-95 `MaterialDefinition`**.
11
+ *
12
+ * 식별자는 **GTIN** 이다(`urn:epc:idpat:sgtin:…`). 정체성의 기준이 EPCIS 이기 때문이고, 사건과 마스터가
13
+ * 같은 이름을 써야 「이 로트가 무엇인가」를 이을 수 있다.
14
+ *
15
+ * GTIN 이 아직 없는 품목은 비워 두지 않고 사내 코드를 `name` 에 적되, **회사 프리픽스를 지어내
16
+ * GTIN 을 만들지 않는다.** 지어낸 식별자는 나중에 진짜 코드가 왔을 때 두 개가 된다.
17
+ */
18
+ let MaterialDefinition = class MaterialDefinition {
19
+ };
20
+ exports.MaterialDefinition = MaterialDefinition;
21
+ tslib_1.__decorate([
22
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
23
+ (0, type_graphql_1.Field)(type => type_graphql_1.ID),
24
+ tslib_1.__metadata("design:type", String)
25
+ ], MaterialDefinition.prototype, "id", void 0);
26
+ tslib_1.__decorate([
27
+ (0, typeorm_1.ManyToOne)(type => shell_1.Domain),
28
+ (0, type_graphql_1.Field)(type => shell_1.Domain),
29
+ tslib_1.__metadata("design:type", shell_1.Domain)
30
+ ], MaterialDefinition.prototype, "domain", void 0);
31
+ tslib_1.__decorate([
32
+ (0, typeorm_1.RelationId)((material) => material.domain),
33
+ tslib_1.__metadata("design:type", String)
34
+ ], MaterialDefinition.prototype, "domainId", void 0);
35
+ tslib_1.__decorate([
36
+ (0, typeorm_1.Column)(),
37
+ (0, type_graphql_1.Field)(),
38
+ tslib_1.__metadata("design:type", String)
39
+ ], MaterialDefinition.prototype, "name", void 0);
40
+ tslib_1.__decorate([
41
+ (0, typeorm_1.Column)({ nullable: true }),
42
+ (0, type_graphql_1.Field)({ nullable: true }),
43
+ tslib_1.__metadata("design:type", String)
44
+ ], MaterialDefinition.prototype, "description", void 0);
45
+ tslib_1.__decorate([
46
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
47
+ (0, type_graphql_1.Field)(type => [String], { nullable: true }),
48
+ tslib_1.__metadata("design:type", Array)
49
+ ], MaterialDefinition.prototype, "materialClassIds", void 0);
50
+ tslib_1.__decorate([
51
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
52
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' }),
53
+ tslib_1.__metadata("design:type", Array)
54
+ ], MaterialDefinition.prototype, "properties", void 0);
55
+ tslib_1.__decorate([
56
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
57
+ (0, type_graphql_1.Field)(type => [String], { nullable: true }),
58
+ tslib_1.__metadata("design:type", Array)
59
+ ], MaterialDefinition.prototype, "testSpecificationIds", void 0);
60
+ tslib_1.__decorate([
61
+ (0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
62
+ (0, type_graphql_1.Field)(type => String, { nullable: true, description: 'TestResult[] as JSON text' }),
63
+ tslib_1.__metadata("design:type", Array)
64
+ ], MaterialDefinition.prototype, "testResults", void 0);
65
+ tslib_1.__decorate([
66
+ (0, typeorm_1.Column)({ nullable: true }),
67
+ (0, type_graphql_1.Field)({ nullable: true }),
68
+ tslib_1.__metadata("design:type", Date
69
+ /** 언제까지 — 표준 `EffectiveEndDate`. */
70
+ )
71
+ ], MaterialDefinition.prototype, "effectiveStart", void 0);
72
+ tslib_1.__decorate([
73
+ (0, typeorm_1.Column)({ nullable: true }),
74
+ (0, type_graphql_1.Field)({ nullable: true }),
75
+ tslib_1.__metadata("design:type", Date)
76
+ ], MaterialDefinition.prototype, "effectiveEnd", void 0);
77
+ tslib_1.__decorate([
78
+ (0, typeorm_1.CreateDateColumn)(),
79
+ (0, type_graphql_1.Field)({ nullable: true }),
80
+ tslib_1.__metadata("design:type", Date)
81
+ ], MaterialDefinition.prototype, "createdAt", void 0);
82
+ tslib_1.__decorate([
83
+ (0, typeorm_1.UpdateDateColumn)(),
84
+ (0, type_graphql_1.Field)({ nullable: true }),
85
+ tslib_1.__metadata("design:type", Date)
86
+ ], MaterialDefinition.prototype, "updatedAt", void 0);
87
+ tslib_1.__decorate([
88
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
89
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
90
+ tslib_1.__metadata("design:type", auth_base_1.User)
91
+ ], MaterialDefinition.prototype, "creator", void 0);
92
+ tslib_1.__decorate([
93
+ (0, typeorm_1.RelationId)((material) => material.creator),
94
+ tslib_1.__metadata("design:type", String)
95
+ ], MaterialDefinition.prototype, "creatorId", void 0);
96
+ tslib_1.__decorate([
97
+ (0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
98
+ (0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
99
+ tslib_1.__metadata("design:type", auth_base_1.User)
100
+ ], MaterialDefinition.prototype, "updater", void 0);
101
+ tslib_1.__decorate([
102
+ (0, typeorm_1.RelationId)((material) => material.updater),
103
+ tslib_1.__metadata("design:type", String)
104
+ ], MaterialDefinition.prototype, "updaterId", void 0);
105
+ exports.MaterialDefinition = MaterialDefinition = tslib_1.__decorate([
106
+ (0, typeorm_1.Entity)({ name: 'ops_material_definition' }),
107
+ (0, typeorm_1.Index)('ix_ops_material_definition_0', (material) => [material.domain, material.name], {
108
+ unique: true
109
+ }),
110
+ (0, type_graphql_1.ObjectType)({ description: 'ISA-95 MaterialDefinition — what a material is' })
111
+ ], MaterialDefinition);
112
+ //# sourceMappingURL=material-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-definition.js","sourceRoot":"","sources":["../../../server/service/material/material-definition.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n Entity,\n Index,\n ManyToOne,\n PrimaryGeneratedColumn,\n RelationId,\n UpdateDateColumn\n} from 'typeorm'\nimport { Field, ID, ObjectType } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * 품목 정의 — **ISA-95 `MaterialDefinition`**.\n *\n * 식별자는 **GTIN** 이다(`urn:epc:idpat:sgtin:…`). 정체성의 기준이 EPCIS 이기 때문이고, 사건과 마스터가\n * 같은 이름을 써야 「이 로트가 무엇인가」를 이을 수 있다.\n *\n * GTIN 이 아직 없는 품목은 비워 두지 않고 사내 코드를 `name` 에 적되, **회사 프리픽스를 지어내\n * GTIN 을 만들지 않는다.** 지어낸 식별자는 나중에 진짜 코드가 왔을 때 두 개가 된다.\n */\n@Entity({ name: 'ops_material_definition' })\n@Index('ix_ops_material_definition_0', (material: MaterialDefinition) => [material.domain, material.name], {\n unique: true\n})\n@ObjectType({ description: 'ISA-95 MaterialDefinition — what a material is' })\nexport class MaterialDefinition {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID)\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field(type => Domain)\n domain?: Domain\n\n @RelationId((material: MaterialDefinition) => material.domain)\n domainId?: string\n\n /** 표준 `ID` — GTIN 이 있으면 GTIN 이다. 트윈으로 나갈 때 `materialDefinitions[].id` 가 된다. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** 속한 등급들 — 표준 `MaterialClassID`(복수). */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n materialClassIds?: string[]\n\n /**\n * 품목 속성 — 표준 `MaterialDefinitionProperty`. **환산 계수가 여기 들어간다.**\n *\n * 계약이 정한 이름은 `perBaseUnit` 이고, 값은 기준 단위 하나당 그 단위의 양이다.\n * 한 개(EA)가 2.5 kg 이면 `{ id: 'perBaseUnit', value: 2.5, uom: 'KGM' }`.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' })\n properties?: Record<string, unknown>[]\n\n /** 적격을 검증하는 `TestSpecification` 참조들 — 입고 검사가 이 모양에 맞는다. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /** `TestResult` — 참조만 있으면 「무엇으로 검증한다」까지고, 결과가 있어야 적격이 성립한다. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => String, { nullable: true, description: 'TestResult[] as JSON text' })\n testResults?: Record<string, unknown>[]\n\n /** 언제부터 이 품목을 쓰나 — 표준 `EffectiveStartDate`. 단종 예정 품목을 미리 적을 수 있다. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /** 언제까지 — 표준 `EffectiveEndDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveEnd?: Date\n\n @CreateDateColumn()\n @Field({ nullable: true })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true })\n updatedAt?: Date\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n creator?: User\n\n @RelationId((material: MaterialDefinition) => material.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((material: MaterialDefinition) => material.updater)\n updaterId?: string\n}\n"]}
@@ -0,0 +1,44 @@
1
+ import { ListParam } from '@things-factory/shell';
2
+ import { MasterPatch } from '../master-crud';
3
+ import { MaterialClass } from './material-class';
4
+ import { MaterialDefinition } from './material-definition';
5
+ /**
6
+ * 자재 축을 채우고 고친다.
7
+ *
8
+ * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
9
+ * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
10
+ * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
11
+ * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
12
+ *
13
+ * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
14
+ */
15
+ export declare class MaterialClassList {
16
+ items: MaterialClass[];
17
+ total: number;
18
+ }
19
+ export declare class MaterialClassResolver {
20
+ materialClasses(params: ListParam, context: ResolverContext): Promise<MaterialClassList>;
21
+ /**
22
+ * 그리드가 보낸 변경을 한 번에 적용한다.
23
+ *
24
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
25
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
26
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
27
+ */
28
+ updateMultipleMaterialClass(patches: MasterPatch[], context: ResolverContext): Promise<MaterialClass[]>;
29
+ }
30
+ export declare class MaterialDefinitionList {
31
+ items: MaterialDefinition[];
32
+ total: number;
33
+ }
34
+ export declare class MaterialDefinitionResolver {
35
+ materialDefinitions(params: ListParam, context: ResolverContext): Promise<MaterialDefinitionList>;
36
+ /**
37
+ * 그리드가 보낸 변경을 한 번에 적용한다.
38
+ *
39
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
40
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
41
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
42
+ */
43
+ updateMultipleMaterialDefinition(patches: MasterPatch[], context: ResolverContext): Promise<MaterialDefinition[]>;
44
+ }
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaterialDefinitionResolver = exports.MaterialDefinitionList = exports.MaterialClassResolver = exports.MaterialClassList = 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 master_crud_1 = require("../master-crud");
8
+ const master_axis_1 = require("../master-axis");
9
+ const master_list_1 = require("../master-list");
10
+ const material_class_1 = require("./material-class");
11
+ const material_definition_1 = require("./material-definition");
12
+ /**
13
+ * 자재 축을 채우고 고친다.
14
+ *
15
+ * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
16
+ * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
17
+ * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
18
+ * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
19
+ *
20
+ * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
21
+ */
22
+ let MaterialClassList = class MaterialClassList {
23
+ };
24
+ exports.MaterialClassList = MaterialClassList;
25
+ tslib_1.__decorate([
26
+ (0, type_graphql_1.Field)(type => [material_class_1.MaterialClass]),
27
+ tslib_1.__metadata("design:type", Array)
28
+ ], MaterialClassList.prototype, "items", void 0);
29
+ tslib_1.__decorate([
30
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int),
31
+ tslib_1.__metadata("design:type", Number)
32
+ ], MaterialClassList.prototype, "total", void 0);
33
+ exports.MaterialClassList = MaterialClassList = tslib_1.__decorate([
34
+ (0, type_graphql_1.ObjectType)({ description: 'A page of material classes' })
35
+ ], MaterialClassList);
36
+ let MaterialClassResolver = class MaterialClassResolver {
37
+ async materialClasses(params, context) {
38
+ const { domain } = context.state;
39
+ const { items, total } = await (0, master_list_1.listMaster)('materialClass', params, domain);
40
+ return { items: items, total };
41
+ }
42
+ /**
43
+ * 그리드가 보낸 변경을 한 번에 적용한다.
44
+ *
45
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
46
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
47
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
48
+ */
49
+ async updateMultipleMaterialClass(patches, context) {
50
+ const { domain, user, tx } = context.state;
51
+ const axis = (0, master_axis_1.masterAxisOf)('materialClass');
52
+ const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
53
+ hasEffectivePeriod: axis.hasEffectivePeriod
54
+ });
55
+ return saved;
56
+ }
57
+ };
58
+ exports.MaterialClassResolver = MaterialClassResolver;
59
+ tslib_1.__decorate([
60
+ (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
61
+ (0, type_graphql_1.Query)(returns => MaterialClassList, { description: 'To fetch material classes' }),
62
+ tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
63
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
64
+ tslib_1.__metadata("design:type", Function),
65
+ tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
66
+ tslib_1.__metadata("design:returntype", Promise)
67
+ ], MaterialClassResolver.prototype, "materialClasses", null);
68
+ tslib_1.__decorate([
69
+ (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
70
+ (0, type_graphql_1.Directive)('@transaction'),
71
+ (0, type_graphql_1.Mutation)(returns => [material_class_1.MaterialClass], { description: 'To create, change or retire material classes' }),
72
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
73
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
74
+ tslib_1.__metadata("design:type", Function),
75
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
76
+ tslib_1.__metadata("design:returntype", Promise)
77
+ ], MaterialClassResolver.prototype, "updateMultipleMaterialClass", null);
78
+ exports.MaterialClassResolver = MaterialClassResolver = tslib_1.__decorate([
79
+ (0, type_graphql_1.Resolver)(material_class_1.MaterialClass)
80
+ ], MaterialClassResolver);
81
+ let MaterialDefinitionList = class MaterialDefinitionList {
82
+ };
83
+ exports.MaterialDefinitionList = MaterialDefinitionList;
84
+ tslib_1.__decorate([
85
+ (0, type_graphql_1.Field)(type => [material_definition_1.MaterialDefinition]),
86
+ tslib_1.__metadata("design:type", Array)
87
+ ], MaterialDefinitionList.prototype, "items", void 0);
88
+ tslib_1.__decorate([
89
+ (0, type_graphql_1.Field)(type => type_graphql_1.Int),
90
+ tslib_1.__metadata("design:type", Number)
91
+ ], MaterialDefinitionList.prototype, "total", void 0);
92
+ exports.MaterialDefinitionList = MaterialDefinitionList = tslib_1.__decorate([
93
+ (0, type_graphql_1.ObjectType)({ description: 'A page of material definitions' })
94
+ ], MaterialDefinitionList);
95
+ let MaterialDefinitionResolver = class MaterialDefinitionResolver {
96
+ async materialDefinitions(params, context) {
97
+ const { domain } = context.state;
98
+ const { items, total } = await (0, master_list_1.listMaster)('materialDefinition', params, domain);
99
+ return { items: items, total };
100
+ }
101
+ /**
102
+ * 그리드가 보낸 변경을 한 번에 적용한다.
103
+ *
104
+ * 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
105
+ * 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
106
+ * 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
107
+ */
108
+ async updateMultipleMaterialDefinition(patches, context) {
109
+ const { domain, user, tx } = context.state;
110
+ const axis = (0, master_axis_1.masterAxisOf)('materialDefinition');
111
+ const saved = await (0, master_crud_1.saveMasterPatches)(tx, domain, axis.entity, patches, user, {
112
+ hasEffectivePeriod: axis.hasEffectivePeriod
113
+ });
114
+ return saved;
115
+ }
116
+ };
117
+ exports.MaterialDefinitionResolver = MaterialDefinitionResolver;
118
+ tslib_1.__decorate([
119
+ (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "query", domainOwnerGranted: true)'),
120
+ (0, type_graphql_1.Query)(returns => MaterialDefinitionList, { description: 'To fetch material definitions' }),
121
+ tslib_1.__param(0, (0, type_graphql_1.Args)(type => shell_1.ListParam)),
122
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
123
+ tslib_1.__metadata("design:type", Function),
124
+ tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
125
+ tslib_1.__metadata("design:returntype", Promise)
126
+ ], MaterialDefinitionResolver.prototype, "materialDefinitions", null);
127
+ tslib_1.__decorate([
128
+ (0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
129
+ (0, type_graphql_1.Directive)('@transaction'),
130
+ (0, type_graphql_1.Mutation)(returns => [material_definition_1.MaterialDefinition], { description: 'To create, change or retire material definitions' }),
131
+ tslib_1.__param(0, (0, type_graphql_1.Arg)('patches', type => [shell_1.ScalarObject])),
132
+ tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
133
+ tslib_1.__metadata("design:type", Function),
134
+ tslib_1.__metadata("design:paramtypes", [Array, Object]),
135
+ tslib_1.__metadata("design:returntype", Promise)
136
+ ], MaterialDefinitionResolver.prototype, "updateMultipleMaterialDefinition", null);
137
+ exports.MaterialDefinitionResolver = MaterialDefinitionResolver = tslib_1.__decorate([
138
+ (0, type_graphql_1.Resolver)(material_definition_1.MaterialDefinition)
139
+ ], MaterialDefinitionResolver);
140
+ //# sourceMappingURL=material-master-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-master-resolver.js","sourceRoot":"","sources":["../../../server/service/material/material-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Arg, Ctx, Directive, Int, Mutation, ObjectType, Field, Query, Resolver } from 'type-graphql'\n\nimport { ListParam, ScalarObject } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { MaterialClass } from './material-class'\nimport { MaterialDefinition } from './material-definition'\n\n/**\n * 자재 축을 채우고 고친다.\n *\n * ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────\n * 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의\n * 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —\n * 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.\n *\n * 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.\n */\n\n@ObjectType({ description: 'A page of material classes' })\nexport class MaterialClassList {\n @Field(type => [MaterialClass])\n items: MaterialClass[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(MaterialClass)\nexport class MaterialClassResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => MaterialClassList, { description: 'To fetch material classes' })\n async materialClasses(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<MaterialClassList> {\n const { domain } = context.state\n const { items, total } = await listMaster('materialClass', params, domain)\n\n return { items: items as MaterialClass[], 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 => [MaterialClass], { description: 'To create, change or retire material classes' })\n async updateMultipleMaterialClass(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<MaterialClass[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('materialClass')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as MaterialClass[]\n }\n}\n\n@ObjectType({ description: 'A page of material definitions' })\nexport class MaterialDefinitionList {\n @Field(type => [MaterialDefinition])\n items: MaterialDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(MaterialDefinition)\nexport class MaterialDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => MaterialDefinitionList, { description: 'To fetch material definitions' })\n async materialDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<MaterialDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('materialDefinition', params, domain)\n\n return { items: items as MaterialDefinition[], 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 => [MaterialDefinition], { description: 'To create, change or retire material definitions' })\n async updateMultipleMaterialDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<MaterialDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('materialDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as MaterialDefinition[]\n }\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { MaterialDefinition as MaterialDefinitionDef, ResourceClassDef } from '@operato/ops-contract';
2
+ import type { MaterialClass } from './material-class';
3
+ import type { MaterialDefinition } from './material-definition';
4
+ export declare function toMaterialDefinition(material: MaterialDefinition): MaterialDefinitionDef;
5
+ /** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 나간다. */
6
+ export declare function materialMaster(classes: MaterialClass[], materials: MaterialDefinition[]): {
7
+ materialClasses: ResourceClassDef[];
8
+ materialDefinitions: MaterialDefinitionDef[];
9
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toMaterialDefinition = toMaterialDefinition;
4
+ exports.materialMaster = materialMaster;
5
+ const resource_class_1 = require("../resource/resource-class");
6
+ function toMaterialDefinition(material) {
7
+ const out = { id: material.name };
8
+ (0, resource_class_1.put)(out, 'description', material.description);
9
+ (0, resource_class_1.put)(out, 'materialClassIds', material.materialClassIds);
10
+ (0, resource_class_1.put)(out, 'properties', material.properties);
11
+ (0, resource_class_1.put)(out, 'testSpecificationIds', material.testSpecificationIds);
12
+ (0, resource_class_1.put)(out, 'testResults', material.testResults);
13
+ (0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(material.effectiveStart));
14
+ (0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(material.effectiveEnd));
15
+ return out;
16
+ }
17
+ /** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 나간다. */
18
+ function materialMaster(classes, materials) {
19
+ return {
20
+ materialClasses: classes.map(resource_class_1.toResourceClassDef),
21
+ materialDefinitions: materials.map(toMaterialDefinition)
22
+ };
23
+ }
24
+ //# sourceMappingURL=material-master.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-master.js","sourceRoot":"","sources":["../../../server/service/material/material-master.ts"],"names":[],"mappings":";;AAMA,oDAYC;AAGD,wCAQC;AA3BD,+DAAyE;AAIzE,SAAgB,oBAAoB,CAAC,QAA4B;IAC/D,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE1D,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC7C,IAAA,oBAAG,EAAC,GAAG,EAAE,kBAAkB,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IACvD,IAAA,oBAAG,EAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAA;IAC3C,IAAA,oBAAG,EAAC,GAAG,EAAE,sBAAsB,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IAC/D,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;IAC7C,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAA;IACxD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;IAEpD,OAAO,GAAuC,CAAA;AAChD,CAAC;AAED,6CAA6C;AAC7C,SAAgB,cAAc,CAC5B,OAAwB,EACxB,SAA+B;IAE/B,OAAO;QACL,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAkB,CAAC;QAChD,mBAAmB,EAAE,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;KACzD,CAAA;AACH,CAAC","sourcesContent":["import type { MaterialDefinition as MaterialDefinitionDef, ResourceClassDef } from '@operato/ops-contract'\n\nimport { iso, put, toResourceClassDef } from '../resource/resource-class'\nimport type { MaterialClass } from './material-class'\nimport type { MaterialDefinition } from './material-definition'\n\nexport function toMaterialDefinition(material: MaterialDefinition): MaterialDefinitionDef {\n const out: Record<string, unknown> = { id: material.name }\n\n put(out, 'description', material.description)\n put(out, 'materialClassIds', material.materialClassIds)\n put(out, 'properties', material.properties)\n put(out, 'testSpecificationIds', material.testSpecificationIds)\n put(out, 'testResults', material.testResults)\n put(out, 'effectiveStart', iso(material.effectiveStart))\n put(out, 'effectiveEnd', iso(material.effectiveEnd))\n\n return out as unknown as MaterialDefinitionDef\n}\n\n/** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 나간다. */\nexport function materialMaster(\n classes: MaterialClass[],\n materials: MaterialDefinition[]\n): { materialClasses: ResourceClassDef[]; materialDefinitions: MaterialDefinitionDef[] } {\n return {\n materialClasses: classes.map(toResourceClassDef),\n materialDefinitions: materials.map(toMaterialDefinition)\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ export declare class MaterialMaster {
2
+ materialClasses: string;
3
+ materialDefinitions: string;
4
+ }
5
+ export declare class MaterialQuery {
6
+ /** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 낸다. */
7
+ materialMaster(context: ResolverContext): Promise<MaterialMaster>;
8
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaterialQuery = exports.MaterialMaster = 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 material_class_1 = require("./material-class");
8
+ const material_definition_1 = require("./material-definition");
9
+ const material_master_1 = require("./material-master");
10
+ let MaterialMaster = class MaterialMaster {
11
+ };
12
+ exports.MaterialMaster = MaterialMaster;
13
+ tslib_1.__decorate([
14
+ (0, type_graphql_1.Field)(type => String, { description: 'ResourceClassDef[] as JSON text' }),
15
+ tslib_1.__metadata("design:type", String)
16
+ ], MaterialMaster.prototype, "materialClasses", void 0);
17
+ tslib_1.__decorate([
18
+ (0, type_graphql_1.Field)(type => String, { description: 'MaterialDefinition[] as JSON text' }),
19
+ tslib_1.__metadata("design:type", String)
20
+ ], MaterialMaster.prototype, "materialDefinitions", void 0);
21
+ exports.MaterialMaster = MaterialMaster = tslib_1.__decorate([
22
+ (0, type_graphql_1.ObjectType)({ description: 'Material master as the twin receives it' })
23
+ ], MaterialMaster);
24
+ let MaterialQuery = class MaterialQuery {
25
+ /** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 낸다. */
26
+ async materialMaster(context) {
27
+ const { domain } = context.state;
28
+ const [classes, materials] = await Promise.all([
29
+ (0, shell_1.getRepository)(material_class_1.MaterialClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),
30
+ (0, shell_1.getRepository)(material_definition_1.MaterialDefinition).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } })
31
+ ]);
32
+ const master = (0, material_master_1.materialMaster)(classes, materials);
33
+ return {
34
+ materialClasses: JSON.stringify(master.materialClasses),
35
+ materialDefinitions: JSON.stringify(master.materialDefinitions)
36
+ };
37
+ }
38
+ };
39
+ exports.MaterialQuery = MaterialQuery;
40
+ tslib_1.__decorate([
41
+ (0, type_graphql_1.Query)(returns => MaterialMaster, { description: 'Material master for the twin to pull' }),
42
+ tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
43
+ tslib_1.__metadata("design:type", Function),
44
+ tslib_1.__metadata("design:paramtypes", [Object]),
45
+ tslib_1.__metadata("design:returntype", Promise)
46
+ ], MaterialQuery.prototype, "materialMaster", null);
47
+ exports.MaterialQuery = MaterialQuery = tslib_1.__decorate([
48
+ (0, type_graphql_1.Resolver)(material_definition_1.MaterialDefinition)
49
+ ], MaterialQuery);
50
+ //# sourceMappingURL=material-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"material-query.js","sourceRoot":"","sources":["../../../server/service/material/material-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AAEtE,iDAAqD;AAErD,qDAAgD;AAChD,+DAA0D;AAC1D,uDAAyE;AAGlE,IAAM,cAAc,GAApB,MAAM,cAAc;CAM1B,CAAA;AANY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;uDACnD;AAGvB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;;2DACjD;yBALhB,cAAc;IAD1B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;GAC1D,cAAc,CAM1B;AAGM,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,4CAA4C;IAEtC,AAAN,KAAK,CAAC,cAAc,CAAQ,OAAwB;QAClD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC7C,IAAA,qBAAa,EAAC,8BAAa,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACnG,IAAA,qBAAa,EAAC,wCAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;SACzG,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAA,gCAAmB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAA;QAEtD,OAAO;YACL,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC;YACvD,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC;SAChE,CAAA;IACH,CAAC;CACF,CAAA;AAlBY,sCAAa;AAGlB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;IACpE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mDAc1B;wBAjBU,aAAa;IADzB,IAAA,uBAAQ,EAAC,wCAAkB,CAAC;GAChB,aAAa,CAkBzB","sourcesContent":["import { Ctx, Field, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { MaterialClass } from './material-class'\nimport { MaterialDefinition } from './material-definition'\nimport { materialMaster as buildMaterialMaster } from './material-master'\n\n@ObjectType({ description: 'Material master as the twin receives it' })\nexport class MaterialMaster {\n @Field(type => String, { description: 'ResourceClassDef[] as JSON text' })\n materialClasses: string\n\n @Field(type => String, { description: 'MaterialDefinition[] as JSON text' })\n materialDefinitions: string\n}\n\n@Resolver(MaterialDefinition)\nexport class MaterialQuery {\n /** 품목 축 전체 — 품목이 자기 등급을 가리키므로 등급과 함께 낸다. */\n @Query(returns => MaterialMaster, { description: 'Material master for the twin to pull' })\n async materialMaster(@Ctx() context: ResolverContext): Promise<MaterialMaster> {\n const { domain } = context.state\n\n const [classes, materials] = await Promise.all([\n getRepository(MaterialClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),\n getRepository(MaterialDefinition).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } })\n ])\n\n const master = buildMaterialMaster(classes, materials)\n\n return {\n materialClasses: JSON.stringify(master.materialClasses),\n materialDefinitions: JSON.stringify(master.materialDefinitions)\n }\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { OperationDefinition } from './operation-definition';
2
+ import { OperationQuery } from './operation-query';
3
+ import { OperationDefinitionResolver } from './operation-master-resolver';
4
+ export declare const entities: (typeof OperationDefinition)[];
5
+ export declare const resolvers: (typeof OperationDefinitionResolver | typeof OperationQuery)[];
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolvers = exports.entities = void 0;
4
+ const operation_definition_1 = require("./operation-definition");
5
+ const operation_query_1 = require("./operation-query");
6
+ const operation_master_resolver_1 = require("./operation-master-resolver");
7
+ exports.entities = [operation_definition_1.OperationDefinition];
8
+ exports.resolvers = [operation_query_1.OperationQuery, operation_master_resolver_1.OperationDefinitionResolver];
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/service/operation/index.ts"],"names":[],"mappings":";;;AAAA,iEAA4D;AAC5D,uDAAkD;AAClD,2EAAyE;AAE5D,QAAA,QAAQ,GAAG,CAAC,0CAAmB,CAAC,CAAA;AAChC,QAAA,SAAS,GAAG,CAAC,gCAAc,EAAE,uDAA2B,CAAC,CAAA","sourcesContent":["import { OperationDefinition } from './operation-definition'\nimport { OperationQuery } from './operation-query'\nimport { OperationDefinitionResolver } from './operation-master-resolver'\n\nexport const entities = [OperationDefinition]\nexport const resolvers = [OperationQuery, OperationDefinitionResolver]\n"]}
@@ -0,0 +1,52 @@
1
+ import { Domain } from '@things-factory/shell';
2
+ import { User } from '@things-factory/auth-base';
3
+ /**
4
+ * 공정 정의 — **ISA-95 `OperationsSegment`**(`OperationsDefinition` 소속).
5
+ *
6
+ * 이 자리가 답하는 것은 「이 공정이 얼마나 걸리고 무엇을 필요로 하는가」다. 예측이 쓰는 소요시간의
7
+ * 근거이고, 정상상태 상한과 병목을 공정별로 낼 수 있게 하는 값이다.
8
+ *
9
+ * ── 필요 자원을 적지 않으면 사람이 없는 공장이 된다 ─────────────────────────
10
+ * 인원 명세가 없으면 사람은 예측에 존재하지 않는다. 설비만 있으면 언제나 가동되는 공장이 되고, 현장에서
11
+ * 가장 자주 모자라는 자원이 만드는 줄이 통째로 사라진다. 등급으로 요구한다 — 「용접 자격자 2명」.
12
+ */
13
+ export declare class OperationDefinition {
14
+ readonly id: string;
15
+ domain?: Domain;
16
+ domainId?: string;
17
+ /** 공정 키 — 라우트의 단계가 이 값을 가리킨다. */
18
+ name: string;
19
+ description?: string;
20
+ /** 무엇을 하는 공정인가 — `transport` · `process` · `dwell`. */
21
+ intent: string;
22
+ /** 이 공정이 벌어지는 자리 타입. 없으면 커널이 어디서 일하는지 정할 수 없다. */
23
+ locationType?: string;
24
+ /** 필요한 설비 종류. `dwell` 은 자원을 잡지 않는다. */
25
+ resourceType?: string;
26
+ /** 방출할 CBV bizStep URN. */
27
+ bizStep?: string;
28
+ /** 소요시간 — 표준 `Duration`. ISO 8601 기간 표기다. 없으면 커널이 기본값을 쓴다. */
29
+ duration?: string;
30
+ /** 소요시간 변동 — 표준 밖 확장. 없으면 상수다. */
31
+ variability?: Record<string, unknown>;
32
+ /** 공정 모수 — 표준 `ParameterSpecification`. 수율 · 셋업 시간 · 온도가 여기 온다. */
33
+ parameters?: Record<string, unknown>[];
34
+ /** 필요 인원 — 표준 `PersonnelSpecification`(등급 + 수량). */
35
+ personnelSpecification?: Record<string, unknown>[];
36
+ /** 필요 물리 자산 — 표준 `PhysicalAssetSpecification`. 빈 팔레트가 없어 출고가 못 나가는 일은 잦다. */
37
+ physicalAssetSpecification?: Record<string, unknown>[];
38
+ /** 언제부터 유효한가 — 표준 `EffectiveStartDate`. */
39
+ effectiveStart?: Date;
40
+ /**
41
+ * 언제까지 유효한가 — 표준 `EffectiveEndDate`.
42
+ *
43
+ * **없앨 때 행을 지우지 않고 이 칸을 채운다.** 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
44
+ */
45
+ effectiveEnd?: Date;
46
+ createdAt?: Date;
47
+ updatedAt?: Date;
48
+ creator?: User;
49
+ creatorId?: string;
50
+ updater?: User;
51
+ updaterId?: string;
52
+ }