@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.
- package/.dockerignore +31 -0
- package/dist-client/index.d.ts +1 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/master-axes.d.ts +33 -0
- package/dist-client/pages/master-axes.js +176 -0
- package/dist-client/pages/master-axes.js.map +1 -0
- package/dist-client/pages/master-list.d.ts +68 -0
- package/dist-client/pages/master-list.js +267 -0
- package/dist-client/pages/master-list.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +8 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/index.d.ts +1 -0
- package/dist-server/index.js +5 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/service/asset/asset-lifecycle.d.ts +83 -0
- package/dist-server/service/asset/asset-lifecycle.js +99 -0
- package/dist-server/service/asset/asset-lifecycle.js.map +1 -0
- package/dist-server/service/asset/asset-master-resolver.d.ts +44 -0
- package/dist-server/service/asset/asset-master-resolver.js +140 -0
- package/dist-server/service/asset/asset-master-resolver.js.map +1 -0
- package/dist-server/service/asset/asset-master.d.ts +21 -0
- package/dist-server/service/asset/asset-master.js +25 -0
- package/dist-server/service/asset/asset-master.js.map +1 -0
- package/dist-server/service/asset/asset-query.d.ts +8 -0
- package/dist-server/service/asset/asset-query.js +50 -0
- package/dist-server/service/asset/asset-query.js.map +1 -0
- package/dist-server/service/asset/index.d.ts +6 -0
- package/dist-server/service/asset/index.js +10 -0
- package/dist-server/service/asset/index.js.map +1 -0
- package/dist-server/service/asset/physical-asset-class.d.ts +34 -0
- package/dist-server/service/asset/physical-asset-class.js +104 -0
- package/dist-server/service/asset/physical-asset-class.js.map +1 -0
- package/dist-server/service/asset/physical-asset.d.ts +53 -0
- package/dist-server/service/asset/physical-asset.js +123 -0
- package/dist-server/service/asset/physical-asset.js.map +1 -0
- package/dist-server/service/equipment/equipment-class.d.ts +34 -0
- package/dist-server/service/equipment/equipment-class.js +104 -0
- package/dist-server/service/equipment/equipment-class.js.map +1 -0
- package/dist-server/service/equipment/equipment-master-resolver.d.ts +60 -0
- package/dist-server/service/equipment/equipment-master-resolver.js +200 -0
- package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -0
- package/dist-server/service/equipment/equipment-master.d.ts +29 -0
- package/dist-server/service/equipment/equipment-master.js +36 -0
- package/dist-server/service/equipment/equipment-master.js.map +1 -0
- package/dist-server/service/equipment/equipment-query.d.ts +8 -0
- package/dist-server/service/equipment/equipment-query.js +50 -0
- package/dist-server/service/equipment/equipment-query.js.map +1 -0
- package/dist-server/service/equipment/equipment.d.ts +45 -0
- package/dist-server/service/equipment/equipment.js +133 -0
- package/dist-server/service/equipment/equipment.js.map +1 -0
- package/dist-server/service/equipment/index.d.ts +8 -0
- package/dist-server/service/equipment/index.js +12 -0
- package/dist-server/service/equipment/index.js.map +1 -0
- package/dist-server/service/equipment/state-period-rules.d.ts +76 -0
- package/dist-server/service/equipment/state-period-rules.js +88 -0
- package/dist-server/service/equipment/state-period-rules.js.map +1 -0
- package/dist-server/service/equipment/stop-reason-query.d.ts +11 -0
- package/dist-server/service/equipment/stop-reason-query.js +39 -0
- package/dist-server/service/equipment/stop-reason-query.js.map +1 -0
- package/dist-server/service/equipment/stop-reason.d.ts +58 -0
- package/dist-server/service/equipment/stop-reason.js +114 -0
- package/dist-server/service/equipment/stop-reason.js.map +1 -0
- package/dist-server/service/index.d.ts +46 -0
- package/dist-server/service/index.js +80 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/service/location/index.d.ts +5 -0
- package/dist-server/service/location/index.js +9 -0
- package/dist-server/service/location/index.js.map +1 -0
- package/dist-server/service/location/location-master-resolver.d.ts +28 -0
- package/dist-server/service/location/location-master-resolver.js +80 -0
- package/dist-server/service/location/location-master-resolver.js.map +1 -0
- package/dist-server/service/location/location-master.d.ts +24 -0
- package/dist-server/service/location/location-master.js +27 -0
- package/dist-server/service/location/location-master.js.map +1 -0
- package/dist-server/service/location/location-query.d.ts +7 -0
- package/dist-server/service/location/location-query.js +41 -0
- package/dist-server/service/location/location-query.js.map +1 -0
- package/dist-server/service/location/operational-location.d.ts +52 -0
- package/dist-server/service/location/operational-location.js +132 -0
- package/dist-server/service/location/operational-location.js.map +1 -0
- package/dist-server/service/master-axis.d.ts +29 -0
- package/dist-server/service/master-axis.js +39 -0
- package/dist-server/service/master-axis.js.map +1 -0
- package/dist-server/service/master-crud.d.ts +44 -0
- package/dist-server/service/master-crud.js +73 -0
- package/dist-server/service/master-crud.js.map +1 -0
- package/dist-server/service/master-list.d.ts +12 -0
- package/dist-server/service/master-list.js +24 -0
- package/dist-server/service/master-list.js.map +1 -0
- package/dist-server/service/material/index.d.ts +6 -0
- package/dist-server/service/material/index.js +10 -0
- package/dist-server/service/material/index.js.map +1 -0
- package/dist-server/service/material/material-class.d.ts +34 -0
- package/dist-server/service/material/material-class.js +104 -0
- package/dist-server/service/material/material-class.js.map +1 -0
- package/dist-server/service/material/material-definition.d.ts +42 -0
- package/dist-server/service/material/material-definition.js +112 -0
- package/dist-server/service/material/material-definition.js.map +1 -0
- package/dist-server/service/material/material-master-resolver.d.ts +44 -0
- package/dist-server/service/material/material-master-resolver.js +140 -0
- package/dist-server/service/material/material-master-resolver.js.map +1 -0
- package/dist-server/service/material/material-master.d.ts +9 -0
- package/dist-server/service/material/material-master.js +24 -0
- package/dist-server/service/material/material-master.js.map +1 -0
- package/dist-server/service/material/material-query.d.ts +8 -0
- package/dist-server/service/material/material-query.js +50 -0
- package/dist-server/service/material/material-query.js.map +1 -0
- package/dist-server/service/operation/index.d.ts +5 -0
- package/dist-server/service/operation/index.js +9 -0
- package/dist-server/service/operation/index.js.map +1 -0
- package/dist-server/service/operation/operation-definition.d.ts +52 -0
- package/dist-server/service/operation/operation-definition.js +142 -0
- package/dist-server/service/operation/operation-definition.js.map +1 -0
- package/dist-server/service/operation/operation-master-resolver.d.ts +28 -0
- package/dist-server/service/operation/operation-master-resolver.js +80 -0
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -0
- package/dist-server/service/operation/operation-master.d.ts +21 -0
- package/dist-server/service/operation/operation-master.js +28 -0
- package/dist-server/service/operation/operation-master.js.map +1 -0
- package/dist-server/service/operation/operation-query.d.ts +7 -0
- package/dist-server/service/operation/operation-query.js +41 -0
- package/dist-server/service/operation/operation-query.js.map +1 -0
- package/dist-server/service/personnel/index.d.ts +6 -0
- package/dist-server/service/personnel/index.js +10 -0
- package/dist-server/service/personnel/index.js.map +1 -0
- package/dist-server/service/personnel/person.d.ts +51 -0
- package/dist-server/service/personnel/person.js +119 -0
- package/dist-server/service/personnel/person.js.map +1 -0
- package/dist-server/service/personnel/personnel-class.d.ts +54 -0
- package/dist-server/service/personnel/personnel-class.js +114 -0
- package/dist-server/service/personnel/personnel-class.js.map +1 -0
- package/dist-server/service/personnel/personnel-master-resolver.d.ts +44 -0
- package/dist-server/service/personnel/personnel-master-resolver.js +140 -0
- package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -0
- package/dist-server/service/personnel/personnel-master.d.ts +39 -0
- package/dist-server/service/personnel/personnel-master.js +34 -0
- package/dist-server/service/personnel/personnel-master.js.map +1 -0
- package/dist-server/service/personnel/personnel-query.d.ts +21 -0
- package/dist-server/service/personnel/personnel-query.js +57 -0
- package/dist-server/service/personnel/personnel-query.js.map +1 -0
- package/dist-server/service/personnel/qualification.d.ts +97 -0
- package/dist-server/service/personnel/qualification.js +122 -0
- package/dist-server/service/personnel/qualification.js.map +1 -0
- package/dist-server/service/resource/resource-class.d.ts +25 -0
- package/dist-server/service/resource/resource-class.js +29 -0
- package/dist-server/service/resource/resource-class.js.map +1 -0
- package/dist-server/service/status/axis-stamp.d.ts +16 -0
- package/dist-server/service/status/axis-stamp.js +22 -0
- package/dist-server/service/status/axis-stamp.js.map +1 -0
- package/dist-server/service/status/index.d.ts +3 -0
- package/dist-server/service/status/index.js +7 -0
- package/dist-server/service/status/index.js.map +1 -0
- package/dist-server/service/status/master-status.d.ts +45 -0
- package/dist-server/service/status/master-status.js +129 -0
- package/dist-server/service/status/master-status.js.map +1 -0
- package/dist-server/service/test-spec/index.d.ts +5 -0
- package/dist-server/service/test-spec/index.js +9 -0
- package/dist-server/service/test-spec/index.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +28 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js +80 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master.d.ts +6 -0
- package/dist-server/service/test-spec/test-spec-master.js +18 -0
- package/dist-server/service/test-spec/test-spec-master.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-query.d.ts +7 -0
- package/dist-server/service/test-spec/test-spec-query.js +41 -0
- package/dist-server/service/test-spec/test-spec-query.js.map +1 -0
- package/dist-server/service/test-spec/test-specification.d.ts +41 -0
- package/dist-server/service/test-spec/test-specification.js +106 -0
- package/dist-server/service/test-spec/test-specification.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/package.json +50 -0
- package/things-factory.config.js +12 -0
- package/translations/en.json +53 -0
- package/translations/ja.json +1 -0
- package/translations/ko.json +53 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Domain } from '@things-factory/shell';
|
|
2
|
+
import { User } from '@things-factory/auth-base';
|
|
3
|
+
/**
|
|
4
|
+
* 인원 등급 — **ISA-95 `PersonnelClass`**.
|
|
5
|
+
*
|
|
6
|
+
* 등급은 자격이다. 「용접 자격」이 등급이고, 그 자격을 가진 사람이 개체다. 공정은 특정인을 지목하지
|
|
7
|
+
* 않고 등급으로 요구한다 — 「용접 자격자 2명」.
|
|
8
|
+
*
|
|
9
|
+
* ── 왜 이 패키지가 이것을 갖나 ──────────────────────────────────────────────
|
|
10
|
+
* 인원은 제품의 사실이 아니라 현장의 사실이다. 같은 사람이 MES 에서도 WMS 에서도 일한다. 제품마다
|
|
11
|
+
* 표를 두면 한 사실에 표가 둘이 된다.
|
|
12
|
+
*
|
|
13
|
+
* 그리고 트윈 커널에 `personnelClasses` 자리가 있는데, 지금까지 붙인 원본에는 그 사실이 없었다.
|
|
14
|
+
* 그래서 「자격자가 둘뿐이라 설비가 논다」를 말할 수 없었다
|
|
15
|
+
* (`operato-twin/design/integration/operato-mes.md` §5).
|
|
16
|
+
*
|
|
17
|
+
* ── 필드 이름을 새로 짓지 않는다 ────────────────────────────────────────────
|
|
18
|
+
* 커널 계약의 `ResourceClassDef` 와 같은 이름을 쓴다(`@operato/ops-contract`). 같은 사실에 이름이
|
|
19
|
+
* 둘이면 옮길 때마다 번역이 생기고, 번역이 있으면 틀릴 자리가 생긴다.
|
|
20
|
+
*/
|
|
21
|
+
export declare class PersonnelClass {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
domain?: Domain;
|
|
24
|
+
domainId?: string;
|
|
25
|
+
/** 표준 `PersonnelClassID` — 트윈으로 나갈 때 `ResourceClassDef.id` 가 된다. */
|
|
26
|
+
name: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 상위 등급들 — 표준 `PersonnelClassBaseID`(복수).
|
|
30
|
+
*
|
|
31
|
+
* 「6축 용접 자격」이 「용접 자격」을 상속한다. 배정 판단이 이 상속을 타므로, 상위 등급으로 요구해도
|
|
32
|
+
* 하위 자격자가 잡힌다.
|
|
33
|
+
*/
|
|
34
|
+
baseIds?: string[];
|
|
35
|
+
/** 이 등급의 적격을 정하는 `TestSpecification` 참조들 — 표준 `TestSpecificationID`. 참조만 갖는다. */
|
|
36
|
+
testSpecificationIds?: string[];
|
|
37
|
+
/** 등급 속성 — 표준 `PersonnelClassProperty`. 개체 속성이 `classPropertyId` 로 이것을 구체화한다. */
|
|
38
|
+
properties?: Record<string, unknown>[];
|
|
39
|
+
/**
|
|
40
|
+
* 언제부터 유효한가 — 표준 `EffectiveStartDate`.
|
|
41
|
+
*
|
|
42
|
+
* 자격 규정은 미래 시점으로 선언된다(「9월부터 이 자격이 필요하다」). 이 자리가 없으면 그 선언을
|
|
43
|
+
* 받을 수 없거나, 받고 나서 오늘 배정에 바로 적용된다.
|
|
44
|
+
*/
|
|
45
|
+
effectiveStart?: Date;
|
|
46
|
+
/** 언제까지 유효한가 — 표준 `EffectiveEndDate`. 없으면 끝이 정해지지 않았다. */
|
|
47
|
+
effectiveEnd?: Date;
|
|
48
|
+
createdAt?: Date;
|
|
49
|
+
updatedAt?: Date;
|
|
50
|
+
creator?: User;
|
|
51
|
+
creatorId?: string;
|
|
52
|
+
updater?: User;
|
|
53
|
+
updaterId?: string;
|
|
54
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonnelClass = 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 `PersonnelClass`**.
|
|
11
|
+
*
|
|
12
|
+
* 등급은 자격이다. 「용접 자격」이 등급이고, 그 자격을 가진 사람이 개체다. 공정은 특정인을 지목하지
|
|
13
|
+
* 않고 등급으로 요구한다 — 「용접 자격자 2명」.
|
|
14
|
+
*
|
|
15
|
+
* ── 왜 이 패키지가 이것을 갖나 ──────────────────────────────────────────────
|
|
16
|
+
* 인원은 제품의 사실이 아니라 현장의 사실이다. 같은 사람이 MES 에서도 WMS 에서도 일한다. 제품마다
|
|
17
|
+
* 표를 두면 한 사실에 표가 둘이 된다.
|
|
18
|
+
*
|
|
19
|
+
* 그리고 트윈 커널에 `personnelClasses` 자리가 있는데, 지금까지 붙인 원본에는 그 사실이 없었다.
|
|
20
|
+
* 그래서 「자격자가 둘뿐이라 설비가 논다」를 말할 수 없었다
|
|
21
|
+
* (`operato-twin/design/integration/operato-mes.md` §5).
|
|
22
|
+
*
|
|
23
|
+
* ── 필드 이름을 새로 짓지 않는다 ────────────────────────────────────────────
|
|
24
|
+
* 커널 계약의 `ResourceClassDef` 와 같은 이름을 쓴다(`@operato/ops-contract`). 같은 사실에 이름이
|
|
25
|
+
* 둘이면 옮길 때마다 번역이 생기고, 번역이 있으면 틀릴 자리가 생긴다.
|
|
26
|
+
*/
|
|
27
|
+
let PersonnelClass = class PersonnelClass {
|
|
28
|
+
};
|
|
29
|
+
exports.PersonnelClass = PersonnelClass;
|
|
30
|
+
tslib_1.__decorate([
|
|
31
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
32
|
+
(0, type_graphql_1.Field)(type => type_graphql_1.ID),
|
|
33
|
+
tslib_1.__metadata("design:type", String)
|
|
34
|
+
], PersonnelClass.prototype, "id", void 0);
|
|
35
|
+
tslib_1.__decorate([
|
|
36
|
+
(0, typeorm_1.ManyToOne)(type => shell_1.Domain),
|
|
37
|
+
(0, type_graphql_1.Field)(type => shell_1.Domain),
|
|
38
|
+
tslib_1.__metadata("design:type", shell_1.Domain)
|
|
39
|
+
], PersonnelClass.prototype, "domain", void 0);
|
|
40
|
+
tslib_1.__decorate([
|
|
41
|
+
(0, typeorm_1.RelationId)((klass) => klass.domain),
|
|
42
|
+
tslib_1.__metadata("design:type", String)
|
|
43
|
+
], PersonnelClass.prototype, "domainId", void 0);
|
|
44
|
+
tslib_1.__decorate([
|
|
45
|
+
(0, typeorm_1.Column)(),
|
|
46
|
+
(0, type_graphql_1.Field)(),
|
|
47
|
+
tslib_1.__metadata("design:type", String)
|
|
48
|
+
], PersonnelClass.prototype, "name", void 0);
|
|
49
|
+
tslib_1.__decorate([
|
|
50
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
51
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
52
|
+
tslib_1.__metadata("design:type", String)
|
|
53
|
+
], PersonnelClass.prototype, "description", void 0);
|
|
54
|
+
tslib_1.__decorate([
|
|
55
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
56
|
+
(0, type_graphql_1.Field)(type => [String], { nullable: true }),
|
|
57
|
+
tslib_1.__metadata("design:type", Array)
|
|
58
|
+
], PersonnelClass.prototype, "baseIds", void 0);
|
|
59
|
+
tslib_1.__decorate([
|
|
60
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
61
|
+
(0, type_graphql_1.Field)(type => [String], { nullable: true }),
|
|
62
|
+
tslib_1.__metadata("design:type", Array)
|
|
63
|
+
], PersonnelClass.prototype, "testSpecificationIds", void 0);
|
|
64
|
+
tslib_1.__decorate([
|
|
65
|
+
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
66
|
+
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'ResourceProperty[] as JSON text' }),
|
|
67
|
+
tslib_1.__metadata("design:type", Array)
|
|
68
|
+
], PersonnelClass.prototype, "properties", void 0);
|
|
69
|
+
tslib_1.__decorate([
|
|
70
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
71
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
72
|
+
tslib_1.__metadata("design:type", Date
|
|
73
|
+
/** 언제까지 유효한가 — 표준 `EffectiveEndDate`. 없으면 끝이 정해지지 않았다. */
|
|
74
|
+
)
|
|
75
|
+
], PersonnelClass.prototype, "effectiveStart", void 0);
|
|
76
|
+
tslib_1.__decorate([
|
|
77
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
78
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
79
|
+
tslib_1.__metadata("design:type", Date)
|
|
80
|
+
], PersonnelClass.prototype, "effectiveEnd", void 0);
|
|
81
|
+
tslib_1.__decorate([
|
|
82
|
+
(0, typeorm_1.CreateDateColumn)(),
|
|
83
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
84
|
+
tslib_1.__metadata("design:type", Date)
|
|
85
|
+
], PersonnelClass.prototype, "createdAt", void 0);
|
|
86
|
+
tslib_1.__decorate([
|
|
87
|
+
(0, typeorm_1.UpdateDateColumn)(),
|
|
88
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
|
89
|
+
tslib_1.__metadata("design:type", Date)
|
|
90
|
+
], PersonnelClass.prototype, "updatedAt", void 0);
|
|
91
|
+
tslib_1.__decorate([
|
|
92
|
+
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
|
|
93
|
+
(0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
|
|
94
|
+
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
95
|
+
], PersonnelClass.prototype, "creator", void 0);
|
|
96
|
+
tslib_1.__decorate([
|
|
97
|
+
(0, typeorm_1.RelationId)((klass) => klass.creator),
|
|
98
|
+
tslib_1.__metadata("design:type", String)
|
|
99
|
+
], PersonnelClass.prototype, "creatorId", void 0);
|
|
100
|
+
tslib_1.__decorate([
|
|
101
|
+
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
|
|
102
|
+
(0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true }),
|
|
103
|
+
tslib_1.__metadata("design:type", auth_base_1.User)
|
|
104
|
+
], PersonnelClass.prototype, "updater", void 0);
|
|
105
|
+
tslib_1.__decorate([
|
|
106
|
+
(0, typeorm_1.RelationId)((klass) => klass.updater),
|
|
107
|
+
tslib_1.__metadata("design:type", String)
|
|
108
|
+
], PersonnelClass.prototype, "updaterId", void 0);
|
|
109
|
+
exports.PersonnelClass = PersonnelClass = tslib_1.__decorate([
|
|
110
|
+
(0, typeorm_1.Entity)({ name: 'ops_personnel_class' }),
|
|
111
|
+
(0, typeorm_1.Index)('ix_ops_personnel_class_0', (klass) => [klass.domain, klass.name], { unique: true }),
|
|
112
|
+
(0, type_graphql_1.ObjectType)({ description: 'ISA-95 PersonnelClass — a qualification that operations require' })
|
|
113
|
+
], PersonnelClass);
|
|
114
|
+
//# sourceMappingURL=personnel-class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personnel-class.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-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 `PersonnelClass`**.\n *\n * 등급은 자격이다. 「용접 자격」이 등급이고, 그 자격을 가진 사람이 개체다. 공정은 특정인을 지목하지\n * 않고 등급으로 요구한다 — 「용접 자격자 2명」.\n *\n * ── 왜 이 패키지가 이것을 갖나 ──────────────────────────────────────────────\n * 인원은 제품의 사실이 아니라 현장의 사실이다. 같은 사람이 MES 에서도 WMS 에서도 일한다. 제품마다\n * 표를 두면 한 사실에 표가 둘이 된다.\n *\n * 그리고 트윈 커널에 `personnelClasses` 자리가 있는데, 지금까지 붙인 원본에는 그 사실이 없었다.\n * 그래서 「자격자가 둘뿐이라 설비가 논다」를 말할 수 없었다\n * (`operato-twin/design/integration/operato-mes.md` §5).\n *\n * ── 필드 이름을 새로 짓지 않는다 ────────────────────────────────────────────\n * 커널 계약의 `ResourceClassDef` 와 같은 이름을 쓴다(`@operato/ops-contract`). 같은 사실에 이름이\n * 둘이면 옮길 때마다 번역이 생기고, 번역이 있으면 틀릴 자리가 생긴다.\n */\n@Entity({ name: 'ops_personnel_class' })\n@Index('ix_ops_personnel_class_0', (klass: PersonnelClass) => [klass.domain, klass.name], { unique: true })\n@ObjectType({ description: 'ISA-95 PersonnelClass — a qualification that operations require' })\nexport class PersonnelClass {\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: PersonnelClass) => klass.domain)\n domainId?: string\n\n /** 표준 `PersonnelClassID` — 트윈으로 나갈 때 `ResourceClassDef.id` 가 된다. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * 상위 등급들 — 표준 `PersonnelClassBaseID`(복수).\n *\n * 「6축 용접 자격」이 「용접 자격」을 상속한다. 배정 판단이 이 상속을 타므로, 상위 등급으로 요구해도\n * 하위 자격자가 잡힌다.\n */\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 /** 등급 속성 — 표준 `PersonnelClassProperty`. 개체 속성이 `classPropertyId` 로 이것을 구체화한다. */\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 /**\n * 언제부터 유효한가 — 표준 `EffectiveStartDate`.\n *\n * 자격 규정은 미래 시점으로 선언된다(「9월부터 이 자격이 필요하다」). 이 자리가 없으면 그 선언을\n * 받을 수 없거나, 받고 나서 오늘 배정에 바로 적용된다.\n */\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: PersonnelClass) => 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: PersonnelClass) => klass.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 { PersonnelClass } from './personnel-class';
|
|
4
|
+
import { Person } from './person';
|
|
5
|
+
/**
|
|
6
|
+
* 인원 축을 채우고 고친다.
|
|
7
|
+
*
|
|
8
|
+
* ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
|
|
9
|
+
* 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
|
|
10
|
+
* 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
|
|
11
|
+
* 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
|
|
12
|
+
*
|
|
13
|
+
* 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
|
|
14
|
+
*/
|
|
15
|
+
export declare class PersonnelClassList {
|
|
16
|
+
items: PersonnelClass[];
|
|
17
|
+
total: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class PersonnelClassResolver {
|
|
20
|
+
personnelClasses(params: ListParam, context: ResolverContext): Promise<PersonnelClassList>;
|
|
21
|
+
/**
|
|
22
|
+
* 그리드가 보낸 변경을 한 번에 적용한다.
|
|
23
|
+
*
|
|
24
|
+
* 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
|
|
25
|
+
* 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
|
|
26
|
+
* 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
|
|
27
|
+
*/
|
|
28
|
+
updateMultiplePersonnelClass(patches: MasterPatch[], context: ResolverContext): Promise<PersonnelClass[]>;
|
|
29
|
+
}
|
|
30
|
+
export declare class PersonList {
|
|
31
|
+
items: Person[];
|
|
32
|
+
total: number;
|
|
33
|
+
}
|
|
34
|
+
export declare class PersonResolver {
|
|
35
|
+
persons(params: ListParam, context: ResolverContext): Promise<PersonList>;
|
|
36
|
+
/**
|
|
37
|
+
* 그리드가 보낸 변경을 한 번에 적용한다.
|
|
38
|
+
*
|
|
39
|
+
* 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
|
|
40
|
+
* 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
|
|
41
|
+
* 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
|
|
42
|
+
*/
|
|
43
|
+
updateMultiplePerson(patches: MasterPatch[], context: ResolverContext): Promise<Person[]>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonResolver = exports.PersonList = exports.PersonnelClassResolver = exports.PersonnelClassList = 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 personnel_class_1 = require("./personnel-class");
|
|
11
|
+
const person_1 = require("./person");
|
|
12
|
+
/**
|
|
13
|
+
* 인원 축을 채우고 고친다.
|
|
14
|
+
*
|
|
15
|
+
* ── 왜 마스터는 그리드에서 고칠 수 있나 ────────────────────────────────────
|
|
16
|
+
* 업무 기록과 달리 마스터는 **선언**이다. 「이 사람이 용접 자격을 갖는다」는 일어난 일이 아니라 지금의
|
|
17
|
+
* 규정이고, 규정은 바뀐다. 없앨 때 행을 지우지 않고 유효 기간의 끝을 채우는 것이 그래서다 —
|
|
18
|
+
* 지우면 그것을 가리키는 지난 기록이 가리킬 것을 잃는다.
|
|
19
|
+
*
|
|
20
|
+
* 규칙은 `master-crud.ts` 한 곳에 있다. 여기는 축의 이름만 붙인다.
|
|
21
|
+
*/
|
|
22
|
+
let PersonnelClassList = class PersonnelClassList {
|
|
23
|
+
};
|
|
24
|
+
exports.PersonnelClassList = PersonnelClassList;
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
(0, type_graphql_1.Field)(type => [personnel_class_1.PersonnelClass]),
|
|
27
|
+
tslib_1.__metadata("design:type", Array)
|
|
28
|
+
], PersonnelClassList.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
|
+
], PersonnelClassList.prototype, "total", void 0);
|
|
33
|
+
exports.PersonnelClassList = PersonnelClassList = tslib_1.__decorate([
|
|
34
|
+
(0, type_graphql_1.ObjectType)({ description: 'A page of personnel classes' })
|
|
35
|
+
], PersonnelClassList);
|
|
36
|
+
let PersonnelClassResolver = class PersonnelClassResolver {
|
|
37
|
+
async personnelClasses(params, context) {
|
|
38
|
+
const { domain } = context.state;
|
|
39
|
+
const { items, total } = await (0, master_list_1.listMaster)('personnelClass', params, domain);
|
|
40
|
+
return { items: items, total };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 그리드가 보낸 변경을 한 번에 적용한다.
|
|
44
|
+
*
|
|
45
|
+
* 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
|
|
46
|
+
* 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
|
|
47
|
+
* 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
|
|
48
|
+
*/
|
|
49
|
+
async updateMultiplePersonnelClass(patches, context) {
|
|
50
|
+
const { domain, user, tx } = context.state;
|
|
51
|
+
const axis = (0, master_axis_1.masterAxisOf)('personnelClass');
|
|
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.PersonnelClassResolver = PersonnelClassResolver;
|
|
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 => PersonnelClassList, { description: 'To fetch personnel 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
|
+
], PersonnelClassResolver.prototype, "personnelClasses", 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 => [personnel_class_1.PersonnelClass], { description: 'To create, change or retire personnel 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
|
+
], PersonnelClassResolver.prototype, "updateMultiplePersonnelClass", null);
|
|
78
|
+
exports.PersonnelClassResolver = PersonnelClassResolver = tslib_1.__decorate([
|
|
79
|
+
(0, type_graphql_1.Resolver)(personnel_class_1.PersonnelClass)
|
|
80
|
+
], PersonnelClassResolver);
|
|
81
|
+
let PersonList = class PersonList {
|
|
82
|
+
};
|
|
83
|
+
exports.PersonList = PersonList;
|
|
84
|
+
tslib_1.__decorate([
|
|
85
|
+
(0, type_graphql_1.Field)(type => [person_1.Person]),
|
|
86
|
+
tslib_1.__metadata("design:type", Array)
|
|
87
|
+
], PersonList.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
|
+
], PersonList.prototype, "total", void 0);
|
|
92
|
+
exports.PersonList = PersonList = tslib_1.__decorate([
|
|
93
|
+
(0, type_graphql_1.ObjectType)({ description: 'A page of people' })
|
|
94
|
+
], PersonList);
|
|
95
|
+
let PersonResolver = class PersonResolver {
|
|
96
|
+
async persons(params, context) {
|
|
97
|
+
const { domain } = context.state;
|
|
98
|
+
const { items, total } = await (0, master_list_1.listMaster)('person', params, domain);
|
|
99
|
+
return { items: items, total };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 그리드가 보낸 변경을 한 번에 적용한다.
|
|
103
|
+
*
|
|
104
|
+
* 패치를 `ScalarObject` 로 받는다 — 축마다 입력 타입을 따로 만들면 칸을 하나 더할 때마다 두 곳을
|
|
105
|
+
* 고쳐야 하고, 한쪽을 빠뜨리면 그 칸이 오류 보고 없이 저장되지 않는다. 돌려주는 것은 타입이 있는
|
|
106
|
+
* 엔티티라 무엇이 저장됐는지 스키마로 확인할 수 있다.
|
|
107
|
+
*/
|
|
108
|
+
async updateMultiplePerson(patches, context) {
|
|
109
|
+
const { domain, user, tx } = context.state;
|
|
110
|
+
const axis = (0, master_axis_1.masterAxisOf)('person');
|
|
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.PersonResolver = PersonResolver;
|
|
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 => PersonList, { description: 'To fetch people' }),
|
|
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
|
+
], PersonResolver.prototype, "persons", 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 => [person_1.Person], { description: 'To create, change or retire people' }),
|
|
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
|
+
], PersonResolver.prototype, "updateMultiplePerson", null);
|
|
137
|
+
exports.PersonResolver = PersonResolver = tslib_1.__decorate([
|
|
138
|
+
(0, type_graphql_1.Resolver)(person_1.Person)
|
|
139
|
+
], PersonResolver);
|
|
140
|
+
//# sourceMappingURL=personnel-master-resolver.js.map
|
|
@@ -0,0 +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 { 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 { 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@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 * 패치를 `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"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ResourceClassDef } from '@operato/ops-contract';
|
|
2
|
+
import type { Person } from './person';
|
|
3
|
+
import type { PersonnelClass } from './personnel-class';
|
|
4
|
+
/**
|
|
5
|
+
* MES 의 인원 마스터를 **트윈이 받는 모양**으로 옮긴다.
|
|
6
|
+
*
|
|
7
|
+
* ── 여기가 어긋남이 생기는 자리다 ───────────────────────────────────────────
|
|
8
|
+
* 필드 이름을 계약과 같게 지었으므로 옮기는 일은 거의 없다. 그래도 옮기는 함수를 따로 두는 이유는,
|
|
9
|
+
* **어긋난다면 반드시 여기서 어긋나기** 때문이다. 한 곳에 모아 두면 테스트가 그 한 곳을 본다.
|
|
10
|
+
*
|
|
11
|
+
* 계약 층의 타입(`ResourceClassDef`)을 그대로 쓴다. 우리가 다시 선언하면 그것이 두 번째 어휘가 된다.
|
|
12
|
+
*/
|
|
13
|
+
/** 트윈 `ReferenceMaster.persons` 의 한 항목. 계약에 이름 붙은 타입이 없어 여기서 모양만 적는다. */
|
|
14
|
+
export interface PersonEntry {
|
|
15
|
+
id: string;
|
|
16
|
+
personnelClassIds?: string[];
|
|
17
|
+
homeLocation?: string;
|
|
18
|
+
workCalendar?: unknown[];
|
|
19
|
+
properties?: unknown[];
|
|
20
|
+
testSpecificationIds?: string[];
|
|
21
|
+
testResults?: unknown[];
|
|
22
|
+
effectiveStart?: string;
|
|
23
|
+
effectiveEnd?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function toPersonEntry(person: Person): PersonEntry;
|
|
26
|
+
/**
|
|
27
|
+
* 인원 축 전체 — 트윈이 당겨 갈 조각.
|
|
28
|
+
*
|
|
29
|
+
* ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────
|
|
30
|
+
* 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로
|
|
31
|
+
* **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.
|
|
32
|
+
* 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
|
|
33
|
+
*
|
|
34
|
+
* 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**
|
|
35
|
+
*/
|
|
36
|
+
export declare function personnelMaster(classes: PersonnelClass[], persons: Person[]): {
|
|
37
|
+
personnelClasses: ResourceClassDef[];
|
|
38
|
+
persons: PersonEntry[];
|
|
39
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toPersonEntry = toPersonEntry;
|
|
4
|
+
exports.personnelMaster = personnelMaster;
|
|
5
|
+
const resource_class_1 = require("../resource/resource-class");
|
|
6
|
+
function toPersonEntry(person) {
|
|
7
|
+
const out = { id: person.name };
|
|
8
|
+
(0, resource_class_1.put)(out, 'personnelClassIds', person.personnelClassIds);
|
|
9
|
+
(0, resource_class_1.put)(out, 'homeLocation', person.homeLocation);
|
|
10
|
+
(0, resource_class_1.put)(out, 'workCalendar', person.workCalendar);
|
|
11
|
+
(0, resource_class_1.put)(out, 'properties', person.properties);
|
|
12
|
+
(0, resource_class_1.put)(out, 'testSpecificationIds', person.testSpecificationIds);
|
|
13
|
+
(0, resource_class_1.put)(out, 'testResults', person.testResults);
|
|
14
|
+
(0, resource_class_1.put)(out, 'effectiveStart', (0, resource_class_1.iso)(person.effectiveStart));
|
|
15
|
+
(0, resource_class_1.put)(out, 'effectiveEnd', (0, resource_class_1.iso)(person.effectiveEnd));
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 인원 축 전체 — 트윈이 당겨 갈 조각.
|
|
20
|
+
*
|
|
21
|
+
* ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────
|
|
22
|
+
* 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로
|
|
23
|
+
* **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.
|
|
24
|
+
* 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
|
|
25
|
+
*
|
|
26
|
+
* 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**
|
|
27
|
+
*/
|
|
28
|
+
function personnelMaster(classes, persons) {
|
|
29
|
+
return {
|
|
30
|
+
personnelClasses: classes.map(resource_class_1.toResourceClassDef),
|
|
31
|
+
persons: persons.map(toPersonEntry)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=personnel-master.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personnel-master.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-master.ts"],"names":[],"mappings":";;AA6BA,sCAaC;AAYD,0CAQC;AA5DD,+DAAyE;AA2BzE,SAAgB,aAAa,CAAC,MAAc;IAC1C,MAAM,GAAG,GAA4B,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IAExD,IAAA,oBAAG,EAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;IACvD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC7C,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAA;IAC7C,IAAA,oBAAG,EAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACzC,IAAA,oBAAG,EAAC,GAAG,EAAE,sBAAsB,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAC7D,IAAA,oBAAG,EAAC,GAAG,EAAE,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;IAC3C,IAAA,oBAAG,EAAC,GAAG,EAAE,gBAAgB,EAAE,IAAA,oBAAG,EAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAA;IACtD,IAAA,oBAAG,EAAC,GAAG,EAAE,cAAc,EAAE,IAAA,oBAAG,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAElD,OAAO,GAA6B,CAAA;AACtC,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,eAAe,CAC7B,OAAyB,EACzB,OAAiB;IAEjB,OAAO;QACL,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,mCAAkB,CAAC;QACjD,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;KACpC,CAAA;AACH,CAAC","sourcesContent":["import type { ResourceClassDef } from '@operato/ops-contract'\n\nimport { iso, put, toResourceClassDef } from '../resource/resource-class'\nimport type { Person } from './person'\nimport type { PersonnelClass } from './personnel-class'\n\n/**\n * MES 의 인원 마스터를 **트윈이 받는 모양**으로 옮긴다.\n *\n * ── 여기가 어긋남이 생기는 자리다 ───────────────────────────────────────────\n * 필드 이름을 계약과 같게 지었으므로 옮기는 일은 거의 없다. 그래도 옮기는 함수를 따로 두는 이유는,\n * **어긋난다면 반드시 여기서 어긋나기** 때문이다. 한 곳에 모아 두면 테스트가 그 한 곳을 본다.\n *\n * 계약 층의 타입(`ResourceClassDef`)을 그대로 쓴다. 우리가 다시 선언하면 그것이 두 번째 어휘가 된다.\n */\n\n/** 트윈 `ReferenceMaster.persons` 의 한 항목. 계약에 이름 붙은 타입이 없어 여기서 모양만 적는다. */\nexport interface PersonEntry {\n id: string\n personnelClassIds?: string[]\n homeLocation?: string\n workCalendar?: unknown[]\n properties?: unknown[]\n testSpecificationIds?: string[]\n testResults?: unknown[]\n effectiveStart?: string\n effectiveEnd?: string\n}\n\nexport function toPersonEntry(person: Person): PersonEntry {\n const out: Record<string, unknown> = { id: person.name }\n\n put(out, 'personnelClassIds', person.personnelClassIds)\n put(out, 'homeLocation', person.homeLocation)\n put(out, 'workCalendar', person.workCalendar)\n put(out, 'properties', person.properties)\n put(out, 'testSpecificationIds', person.testSpecificationIds)\n put(out, 'testResults', person.testResults)\n put(out, 'effectiveStart', iso(person.effectiveStart))\n put(out, 'effectiveEnd', iso(person.effectiveEnd))\n\n return out as unknown as PersonEntry\n}\n\n/**\n * 인원 축 전체 — 트윈이 당겨 갈 조각.\n *\n * ── 왜 구조는 밀지 않고 당겨 가나 ───────────────────────────────────────────\n * 사실(생산·이동·검사)은 한 건씩 밀어야 실시간이 된다. 구조는 다르다. 사람이 자기 등급을 가리키므로\n * **서로 맞아야** 하고, 한 건씩 밀면 사람이 먼저 도착하고 등급이 나중에 오는 순간이 생긴다.\n * 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.\n *\n * 그래서 구조는 **바뀌었다는 것만 알리고 트윈이 이 조각을 통째로 당겨 간다.**\n */\nexport function personnelMaster(\n classes: PersonnelClass[],\n persons: Person[]\n): { personnelClasses: ResourceClassDef[]; persons: PersonEntry[] } {\n return {\n personnelClasses: classes.map(toResourceClassDef),\n persons: persons.map(toPersonEntry)\n }\n}\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare class PersonnelMaster {
|
|
2
|
+
/**
|
|
3
|
+
* 트윈이 그대로 받는 모양이라 JSON 문자열로 낸다.
|
|
4
|
+
*
|
|
5
|
+
* 계약 층의 타입을 GraphQL 타입으로 다시 선언하지 않는 이유는, 그렇게 하면 같은 모양이 두 곳에
|
|
6
|
+
* 적히고 한쪽만 고쳐지기 때문이다. 받는 쪽은 이 문자열을 계약 층의 타입으로 읽는다.
|
|
7
|
+
*/
|
|
8
|
+
personnelClasses: string;
|
|
9
|
+
persons: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class PersonnelQuery {
|
|
12
|
+
/**
|
|
13
|
+
* 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.
|
|
14
|
+
*
|
|
15
|
+
* 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이
|
|
16
|
+
* 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
|
|
17
|
+
*
|
|
18
|
+
* 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.
|
|
19
|
+
*/
|
|
20
|
+
personnelMaster(context: ResolverContext): Promise<PersonnelMaster>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PersonnelQuery = exports.PersonnelMaster = 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 person_1 = require("./person");
|
|
8
|
+
const personnel_class_1 = require("./personnel-class");
|
|
9
|
+
const personnel_master_1 = require("./personnel-master");
|
|
10
|
+
let PersonnelMaster = class PersonnelMaster {
|
|
11
|
+
};
|
|
12
|
+
exports.PersonnelMaster = PersonnelMaster;
|
|
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
|
+
], PersonnelMaster.prototype, "personnelClasses", void 0);
|
|
17
|
+
tslib_1.__decorate([
|
|
18
|
+
(0, type_graphql_1.Field)(type => String, { description: 'ReferenceMaster persons[] as JSON text' }),
|
|
19
|
+
tslib_1.__metadata("design:type", String)
|
|
20
|
+
], PersonnelMaster.prototype, "persons", void 0);
|
|
21
|
+
exports.PersonnelMaster = PersonnelMaster = tslib_1.__decorate([
|
|
22
|
+
(0, type_graphql_1.ObjectType)({ description: 'Personnel master as the twin receives it' })
|
|
23
|
+
], PersonnelMaster);
|
|
24
|
+
let PersonnelQuery = class PersonnelQuery {
|
|
25
|
+
/**
|
|
26
|
+
* 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.
|
|
27
|
+
*
|
|
28
|
+
* 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이
|
|
29
|
+
* 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.
|
|
30
|
+
*
|
|
31
|
+
* 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.
|
|
32
|
+
*/
|
|
33
|
+
async personnelMaster(context) {
|
|
34
|
+
const { domain } = context.state;
|
|
35
|
+
const [classes, persons] = await Promise.all([
|
|
36
|
+
(0, shell_1.getRepository)(personnel_class_1.PersonnelClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),
|
|
37
|
+
(0, shell_1.getRepository)(person_1.Person).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } })
|
|
38
|
+
]);
|
|
39
|
+
const master = (0, personnel_master_1.personnelMaster)(classes, persons);
|
|
40
|
+
return {
|
|
41
|
+
personnelClasses: JSON.stringify(master.personnelClasses),
|
|
42
|
+
persons: JSON.stringify(master.persons)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.PersonnelQuery = PersonnelQuery;
|
|
47
|
+
tslib_1.__decorate([
|
|
48
|
+
(0, type_graphql_1.Query)(returns => PersonnelMaster, { description: 'Personnel master for the twin to pull' }),
|
|
49
|
+
tslib_1.__param(0, (0, type_graphql_1.Ctx)()),
|
|
50
|
+
tslib_1.__metadata("design:type", Function),
|
|
51
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
52
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
53
|
+
], PersonnelQuery.prototype, "personnelMaster", null);
|
|
54
|
+
exports.PersonnelQuery = PersonnelQuery = tslib_1.__decorate([
|
|
55
|
+
(0, type_graphql_1.Resolver)(person_1.Person)
|
|
56
|
+
], PersonnelQuery);
|
|
57
|
+
//# sourceMappingURL=personnel-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"personnel-query.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AAEtE,iDAAqD;AAErD,qCAAiC;AACjC,uDAAkD;AAClD,yDAA4E;AAGrE,IAAM,eAAe,GAArB,MAAM,eAAe;CAY3B,CAAA;AAZY,0CAAe;AAQ1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;;yDAClD;AAGxB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC;;gDAClE;0BAXJ,eAAe;IAD3B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;GAC3D,eAAe,CAY3B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB;;;;;;;OAOG;IAEG,AAAN,KAAK,CAAC,eAAe,CAAQ,OAAwB;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC3C,IAAA,qBAAa,EAAC,gCAAc,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;YACpG,IAAA,qBAAa,EAAC,eAAM,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;SAC7F,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAA,kCAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAErD,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACzD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;SACxC,CAAA;IACH,CAAC;CACF,CAAA;AAzBY,wCAAc;AAUnB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,CAAC;IACrE,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAc3B;yBAxBU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,eAAM,CAAC;GACJ,cAAc,CAyB1B","sourcesContent":["import { Ctx, Field, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { Person } from './person'\nimport { PersonnelClass } from './personnel-class'\nimport { personnelMaster as buildPersonnelMaster } from './personnel-master'\n\n@ObjectType({ description: 'Personnel master as the twin receives it' })\nexport class PersonnelMaster {\n /**\n * 트윈이 그대로 받는 모양이라 JSON 문자열로 낸다.\n *\n * 계약 층의 타입을 GraphQL 타입으로 다시 선언하지 않는 이유는, 그렇게 하면 같은 모양이 두 곳에\n * 적히고 한쪽만 고쳐지기 때문이다. 받는 쪽은 이 문자열을 계약 층의 타입으로 읽는다.\n */\n @Field(type => String, { description: 'ResourceClassDef[] as JSON text' })\n personnelClasses: string\n\n @Field(type => String, { description: 'ReferenceMaster persons[] as JSON text' })\n persons: string\n}\n\n@Resolver(Person)\nexport class PersonnelQuery {\n /**\n * 인원 축 전체를 한 번에 낸다 — 트윈이 당겨 가는 자리.\n *\n * 사람이 자기 등급을 가리키므로 **둘이 서로 맞아야 한다.** 한 건씩 밀면 사람이 먼저 도착하고 등급이\n * 나중에 오는 순간이 생기고, 그 순간 트윈은 없는 등급을 가리키는 사람을 갖는다.\n *\n * 자르지 않는다. 인원 마스터는 현장 하나에서 수천을 넘지 않고, 잘라서 보내면 등급과 사람이 나뉜다.\n */\n @Query(returns => PersonnelMaster, { description: 'Personnel master for the twin to pull' })\n async personnelMaster(@Ctx() context: ResolverContext): Promise<PersonnelMaster> {\n const { domain } = context.state\n\n const [classes, persons] = await Promise.all([\n getRepository(PersonnelClass).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } }),\n getRepository(Person).find({ where: { domain: { id: domain.id } }, order: { name: 'ASC' } })\n ])\n\n const master = buildPersonnelMaster(classes, persons)\n\n return {\n personnelClasses: JSON.stringify(master.personnelClasses),\n persons: JSON.stringify(master.persons)\n }\n }\n}\n"]}
|