@things-factory/ops-master 10.0.19 โ 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-client/bootstrap.d.ts +18 -0
- package/dist-client/bootstrap.js +36 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +15 -1
- package/dist-client/index.js +18 -1
- package/dist-client/index.js.map +1 -1
- package/dist-client/pages/master/equipment-class.d.ts +12 -0
- package/dist-client/pages/master/equipment-class.js +42 -0
- package/dist-client/pages/master/equipment-class.js.map +1 -0
- package/dist-client/pages/master/equipment.d.ts +12 -0
- package/dist-client/pages/master/equipment.js +57 -0
- package/dist-client/pages/master/equipment.js.map +1 -0
- package/dist-client/pages/master/grist-iso-duration.d.ts +20 -0
- package/dist-client/pages/master/grist-iso-duration.js +70 -0
- package/dist-client/pages/master/grist-iso-duration.js.map +1 -0
- package/dist-client/pages/master/grist-reference.d.ts +91 -0
- package/dist-client/pages/master/grist-reference.js +419 -0
- package/dist-client/pages/master/grist-reference.js.map +1 -0
- package/dist-client/pages/master/import-rows.d.ts +35 -0
- package/dist-client/pages/master/import-rows.js +66 -0
- package/dist-client/pages/master/import-rows.js.map +1 -0
- package/dist-client/pages/master/iso-duration.d.ts +34 -0
- package/dist-client/pages/master/iso-duration.js +76 -0
- package/dist-client/pages/master/iso-duration.js.map +1 -0
- package/dist-client/pages/master/master-options.d.ts +33 -0
- package/dist-client/pages/master/master-options.js +47 -0
- package/dist-client/pages/master/master-options.js.map +1 -0
- package/dist-client/pages/master/master-page-base.d.ts +357 -0
- package/dist-client/pages/master/master-page-base.js +626 -0
- package/dist-client/pages/master/master-page-base.js.map +1 -0
- package/dist-client/pages/master/material-class.d.ts +12 -0
- package/dist-client/pages/master/material-class.js +42 -0
- package/dist-client/pages/master/material-class.js.map +1 -0
- package/dist-client/pages/master/material-definition.d.ts +12 -0
- package/dist-client/pages/master/material-definition.js +62 -0
- package/dist-client/pages/master/material-definition.js.map +1 -0
- package/dist-client/pages/master/operation-definition.d.ts +12 -0
- package/dist-client/pages/master/operation-definition.js +49 -0
- package/dist-client/pages/master/operation-definition.js.map +1 -0
- package/dist-client/pages/master/operational-location.d.ts +84 -0
- package/dist-client/pages/master/operational-location.js +426 -0
- package/dist-client/pages/master/operational-location.js.map +1 -0
- package/dist-client/pages/master/person.d.ts +12 -0
- package/dist-client/pages/master/person.js +41 -0
- package/dist-client/pages/master/person.js.map +1 -0
- package/dist-client/pages/master/personnel-class.d.ts +12 -0
- package/dist-client/pages/master/personnel-class.js +43 -0
- package/dist-client/pages/master/personnel-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset-class.d.ts +12 -0
- package/dist-client/pages/master/physical-asset-class.js +40 -0
- package/dist-client/pages/master/physical-asset-class.js.map +1 -0
- package/dist-client/pages/master/physical-asset.d.ts +12 -0
- package/dist-client/pages/master/physical-asset.js +41 -0
- package/dist-client/pages/master/physical-asset.js.map +1 -0
- package/dist-client/pages/master/recipe-definition.d.ts +136 -0
- package/dist-client/pages/master/recipe-definition.js +404 -0
- package/dist-client/pages/master/recipe-definition.js.map +1 -0
- package/dist-client/pages/master/reference-targets.d.ts +42 -0
- package/dist-client/pages/master/reference-targets.js +82 -0
- package/dist-client/pages/master/reference-targets.js.map +1 -0
- package/dist-client/pages/master/route-definition.d.ts +19 -0
- package/dist-client/pages/master/route-definition.js +40 -0
- package/dist-client/pages/master/route-definition.js.map +1 -0
- package/dist-client/pages/master/stop-reason.d.ts +12 -0
- package/dist-client/pages/master/stop-reason.js +48 -0
- package/dist-client/pages/master/stop-reason.js.map +1 -0
- package/dist-client/pages/master/test-specification.d.ts +93 -0
- package/dist-client/pages/master/test-specification.js +449 -0
- package/dist-client/pages/master/test-specification.js.map +1 -0
- package/dist-client/pages/master-axes.d.ts +20 -29
- package/dist-client/pages/master-axes.js +32 -182
- package/dist-client/pages/master-axes.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +76 -3
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/asset/asset-lifecycle.d.ts +30 -7
- package/dist-server/service/asset/asset-lifecycle.js +33 -6
- package/dist-server/service/asset/asset-lifecycle.js.map +1 -1
- package/dist-server/service/asset/asset-master-resolver.d.ts +9 -0
- package/dist-server/service/asset/asset-master-resolver.js +41 -0
- package/dist-server/service/asset/asset-master-resolver.js.map +1 -1
- package/dist-server/service/asset/asset-master.js +1 -1
- package/dist-server/service/asset/asset-master.js.map +1 -1
- package/dist-server/service/asset/asset-query.d.ts +9 -1
- package/dist-server/service/asset/asset-query.js +28 -6
- package/dist-server/service/asset/asset-query.js.map +1 -1
- package/dist-server/service/asset/physical-asset-class.js +1 -1
- package/dist-server/service/asset/physical-asset-class.js.map +1 -1
- package/dist-server/service/asset/physical-asset.d.ts +17 -4
- package/dist-server/service/asset/physical-asset.js +6 -6
- package/dist-server/service/asset/physical-asset.js.map +1 -1
- package/dist-server/service/equipment/equipment-class.js +1 -1
- package/dist-server/service/equipment/equipment-class.js.map +1 -1
- package/dist-server/service/equipment/equipment-master-resolver.d.ts +9 -0
- package/dist-server/service/equipment/equipment-master-resolver.js +58 -0
- package/dist-server/service/equipment/equipment-master-resolver.js.map +1 -1
- package/dist-server/service/equipment/equipment-master.d.ts +3 -2
- package/dist-server/service/equipment/equipment-master.js +21 -4
- package/dist-server/service/equipment/equipment-master.js.map +1 -1
- package/dist-server/service/equipment/equipment-query.d.ts +9 -1
- package/dist-server/service/equipment/equipment-query.js +28 -6
- package/dist-server/service/equipment/equipment-query.js.map +1 -1
- package/dist-server/service/equipment/equipment.d.ts +27 -1
- package/dist-server/service/equipment/equipment.js +8 -3
- package/dist-server/service/equipment/equipment.js.map +1 -1
- package/dist-server/service/equipment/state-period-rules.d.ts +19 -0
- package/dist-server/service/equipment/state-period-rules.js +35 -1
- package/dist-server/service/equipment/state-period-rules.js.map +1 -1
- package/dist-server/service/index.d.ts +4 -1
- package/dist-server/service/index.js +11 -2
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/location/location-master-resolver.d.ts +29 -0
- package/dist-server/service/location/location-master-resolver.js +228 -1
- package/dist-server/service/location/location-master-resolver.js.map +1 -1
- package/dist-server/service/location/location-query.d.ts +9 -1
- package/dist-server/service/location/location-query.js +24 -9
- package/dist-server/service/location/location-query.js.map +1 -1
- package/dist-server/service/location/operational-location.d.ts +37 -0
- package/dist-server/service/location/operational-location.js +22 -2
- package/dist-server/service/location/operational-location.js.map +1 -1
- package/dist-server/service/master-axis.js +2 -2
- package/dist-server/service/master-axis.js.map +1 -1
- package/dist-server/service/master-conformance-resolver.d.ts +34 -0
- package/dist-server/service/master-conformance-resolver.js +143 -0
- package/dist-server/service/master-conformance-resolver.js.map +1 -0
- package/dist-server/service/master-conformance.d.ts +80 -0
- package/dist-server/service/master-conformance.js +266 -0
- package/dist-server/service/master-conformance.js.map +1 -0
- package/dist-server/service/master-page-query.d.ts +33 -0
- package/dist-server/service/master-page-query.js +55 -0
- package/dist-server/service/master-page-query.js.map +1 -0
- package/dist-server/service/master-page.d.ts +85 -0
- package/dist-server/service/master-page.js +104 -0
- package/dist-server/service/master-page.js.map +1 -0
- package/dist-server/service/material/material-class.js +1 -1
- package/dist-server/service/material/material-class.js.map +1 -1
- package/dist-server/service/material/material-definition.js +2 -2
- package/dist-server/service/material/material-definition.js.map +1 -1
- package/dist-server/service/material/material-master-resolver.d.ts +62 -0
- package/dist-server/service/material/material-master-resolver.js +213 -0
- package/dist-server/service/material/material-master-resolver.js.map +1 -1
- package/dist-server/service/material/material-query.d.ts +9 -1
- package/dist-server/service/material/material-query.js +28 -6
- package/dist-server/service/material/material-query.js.map +1 -1
- package/dist-server/service/material/recipe-index.d.ts +23 -0
- package/dist-server/service/material/recipe-index.js +44 -0
- package/dist-server/service/material/recipe-index.js.map +1 -0
- package/dist-server/service/operation/operation-definition.d.ts +1 -1
- package/dist-server/service/operation/operation-definition.js +4 -4
- package/dist-server/service/operation/operation-definition.js.map +1 -1
- package/dist-server/service/operation/operation-master-resolver.d.ts +24 -0
- package/dist-server/service/operation/operation-master-resolver.js +107 -0
- package/dist-server/service/operation/operation-master-resolver.js.map +1 -1
- package/dist-server/service/operation/operation-query.d.ts +10 -2
- package/dist-server/service/operation/operation-query.js +25 -10
- package/dist-server/service/operation/operation-query.js.map +1 -1
- package/dist-server/service/personnel/person.js +3 -3
- package/dist-server/service/personnel/person.js.map +1 -1
- package/dist-server/service/personnel/personnel-class.d.ts +1 -1
- package/dist-server/service/personnel/personnel-class.js +2 -2
- package/dist-server/service/personnel/personnel-class.js.map +1 -1
- package/dist-server/service/personnel/personnel-master-resolver.d.ts +9 -0
- package/dist-server/service/personnel/personnel-master-resolver.js +43 -0
- package/dist-server/service/personnel/personnel-master-resolver.js.map +1 -1
- package/dist-server/service/personnel/personnel-master.js +1 -1
- package/dist-server/service/personnel/personnel-master.js.map +1 -1
- package/dist-server/service/personnel/personnel-query.d.ts +9 -1
- package/dist-server/service/personnel/personnel-query.js +28 -6
- package/dist-server/service/personnel/personnel-query.js.map +1 -1
- package/dist-server/service/recipe/recipe-definition.d.ts +3 -3
- package/dist-server/service/recipe/recipe-definition.js +3 -3
- package/dist-server/service/recipe/recipe-definition.js.map +1 -1
- package/dist-server/service/recipe/recipe-master-resolver.d.ts +1 -1
- package/dist-server/service/recipe/recipe-master-resolver.js +1 -1
- package/dist-server/service/recipe/recipe-master-resolver.js.map +1 -1
- package/dist-server/service/recipe/recipe-master.d.ts +1 -1
- package/dist-server/service/recipe/recipe-master.js +2 -2
- package/dist-server/service/recipe/recipe-master.js.map +1 -1
- package/dist-server/service/recipe/recipe-query.d.ts +11 -3
- package/dist-server/service/recipe/recipe-query.js +30 -9
- package/dist-server/service/recipe/recipe-query.js.map +1 -1
- package/dist-server/service/recipe/route-definition.d.ts +6 -6
- package/dist-server/service/recipe/route-definition.js +6 -6
- package/dist-server/service/recipe/route-definition.js.map +1 -1
- package/dist-server/service/resource/class-lineage.d.ts +46 -0
- package/dist-server/service/resource/class-lineage.js +80 -0
- package/dist-server/service/resource/class-lineage.js.map +1 -0
- package/dist-server/service/resource/class-members.d.ts +36 -0
- package/dist-server/service/resource/class-members.js +50 -0
- package/dist-server/service/resource/class-members.js.map +1 -0
- package/dist-server/service/resource/referrers.d.ts +54 -0
- package/dist-server/service/resource/referrers.js +99 -0
- package/dist-server/service/resource/referrers.js.map +1 -0
- package/dist-server/service/test-spec/criteria-check.d.ts +53 -0
- package/dist-server/service/test-spec/criteria-check.js +142 -0
- package/dist-server/service/test-spec/criteria-check.js.map +1 -0
- package/dist-server/service/test-spec/criteria-rows.d.ts +89 -0
- package/dist-server/service/test-spec/criteria-rows.js +139 -0
- package/dist-server/service/test-spec/criteria-rows.js.map +1 -0
- package/dist-server/service/test-spec/test-spec-master-resolver.d.ts +33 -7
- package/dist-server/service/test-spec/test-spec-master-resolver.js +137 -2
- package/dist-server/service/test-spec/test-spec-master-resolver.js.map +1 -1
- package/dist-server/service/test-spec/test-spec-query.d.ts +9 -1
- package/dist-server/service/test-spec/test-spec-query.js +23 -9
- package/dist-server/service/test-spec/test-spec-query.js.map +1 -1
- package/dist-server/service/test-spec/test-specification.js +1 -1
- package/dist-server/service/test-spec/test-specification.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/ops-master/equipment-class.ko.md +11 -0
- package/helps/ops-master/equipment-class.md +11 -0
- package/helps/ops-master/equipment.ko.md +11 -0
- package/helps/ops-master/equipment.md +11 -0
- package/helps/ops-master/material-class.ko.md +11 -0
- package/helps/ops-master/material-class.md +11 -0
- package/helps/ops-master/material-definition.ko.md +11 -0
- package/helps/ops-master/material-definition.md +11 -0
- package/helps/ops-master/operation-definition.ko.md +11 -0
- package/helps/ops-master/operation-definition.md +11 -0
- package/helps/ops-master/operational-location.ko.md +11 -0
- package/helps/ops-master/operational-location.md +11 -0
- package/helps/ops-master/person.ko.md +11 -0
- package/helps/ops-master/person.md +11 -0
- package/helps/ops-master/personnel-class.ko.md +11 -0
- package/helps/ops-master/personnel-class.md +11 -0
- package/helps/ops-master/physical-asset-class.ko.md +11 -0
- package/helps/ops-master/physical-asset-class.md +11 -0
- package/helps/ops-master/physical-asset.ko.md +11 -0
- package/helps/ops-master/physical-asset.md +11 -0
- package/helps/ops-master/recipe-definition.ko.md +11 -0
- package/helps/ops-master/recipe-definition.md +11 -0
- package/helps/ops-master/route-definition.ko.md +11 -0
- package/helps/ops-master/route-definition.md +11 -0
- package/helps/ops-master/stop-reason.ko.md +11 -0
- package/helps/ops-master/stop-reason.md +11 -0
- package/helps/ops-master/test-specification.ko.md +11 -0
- package/helps/ops-master/test-specification.md +11 -0
- package/package.json +5 -5
- package/things-factory.config.js +22 -2
- package/translations/en.json +86 -3
- package/translations/ja.json +92 -1
- package/translations/ko.json +93 -10
- package/translations/ms.json +92 -1
- package/translations/zh.json +92 -1
- package/dist-client/pages/master-list.d.ts +0 -68
- package/dist-client/pages/master-list.js +0 -239
- package/dist-client/pages/master-list.js.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ์ ์กฐ๋ฒ์ **ํ๋ชฉ์์ ๋์ฐพ์ ์ ์๊ฒ** ๋ค์ง๋๋ค.
|
|
3
|
+
*
|
|
4
|
+
* ์ ์กฐ๋ฒ์ ใ์ด ํ๋ชฉ์ ๋ง๋ค๋ ค๋ฉด ๋ฌด์์ด ๋๋ใ๋ฅผ ๋งํ๋ค. ํ๋ชฉ ํ๋ฉด์ด ๋ฌป๋ ๊ฒ์ ๊ทธ ๋ฐ๋๋ค โ ใ์ด
|
|
5
|
+
* ํ๋ชฉ์ ๋ง๋๋ ์ ์กฐ๋ฒ์ ๋ฌด์์ด๊ณ , ์ด ํ๋ชฉ์ ์ด๋์ ์ฐ์ด๋ใ. ๊ทธ ๋ค์ง๊ธฐ๊ฐ ์ฌ๊ธฐ ์๋ค.
|
|
6
|
+
*
|
|
7
|
+
* ํ๋ฉด๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ผ์ด ๋๋ ๊ฒ์ **์ํ ๋๋ฌธ**์ด๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ฅด๋ ๊ฒ(๊ฐ์ ์ ์กฐ๋ฒ์ด ํ
|
|
8
|
+
* ํ๋ชฉ์ ๋ ๊ณต์ ์์ ์ฐ๋ ๊ฒฝ์ฐ ยท ์ด๋ฆ์ด ๋น ์ค)์ ์ค์ ์๋ฃ์์ ์ผ์ด๋๋ ์ผ์ด๊ณ , ์๋ฒ๋ฅผ ๋์ฐ์ง ์๊ณ
|
|
9
|
+
* ํ์ธํ ์ ์์ด์ผ ํ๋ค.
|
|
10
|
+
*/
|
|
11
|
+
/** ์ ์กฐ๋ฒ ํ ์ค์์ ์ด ๋ค์ง๊ธฐ๊ฐ ๋ณด๋ ๊ฒ๋ง. */
|
|
12
|
+
export interface RecipeShape {
|
|
13
|
+
name: string;
|
|
14
|
+
materialDefinitionName?: string;
|
|
15
|
+
inputs?: Record<string, unknown>[];
|
|
16
|
+
}
|
|
17
|
+
export interface RecipeIndex {
|
|
18
|
+
/** ๋ง๋๋ ํ๋ชฉ โ ์ ์กฐ๋ฒ ์ด๋ฆ๋ค. */
|
|
19
|
+
makes: Map<string, string[]>;
|
|
20
|
+
/** ํฌ์
ํ๋ชฉ โ ์ ์กฐ๋ฒ ์ด๋ฆ๋ค. */
|
|
21
|
+
uses: Map<string, string[]>;
|
|
22
|
+
}
|
|
23
|
+
export declare function indexRecipes(rows: readonly RecipeShape[]): RecipeIndex;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ์ ์กฐ๋ฒ์ **ํ๋ชฉ์์ ๋์ฐพ์ ์ ์๊ฒ** ๋ค์ง๋๋ค.
|
|
4
|
+
*
|
|
5
|
+
* ์ ์กฐ๋ฒ์ ใ์ด ํ๋ชฉ์ ๋ง๋ค๋ ค๋ฉด ๋ฌด์์ด ๋๋ใ๋ฅผ ๋งํ๋ค. ํ๋ชฉ ํ๋ฉด์ด ๋ฌป๋ ๊ฒ์ ๊ทธ ๋ฐ๋๋ค โ ใ์ด
|
|
6
|
+
* ํ๋ชฉ์ ๋ง๋๋ ์ ์กฐ๋ฒ์ ๋ฌด์์ด๊ณ , ์ด ํ๋ชฉ์ ์ด๋์ ์ฐ์ด๋ใ. ๊ทธ ๋ค์ง๊ธฐ๊ฐ ์ฌ๊ธฐ ์๋ค.
|
|
7
|
+
*
|
|
8
|
+
* ํ๋ฉด๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ผ์ด ๋๋ ๊ฒ์ **์ํ ๋๋ฌธ**์ด๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ฅด๋ ๊ฒ(๊ฐ์ ์ ์กฐ๋ฒ์ด ํ
|
|
9
|
+
* ํ๋ชฉ์ ๋ ๊ณต์ ์์ ์ฐ๋ ๊ฒฝ์ฐ ยท ์ด๋ฆ์ด ๋น ์ค)์ ์ค์ ์๋ฃ์์ ์ผ์ด๋๋ ์ผ์ด๊ณ , ์๋ฒ๋ฅผ ๋์ฐ์ง ์๊ณ
|
|
10
|
+
* ํ์ธํ ์ ์์ด์ผ ํ๋ค.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.indexRecipes = indexRecipes;
|
|
14
|
+
function indexRecipes(rows) {
|
|
15
|
+
const makes = new Map();
|
|
16
|
+
const uses = new Map();
|
|
17
|
+
const add = (map, key, recipe) => {
|
|
18
|
+
const name = String(key ?? '').trim();
|
|
19
|
+
/* ์ด๋ฆ์ด ๋น ์ค์ ์๋ฌด๊ฒ๋ ๊ฐ๋ฆฌํค์ง ์๋๋ค. ๋น ์ด๋ฆ์ผ๋ก ๋ฌถ์ผ๋ฉด ์๋ ํ๋ชฉ ํ๋๊ฐ ์๊ธด๋ค. */
|
|
20
|
+
if (!name || !recipe) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const list = map.get(name);
|
|
24
|
+
if (!list) {
|
|
25
|
+
map.set(name, [recipe]);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
/*
|
|
29
|
+
* ๊ฐ์ ์ ์กฐ๋ฒ์ด ๊ฐ์ ํ๋ชฉ์ ๋ ๊ณต์ ์์ ์ฐ๋ฉด **ํ ๋ฒ๋ง** ์ ๋๋ค. ใ์ด๋์ ์ฐ์ด๋ใ์ ๋ต์
|
|
30
|
+
* ์ ์กฐ๋ฒ์ด์ง ํฌ์
์ค์ด ์๋๋ค โ ๋ ๋ฒ ์ ์ผ๋ฉด ใ๋ ๊ตฐ๋ฐ ์ฐ์ธ๋คใ๋ก ์ฝํ๋ค.
|
|
31
|
+
*/
|
|
32
|
+
if (!list.includes(recipe)) {
|
|
33
|
+
list.push(recipe);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
for (const row of rows) {
|
|
37
|
+
add(makes, row.materialDefinitionName, row.name);
|
|
38
|
+
for (const part of row.inputs ?? []) {
|
|
39
|
+
add(uses, part?.material, row.name);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { makes, uses };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=recipe-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-index.js","sourceRoot":"","sources":["../../../server/service/material/recipe-index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAgBH,oCAqCC;AArCD,SAAgB,YAAY,CAAC,IAA4B;IACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoB,CAAA;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAA;IAExC,MAAM,GAAG,GAAG,CAAC,GAA0B,EAAE,GAAY,EAAE,MAAc,EAAE,EAAE;QACvE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QAErC,uDAAuD;QACvD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE1B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;YACvB,OAAM;QACR,CAAC;QAED;;;WAGG;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,sBAAsB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QAEhD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC","sourcesContent":["/**\n * ์ ์กฐ๋ฒ์ **ํ๋ชฉ์์ ๋์ฐพ์ ์ ์๊ฒ** ๋ค์ง๋๋ค.\n *\n * ์ ์กฐ๋ฒ์ ใ์ด ํ๋ชฉ์ ๋ง๋ค๋ ค๋ฉด ๋ฌด์์ด ๋๋ใ๋ฅผ ๋งํ๋ค. ํ๋ชฉ ํ๋ฉด์ด ๋ฌป๋ ๊ฒ์ ๊ทธ ๋ฐ๋๋ค โ ใ์ด\n * ํ๋ชฉ์ ๋ง๋๋ ์ ์กฐ๋ฒ์ ๋ฌด์์ด๊ณ , ์ด ํ๋ชฉ์ ์ด๋์ ์ฐ์ด๋ใ. ๊ทธ ๋ค์ง๊ธฐ๊ฐ ์ฌ๊ธฐ ์๋ค.\n *\n * ํ๋ฉด๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ผ์ด ๋๋ ๊ฒ์ **์ํ ๋๋ฌธ**์ด๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ฅด๋ ๊ฒ(๊ฐ์ ์ ์กฐ๋ฒ์ด ํ\n * ํ๋ชฉ์ ๋ ๊ณต์ ์์ ์ฐ๋ ๊ฒฝ์ฐ ยท ์ด๋ฆ์ด ๋น ์ค)์ ์ค์ ์๋ฃ์์ ์ผ์ด๋๋ ์ผ์ด๊ณ , ์๋ฒ๋ฅผ ๋์ฐ์ง ์๊ณ \n * ํ์ธํ ์ ์์ด์ผ ํ๋ค.\n */\n\n/** ์ ์กฐ๋ฒ ํ ์ค์์ ์ด ๋ค์ง๊ธฐ๊ฐ ๋ณด๋ ๊ฒ๋ง. */\nexport interface RecipeShape {\n name: string\n materialDefinitionName?: string\n inputs?: Record<string, unknown>[]\n}\n\nexport interface RecipeIndex {\n /** ๋ง๋๋ ํ๋ชฉ โ ์ ์กฐ๋ฒ ์ด๋ฆ๋ค. */\n makes: Map<string, string[]>\n /** ํฌ์
ํ๋ชฉ โ ์ ์กฐ๋ฒ ์ด๋ฆ๋ค. */\n uses: Map<string, string[]>\n}\n\nexport function indexRecipes(rows: readonly RecipeShape[]): RecipeIndex {\n const makes = new Map<string, string[]>()\n const uses = new Map<string, string[]>()\n\n const add = (map: Map<string, string[]>, key: unknown, recipe: string) => {\n const name = String(key ?? '').trim()\n\n /* ์ด๋ฆ์ด ๋น ์ค์ ์๋ฌด๊ฒ๋ ๊ฐ๋ฆฌํค์ง ์๋๋ค. ๋น ์ด๋ฆ์ผ๋ก ๋ฌถ์ผ๋ฉด ์๋ ํ๋ชฉ ํ๋๊ฐ ์๊ธด๋ค. */\n if (!name || !recipe) {\n return\n }\n\n const list = map.get(name)\n\n if (!list) {\n map.set(name, [recipe])\n return\n }\n\n /*\n * ๊ฐ์ ์ ์กฐ๋ฒ์ด ๊ฐ์ ํ๋ชฉ์ ๋ ๊ณต์ ์์ ์ฐ๋ฉด **ํ ๋ฒ๋ง** ์ ๋๋ค. ใ์ด๋์ ์ฐ์ด๋ใ์ ๋ต์\n * ์ ์กฐ๋ฒ์ด์ง ํฌ์
์ค์ด ์๋๋ค โ ๋ ๋ฒ ์ ์ผ๋ฉด ใ๋ ๊ตฐ๋ฐ ์ฐ์ธ๋คใ๋ก ์ฝํ๋ค.\n */\n if (!list.includes(recipe)) {\n list.push(recipe)\n }\n }\n\n for (const row of rows) {\n add(makes, row.materialDefinitionName, row.name)\n\n for (const part of row.inputs ?? []) {\n add(uses, part?.material, row.name)\n }\n }\n\n return { makes, uses }\n}\n"]}
|
|
@@ -14,7 +14,7 @@ export declare class OperationDefinition {
|
|
|
14
14
|
readonly id: string;
|
|
15
15
|
domain?: Domain;
|
|
16
16
|
domainId?: string;
|
|
17
|
-
/** ๊ณต์ ํค โ
|
|
17
|
+
/** ๊ณต์ ํค โ ๋ผ์ฐํ
์ ๋จ๊ณ๊ฐ ์ด ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. */
|
|
18
18
|
name: string;
|
|
19
19
|
description?: string;
|
|
20
20
|
/** ๋ฌด์์ ํ๋ ๊ณต์ ์ธ๊ฐ โ `transport` ยท `process` ยท `dwell`. */
|
|
@@ -70,22 +70,22 @@ tslib_1.__decorate([
|
|
|
70
70
|
], OperationDefinition.prototype, "duration", void 0);
|
|
71
71
|
tslib_1.__decorate([
|
|
72
72
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
73
|
-
(0, type_graphql_1.Field)(type =>
|
|
73
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'DurationVariability' }),
|
|
74
74
|
tslib_1.__metadata("design:type", Object)
|
|
75
75
|
], OperationDefinition.prototype, "variability", void 0);
|
|
76
76
|
tslib_1.__decorate([
|
|
77
77
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
78
|
-
(0, type_graphql_1.Field)(type =>
|
|
78
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'OperationParameter[]' }),
|
|
79
79
|
tslib_1.__metadata("design:type", Array)
|
|
80
80
|
], OperationDefinition.prototype, "parameters", void 0);
|
|
81
81
|
tslib_1.__decorate([
|
|
82
82
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
83
|
-
(0, type_graphql_1.Field)(type =>
|
|
83
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PersonnelSpecification[]' }),
|
|
84
84
|
tslib_1.__metadata("design:type", Array)
|
|
85
85
|
], OperationDefinition.prototype, "personnelSpecification", void 0);
|
|
86
86
|
tslib_1.__decorate([
|
|
87
87
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
88
|
-
(0, type_graphql_1.Field)(type =>
|
|
88
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'PhysicalAssetSpecification[]' }),
|
|
89
89
|
tslib_1.__metadata("design:type", Array)
|
|
90
90
|
], OperationDefinition.prototype, "physicalAssetSpecification", void 0);
|
|
91
91
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-definition.js","sourceRoot":"","sources":["../../../server/service/operation/operation-definition.ts"],"names":[],"mappings":";;;;AAAA,qCASgB;AAChB,+CAAoD;AAEpD,
|
|
1
|
+
{"version":3,"file":"operation-definition.js","sourceRoot":"","sources":["../../../server/service/operation/operation-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, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ๊ณต์ ์ ์ โ **ISA-95 `OperationsSegment`**(`OperationsDefinition` ์์).\n *\n * ์ด ์๋ฆฌ๊ฐ ๋ตํ๋ ๊ฒ์ ใ์ด ๊ณต์ ์ด ์ผ๋ง๋ ๊ฑธ๋ฆฌ๊ณ ๋ฌด์์ ํ์๋ก ํ๋๊ฐใ๋ค. ์์ธก์ด ์ฐ๋ ์์์๊ฐ์\n * ๊ทผ๊ฑฐ์ด๊ณ , ์ ์์ํ ์ํ๊ณผ ๋ณ๋ชฉ์ ๊ณต์ ๋ณ๋ก ๋ผ ์ ์๊ฒ ํ๋ ๊ฐ์ด๋ค.\n *\n * โโ ํ์ ์์์ ์ ์ง ์์ผ๋ฉด ์ฌ๋์ด ์๋ ๊ณต์ฅ์ด ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์ธ์ ๋ช
์ธ๊ฐ ์์ผ๋ฉด ์ฌ๋์ ์์ธก์ ์กด์ฌํ์ง ์๋๋ค. ์ค๋น๋ง ์์ผ๋ฉด ์ธ์ ๋ ๊ฐ๋๋๋ ๊ณต์ฅ์ด ๋๊ณ , ํ์ฅ์์\n * ๊ฐ์ฅ ์์ฃผ ๋ชจ์๋ผ๋ ์์์ด ๋ง๋๋ ์ค์ด ํต์งธ๋ก ์ฌ๋ผ์ง๋ค. ๋ฑ๊ธ์ผ๋ก ์๊ตฌํ๋ค โ ใ์ฉ์ ์๊ฒฉ์ 2๋ช
ใ.\n */\n@Entity({ name: 'ops_operation_definition' })\n@Index('ix_ops_operation_definition_0', (operation: OperationDefinition) => [operation.domain, operation.name], {\n unique: true\n})\n@ObjectType({ description: 'ISA-95 OperationsSegment โ what an operation takes and requires' })\nexport class OperationDefinition {\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((operation: OperationDefinition) => operation.domain)\n domainId?: string\n\n /** ๊ณต์ ํค โ ๋ผ์ฐํ
์ ๋จ๊ณ๊ฐ ์ด ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค. */\n @Column()\n @Field()\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /** ๋ฌด์์ ํ๋ ๊ณต์ ์ธ๊ฐ โ `transport` ยท `process` ยท `dwell`. */\n @Column()\n @Field()\n intent: string\n\n /** ์ด ๊ณต์ ์ด ๋ฒ์ด์ง๋ ์๋ฆฌ ํ์
. ์์ผ๋ฉด ์ปค๋์ด ์ด๋์ ์ผํ๋์ง ์ ํ ์ ์๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n locationType?: string\n\n /** ํ์ํ ์ค๋น ์ข
๋ฅ. `dwell` ์ ์์์ ์ก์ง ์๋๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n resourceType?: string\n\n /** ๋ฐฉ์ถํ CBV bizStep URN. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n bizStep?: string\n\n /** ์์์๊ฐ โ ํ์ค `Duration`. ISO 8601 ๊ธฐ๊ฐ ํ๊ธฐ๋ค. ์์ผ๋ฉด ์ปค๋์ด ๊ธฐ๋ณธ๊ฐ์ ์ด๋ค. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n duration?: string\n\n /** ์์์๊ฐ ๋ณ๋ โ ํ์ค ๋ฐ ํ์ฅ. ์์ผ๋ฉด ์์๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'DurationVariability' })\n variability?: Record<string, unknown>\n\n /** ๊ณต์ ๋ชจ์ โ ํ์ค `ParameterSpecification`. ์์จ ยท ์
์
์๊ฐ ยท ์จ๋๊ฐ ์ฌ๊ธฐ ์จ๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'OperationParameter[]' })\n parameters?: Record<string, unknown>[]\n\n /** ํ์ ์ธ์ โ ํ์ค `PersonnelSpecification`(๋ฑ๊ธ + ์๋). */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'PersonnelSpecification[]' })\n personnelSpecification?: Record<string, unknown>[]\n\n /** ํ์ ๋ฌผ๋ฆฌ ์์ฐ โ ํ์ค `PhysicalAssetSpecification`. ๋น ํ๋ ํธ๊ฐ ์์ด ์ถ๊ณ ๊ฐ ๋ชป ๋๊ฐ๋ ์ผ์ ์ฆ๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'PhysicalAssetSpecification[]' })\n physicalAssetSpecification?: Record<string, unknown>[]\n\n /** ์ธ์ ๋ถํฐ ์ ํจํ๊ฐ โ ํ์ค `EffectiveStartDate`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n effectiveStart?: Date\n\n /**\n * ์ธ์ ๊น์ง ์ ํจํ๊ฐ โ ํ์ค `EffectiveEndDate`.\n *\n * **์์จ ๋ ํ์ ์ง์ฐ์ง ์๊ณ ์ด ์นธ์ ์ฑ์ด๋ค.** ์ง์ฐ๋ฉด ๊ทธ๊ฒ์ ๊ฐ๋ฆฌํค๋ ์ง๋ ๊ธฐ๋ก์ด ๊ฐ๋ฆฌํฌ ๊ฒ์ ์๋๋ค.\n */\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((operation: OperationDefinition) => operation.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((operation: OperationDefinition) => operation.updater)\n updaterId?: string\n}\n"]}
|
|
@@ -17,6 +17,30 @@ export declare class OperationDefinitionList {
|
|
|
17
17
|
}
|
|
18
18
|
export declare class OperationDefinitionResolver {
|
|
19
19
|
operationDefinitions(params: ListParam, context: ResolverContext): Promise<OperationDefinitionList>;
|
|
20
|
+
/**
|
|
21
|
+
* ์ด ๊ณต์ ์ ๋จ๊ณ๋ก ๊ฐ๋ **๋ผ์ฐํ
๋ค.**
|
|
22
|
+
*
|
|
23
|
+
* ๊ณต์ ์ ๊ณ ์น๊ธฐ ์ ์ ๋ฌด์์ด ๋ธ๋ ค ์ค๋์ง ์ฌ๊ธฐ์ ๋ณธ๋ค. ์ฌ๋ฟ์ผ ์ ์๋ค โ ๊ฐ์ ๊ณต์ ์ ์ฌ๋ฌ ๋ผ์ฐํ
์ด
|
|
24
|
+
* ์ง๋๋ค(์ ๋จ์ ํ์ค์๋ ๋น ๋ฅธ ๊ฒ์๋ ์๋ค).
|
|
25
|
+
*
|
|
26
|
+
* ์๋ฌด๋ ์ ์ฐ๋ฉด ๋น ๋ชฉ๋ก์ด๋ค. ๋ค๋ง ๊ทธ๊ฒ์ด ใ์ ์ด๋คใ์ธ์ง ใ๋ค ๋ชป ๋ดค๋คใ์ธ์ง๋
|
|
27
|
+
* `referrerScanCapped` ๊ฐ ๋งํ๋ค.
|
|
28
|
+
*/
|
|
29
|
+
usedInRoutes(operation: OperationDefinition, context: ResolverContext): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* ์ด ๊ณต์ ์์ ์์ฌ๋ฅผ ๋ฃ๋ **์ ์กฐ๋ฒ๋ค.**
|
|
32
|
+
*
|
|
33
|
+
* ๋ผ์ฐํ
์ ใ์ด๋๋ฅผ ์ง๋๋ใ์ด๊ณ ์ด๊ฒ์ ใ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ๋น ์ง๋ใ๋ค. ๊ณต์ ์ ์์ ๋ฉด ๊ทธ ์์ฌ๊ฐ
|
|
34
|
+
* ๋น ์ง ์๋ฆฌ๋ฅผ ์๋๋ค.
|
|
35
|
+
*/
|
|
36
|
+
consumedAt(operation: OperationDefinition, context: ResolverContext): Promise<string[]>;
|
|
37
|
+
/**
|
|
38
|
+
* ๋ผ์ฐํ
ยท์ ์กฐ๋ฒ์ ๋ค ๋ณด์ง ๋ชปํ๋.
|
|
39
|
+
*
|
|
40
|
+
* **์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.** ์ํ์ ๊ฑธ๋ฆฌ๋ฉด ์์ ๋ ์นธ์ด ๋ ์ฐฌ ๋ต์ด๊ณ , ๊ทธ๊ฒ์ ๋งํ์ง ์์ผ๋ฉด
|
|
41
|
+
* ใ์ฐ๋ ๋ฐ๊ฐ ์๋คใ์ ใ๋ชป ๋ดค๋คใ๊ฐ ๊ฐ์ ๋ณด์ธ๋ค.
|
|
42
|
+
*/
|
|
43
|
+
referrerScanCapped(operation: OperationDefinition, context: ResolverContext): Promise<boolean>;
|
|
20
44
|
/**
|
|
21
45
|
* ๊ทธ๋ฆฌ๋๊ฐ ๋ณด๋ธ ๋ณ๊ฒฝ์ ํ ๋ฒ์ ์ ์ฉํ๋ค.
|
|
22
46
|
*
|
|
@@ -8,6 +8,9 @@ const master_crud_1 = require("../master-crud");
|
|
|
8
8
|
const master_axis_1 = require("../master-axis");
|
|
9
9
|
const master_list_1 = require("../master-list");
|
|
10
10
|
const operation_definition_1 = require("./operation-definition");
|
|
11
|
+
const recipe_definition_1 = require("../recipe/recipe-definition");
|
|
12
|
+
const route_definition_1 = require("../recipe/route-definition");
|
|
13
|
+
const referrers_1 = require("../resource/referrers");
|
|
11
14
|
/**
|
|
12
15
|
* ๊ณต์ ์ถ์ ์ฑ์ฐ๊ณ ๊ณ ์น๋ค.
|
|
13
16
|
*
|
|
@@ -32,12 +35,92 @@ tslib_1.__decorate([
|
|
|
32
35
|
exports.OperationDefinitionList = OperationDefinitionList = tslib_1.__decorate([
|
|
33
36
|
(0, type_graphql_1.ObjectType)({ description: 'A page of operation definitions' })
|
|
34
37
|
], OperationDefinitionList);
|
|
38
|
+
/**
|
|
39
|
+
* **์ด ๊ณต์ ์ ๋๊ฐ ์ฐ๋** โ ๋ค์ด์ค๋ ๊ด๊ณ.
|
|
40
|
+
*
|
|
41
|
+
* โโ ์ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
42
|
+
* ๊ณต์ ํ๋๋ฅผ ๊ณ ์น๊ฑฐ๋ ์์จ ๋ ๋ฌด์์ด ๋ธ๋ ค ๋ฌด๋์ง๋์ง ์ ์ ์์๋ค. ๋ผ์ฐํ
๊ณผ ์ ์กฐ๋ฒ์ ํ๋์ฉ ์ด์ด
|
|
43
|
+
* ๋จ๊ณ ๋ชฉ๋ก์ ๋์ผ๋ก ํ๋ ์๋ฐ์ ์์๋ค. ์ง๊ธ miratek ์ ๋ผ์ฐํ
๋ค์ฏ์ ์ ์กฐ๋ฒ ๋ค์ฏ์ด๋ผ ๊ทธ๊ฒ์ด
|
|
44
|
+
* ๋์ง๋ง, ์ ํ์ด ๋๋ฉด ์ ๋๋ค.
|
|
45
|
+
*
|
|
46
|
+
* โโ ๋ฐฐ์ด ์นธ์ด๋ผ ํ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
47
|
+
* `RouteDefinition.steps` ์ `RecipeDefinition.inputs[].operation` ์ `simple-json` ์ด๋ค.
|
|
48
|
+
* ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ทธ ์์ ๋ชป ๋ณด๋ฏ๋ก `IN` ์ผ๋ก ๋ชป ์ขํ๋ค. ํ๋ฅผ ํ์ด ๋ค์ง๋ ์๋ฐ์ ์๋ค.
|
|
49
|
+
*
|
|
50
|
+
* **๊ทธ๋์ ์ํ์ด ์๊ณ , ์ํ์ ๊ฑธ๋ฆฌ๋ฉด ๋งํ๋ค**(`referrerScanCapped`). ์กฐ์ฉํ ์๋ฅด๋ฉด ใ์ด ๊ณต์ ์
|
|
51
|
+
* ์๋ฌด๋ ์ ์ด๋คใ์ ใ๋๋ฌด ๋ง์ ๋ค ๋ชป ๋ดค๋คใ๊ฐ ๊ฐ์ ๋ณด์ธ๋ค. ์์ฃ๊ฒ์ ์ง์๋ ๋๋ ๊ณต์ ์ด๊ณ
|
|
52
|
+
* ๋ค์ฃ๊ฒ์ ์ง์ฐ๋ฉด ๋ผ์ธ์ด ์ ๋ค. ํ๋ชฉ์ ์ ์กฐ๋ฒ ํ๊ธฐ๊ฐ ๊ฐ์ ์๋ฆฌ์ ๊ฐ์ ๊ฒ์ ๋๋ค.
|
|
53
|
+
*/
|
|
54
|
+
const OPERATION_SCAN_LIMIT = 2000;
|
|
55
|
+
async function scanOperationUse(domain) {
|
|
56
|
+
const routeRepo = (0, shell_1.getRepository)(route_definition_1.RouteDefinition);
|
|
57
|
+
const recipeRepo = (0, shell_1.getRepository)(recipe_definition_1.RecipeDefinition);
|
|
58
|
+
const [routeTotal, recipeTotal] = await Promise.all([
|
|
59
|
+
routeRepo.count({ where: { domain: { id: domain.id } } }),
|
|
60
|
+
recipeRepo.count({ where: { domain: { id: domain.id } } })
|
|
61
|
+
]);
|
|
62
|
+
const [routeRows, recipeRows] = await Promise.all([
|
|
63
|
+
/*
|
|
64
|
+
* `id` ๋ฅผ ํจ๊ป ๋ฝ๋๋ค. ๋นผ๋ฉด TypeORM ์ด ใno such column: distinctAlias.โฆ_idใ๋ก ํฐ์ง๋ค โ
|
|
65
|
+
* `take` ๋ฅผ ์ฐ๋ฉด ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ๊ธฐ๋ณธ ํค๋ก ํ ๋ฒ ๋ ๊ฐ์ธ๋๋ฐ, ๊ทธ ํค๋ฅผ ์ ๋ฝ์ผ๋ฉด ๊ฐ์ ๊ฒ์ด ์๋ค.
|
|
66
|
+
*/
|
|
67
|
+
routeRepo.find({
|
|
68
|
+
where: { domain: { id: domain.id } },
|
|
69
|
+
select: ['id', 'name', 'steps'],
|
|
70
|
+
take: OPERATION_SCAN_LIMIT
|
|
71
|
+
}),
|
|
72
|
+
recipeRepo.find({
|
|
73
|
+
where: { domain: { id: domain.id } },
|
|
74
|
+
select: ['id', 'name', 'inputs'],
|
|
75
|
+
take: OPERATION_SCAN_LIMIT
|
|
76
|
+
})
|
|
77
|
+
]);
|
|
78
|
+
const routes = (0, referrers_1.indexMultiReferrers)(routeRows, one => one.steps ?? [], one => one.name);
|
|
79
|
+
const recipes = (0, referrers_1.indexMultiReferrers)(recipeRows, one => (one.inputs ?? []).map((part) => part?.operation), one => one.name);
|
|
80
|
+
return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length };
|
|
81
|
+
}
|
|
82
|
+
/** ์์ฒญ ์์์ ํ ๋ฒ๋ง ํ๋๋ค. **์ฝ์์ ๋ด๋๋ค** โ ์ค๋ค์ด ๊ฑฐ์ ๋์์ ๋ฌป๋๋ค. */
|
|
83
|
+
function operationUseOf(context) {
|
|
84
|
+
const state = context.state;
|
|
85
|
+
state.operationUse = state.operationUse || scanOperationUse(state.domain);
|
|
86
|
+
return state.operationUse;
|
|
87
|
+
}
|
|
35
88
|
let OperationDefinitionResolver = class OperationDefinitionResolver {
|
|
36
89
|
async operationDefinitions(params, context) {
|
|
37
90
|
const { domain } = context.state;
|
|
38
91
|
const { items, total } = await (0, master_list_1.listMaster)('operationDefinition', params, domain);
|
|
39
92
|
return { items: items, total };
|
|
40
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* ์ด ๊ณต์ ์ ๋จ๊ณ๋ก ๊ฐ๋ **๋ผ์ฐํ
๋ค.**
|
|
96
|
+
*
|
|
97
|
+
* ๊ณต์ ์ ๊ณ ์น๊ธฐ ์ ์ ๋ฌด์์ด ๋ธ๋ ค ์ค๋์ง ์ฌ๊ธฐ์ ๋ณธ๋ค. ์ฌ๋ฟ์ผ ์ ์๋ค โ ๊ฐ์ ๊ณต์ ์ ์ฌ๋ฌ ๋ผ์ฐํ
์ด
|
|
98
|
+
* ์ง๋๋ค(์ ๋จ์ ํ์ค์๋ ๋น ๋ฅธ ๊ฒ์๋ ์๋ค).
|
|
99
|
+
*
|
|
100
|
+
* ์๋ฌด๋ ์ ์ฐ๋ฉด ๋น ๋ชฉ๋ก์ด๋ค. ๋ค๋ง ๊ทธ๊ฒ์ด ใ์ ์ด๋คใ์ธ์ง ใ๋ค ๋ชป ๋ดค๋คใ์ธ์ง๋
|
|
101
|
+
* `referrerScanCapped` ๊ฐ ๋งํ๋ค.
|
|
102
|
+
*/
|
|
103
|
+
async usedInRoutes(operation, context) {
|
|
104
|
+
return (await operationUseOf(context)).routes.get(operation.name) ?? [];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* ์ด ๊ณต์ ์์ ์์ฌ๋ฅผ ๋ฃ๋ **์ ์กฐ๋ฒ๋ค.**
|
|
108
|
+
*
|
|
109
|
+
* ๋ผ์ฐํ
์ ใ์ด๋๋ฅผ ์ง๋๋ใ์ด๊ณ ์ด๊ฒ์ ใ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ๋น ์ง๋ใ๋ค. ๊ณต์ ์ ์์ ๋ฉด ๊ทธ ์์ฌ๊ฐ
|
|
110
|
+
* ๋น ์ง ์๋ฆฌ๋ฅผ ์๋๋ค.
|
|
111
|
+
*/
|
|
112
|
+
async consumedAt(operation, context) {
|
|
113
|
+
return (await operationUseOf(context)).recipes.get(operation.name) ?? [];
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* ๋ผ์ฐํ
ยท์ ์กฐ๋ฒ์ ๋ค ๋ณด์ง ๋ชปํ๋.
|
|
117
|
+
*
|
|
118
|
+
* **์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.** ์ํ์ ๊ฑธ๋ฆฌ๋ฉด ์์ ๋ ์นธ์ด ๋ ์ฐฌ ๋ต์ด๊ณ , ๊ทธ๊ฒ์ ๋งํ์ง ์์ผ๋ฉด
|
|
119
|
+
* ใ์ฐ๋ ๋ฐ๊ฐ ์๋คใ์ ใ๋ชป ๋ดค๋คใ๊ฐ ๊ฐ์ ๋ณด์ธ๋ค.
|
|
120
|
+
*/
|
|
121
|
+
async referrerScanCapped(operation, context) {
|
|
122
|
+
return (await operationUseOf(context)).capped;
|
|
123
|
+
}
|
|
41
124
|
/**
|
|
42
125
|
* ๊ทธ๋ฆฌ๋๊ฐ ๋ณด๋ธ ๋ณ๊ฒฝ์ ํ ๋ฒ์ ์ ์ฉํ๋ค.
|
|
43
126
|
*
|
|
@@ -64,6 +147,30 @@ tslib_1.__decorate([
|
|
|
64
147
|
tslib_1.__metadata("design:paramtypes", [shell_1.ListParam, Object]),
|
|
65
148
|
tslib_1.__metadata("design:returntype", Promise)
|
|
66
149
|
], OperationDefinitionResolver.prototype, "operationDefinitions", null);
|
|
150
|
+
tslib_1.__decorate([
|
|
151
|
+
(0, type_graphql_1.FieldResolver)(type => [String], { description: 'Routes that include this operation as a step' }),
|
|
152
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
153
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
154
|
+
tslib_1.__metadata("design:type", Function),
|
|
155
|
+
tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
|
|
156
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
157
|
+
], OperationDefinitionResolver.prototype, "usedInRoutes", null);
|
|
158
|
+
tslib_1.__decorate([
|
|
159
|
+
(0, type_graphql_1.FieldResolver)(type => [String], { description: 'Recipes that consume materials at this operation' }),
|
|
160
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
161
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
162
|
+
tslib_1.__metadata("design:type", Function),
|
|
163
|
+
tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
|
|
164
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
165
|
+
], OperationDefinitionResolver.prototype, "consumedAt", null);
|
|
166
|
+
tslib_1.__decorate([
|
|
167
|
+
(0, type_graphql_1.FieldResolver)(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' }),
|
|
168
|
+
tslib_1.__param(0, (0, type_graphql_1.Root)()),
|
|
169
|
+
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
170
|
+
tslib_1.__metadata("design:type", Function),
|
|
171
|
+
tslib_1.__metadata("design:paramtypes", [operation_definition_1.OperationDefinition, Object]),
|
|
172
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
173
|
+
], OperationDefinitionResolver.prototype, "referrerScanCapped", null);
|
|
67
174
|
tslib_1.__decorate([
|
|
68
175
|
(0, type_graphql_1.Directive)('@privilege(category: "ops-master", privilege: "mutation", domainOwnerGranted: true)'),
|
|
69
176
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":";;;;AAAA,+CAA2G;AAE3G,iDAA+D;AAE/D,gDAA+D;AAC/D,gDAA6C;AAC7C,gDAA2C;AAC3C,iEAA4D;AAE5D;;;;;;;;;GASG;AAGI,IAAM,uBAAuB,GAA7B,MAAM,uBAAuB;CAMnC,CAAA;AANY,0DAAuB;AAElC;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,CAAC;;sDACT;AAG5B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;sDACN;kCALF,uBAAuB;IADnC,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;GAClD,uBAAuB,CAMnC;AAGM,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGhC,AAAN,KAAK,CAAC,oBAAoB,CAA0B,MAAiB,EAAS,OAAwB;QACpG,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,wBAAU,EAAC,qBAAqB,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAEhF,OAAO,EAAE,KAAK,EAAE,KAA8B,EAAE,KAAK,EAAE,CAAA;IACzD,CAAC;IAED;;;;;;OAMG;IAIG,AAAN,KAAK,CAAC,iCAAiC,CACG,OAAsB,EACvD,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,IAAI,GAAG,IAAA,0BAAY,EAAC,qBAAqB,CAAC,CAAA;QAEhD,MAAM,KAAK,GAAG,MAAM,IAAA,+BAAiB,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC5E,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;SAC5C,CAAC,CAAA;QAEF,OAAO,KAA8B,CAAA;IACvC,CAAC;CACF,CAAA;AAjCY,kEAA2B;AAGhC;IAFL,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,uBAAuB,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;IACjE,mBAAA,IAAA,mBAAI,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAS,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,iBAAS;;uEAKpE;AAYK;IAHL,IAAA,wBAAS,EAAC,qFAAqF,CAAC;IAChG,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,0CAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;IAE9G,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAY,CAAC,CAAC,CAAA;IACtC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;oFAUP;sCAhCU,2BAA2B;IADvC,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,2BAA2B,CAiCvC","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 { OperationDefinition } from './operation-definition'\n\n/**\n * ๊ณต์ ์ถ์ ์ฑ์ฐ๊ณ ๊ณ ์น๋ค.\n *\n * โโ ์ ๋ง์คํฐ๋ ๊ทธ๋ฆฌ๋์์ ๊ณ ์น ์ ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์
๋ฌด ๊ธฐ๋ก๊ณผ ๋ฌ๋ฆฌ ๋ง์คํฐ๋ **์ ์ธ**์ด๋ค. ใ์ด ์ฌ๋์ด ์ฉ์ ์๊ฒฉ์ ๊ฐ๋๋คใ๋ ์ผ์ด๋ ์ผ์ด ์๋๋ผ ์ง๊ธ์\n * ๊ท์ ์ด๊ณ , ๊ท์ ์ ๋ฐ๋๋ค. ์์จ ๋ ํ์ ์ง์ฐ์ง ์๊ณ ์ ํจ ๊ธฐ๊ฐ์ ๋์ ์ฑ์ฐ๋ ๊ฒ์ด ๊ทธ๋์๋ค โ\n * ์ง์ฐ๋ฉด ๊ทธ๊ฒ์ ๊ฐ๋ฆฌํค๋ ์ง๋ ๊ธฐ๋ก์ด ๊ฐ๋ฆฌํฌ ๊ฒ์ ์๋๋ค.\n *\n * ๊ท์น์ `master-crud.ts` ํ ๊ณณ์ ์๋ค. ์ฌ๊ธฐ๋ ์ถ์ ์ด๋ฆ๋ง ๋ถ์ธ๋ค.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n@Resolver(OperationDefinition)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * ๊ทธ๋ฆฌ๋๊ฐ ๋ณด๋ธ ๋ณ๊ฒฝ์ ํ ๋ฒ์ ์ ์ฉํ๋ค.\n *\n * ํจ์น๋ฅผ `ScalarObject` ๋ก ๋ฐ๋๋ค โ ์ถ๋ง๋ค ์
๋ ฅ ํ์
์ ๋ฐ๋ก ๋ง๋ค๋ฉด ์นธ์ ํ๋ ๋ํ ๋๋ง๋ค ๋ ๊ณณ์\n * ๊ณ ์ณ์ผ ํ๊ณ , ํ์ชฝ์ ๋น ๋จ๋ฆฌ๋ฉด ๊ทธ ์นธ์ด ์ค๋ฅ ๋ณด๊ณ ์์ด ์ ์ฅ๋์ง ์๋๋ค. ๋๋ ค์ฃผ๋ ๊ฒ์ ํ์
์ด ์๋\n * ์ํฐํฐ๋ผ ๋ฌด์์ด ์ ์ฅ๋๋์ง ์คํค๋ง๋ก ํ์ธํ ์ ์๋ค.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"operation-master-resolver.js","sourceRoot":"","sources":["../../../server/service/operation/operation-master-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import { Args, Arg, Ctx, Directive, FieldResolver, Int, Mutation, ObjectType, Field, Query, Resolver, Root } from 'type-graphql'\n\nimport { Domain, ListParam, ScalarObject, getRepository } from '@things-factory/shell'\n\nimport { MasterPatch, saveMasterPatches } from '../master-crud'\nimport { masterAxisOf } from '../master-axis'\nimport { listMaster } from '../master-list'\nimport { OperationDefinition } from './operation-definition'\nimport { RecipeDefinition } from '../recipe/recipe-definition'\nimport { RouteDefinition } from '../recipe/route-definition'\nimport { indexMultiReferrers } from '../resource/referrers'\n\n/**\n * ๊ณต์ ์ถ์ ์ฑ์ฐ๊ณ ๊ณ ์น๋ค.\n *\n * โโ ์ ๋ง์คํฐ๋ ๊ทธ๋ฆฌ๋์์ ๊ณ ์น ์ ์๋ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ์
๋ฌด ๊ธฐ๋ก๊ณผ ๋ฌ๋ฆฌ ๋ง์คํฐ๋ **์ ์ธ**์ด๋ค. ใ์ด ์ฌ๋์ด ์ฉ์ ์๊ฒฉ์ ๊ฐ๋๋คใ๋ ์ผ์ด๋ ์ผ์ด ์๋๋ผ ์ง๊ธ์\n * ๊ท์ ์ด๊ณ , ๊ท์ ์ ๋ฐ๋๋ค. ์์จ ๋ ํ์ ์ง์ฐ์ง ์๊ณ ์ ํจ ๊ธฐ๊ฐ์ ๋์ ์ฑ์ฐ๋ ๊ฒ์ด ๊ทธ๋์๋ค โ\n * ์ง์ฐ๋ฉด ๊ทธ๊ฒ์ ๊ฐ๋ฆฌํค๋ ์ง๋ ๊ธฐ๋ก์ด ๊ฐ๋ฆฌํฌ ๊ฒ์ ์๋๋ค.\n *\n * ๊ท์น์ `master-crud.ts` ํ ๊ณณ์ ์๋ค. ์ฌ๊ธฐ๋ ์ถ์ ์ด๋ฆ๋ง ๋ถ์ธ๋ค.\n */\n\n@ObjectType({ description: 'A page of operation definitions' })\nexport class OperationDefinitionList {\n @Field(type => [OperationDefinition])\n items: OperationDefinition[]\n\n @Field(type => Int)\n total: number\n}\n\n/**\n * **์ด ๊ณต์ ์ ๋๊ฐ ์ฐ๋** โ ๋ค์ด์ค๋ ๊ด๊ณ.\n *\n * โโ ์ ํ์ํ๊ฐ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * ๊ณต์ ํ๋๋ฅผ ๊ณ ์น๊ฑฐ๋ ์์จ ๋ ๋ฌด์์ด ๋ธ๋ ค ๋ฌด๋์ง๋์ง ์ ์ ์์๋ค. ๋ผ์ฐํ
๊ณผ ์ ์กฐ๋ฒ์ ํ๋์ฉ ์ด์ด\n * ๋จ๊ณ ๋ชฉ๋ก์ ๋์ผ๋ก ํ๋ ์๋ฐ์ ์์๋ค. ์ง๊ธ miratek ์ ๋ผ์ฐํ
๋ค์ฏ์ ์ ์กฐ๋ฒ ๋ค์ฏ์ด๋ผ ๊ทธ๊ฒ์ด\n * ๋์ง๋ง, ์ ํ์ด ๋๋ฉด ์ ๋๋ค.\n *\n * โโ ๋ฐฐ์ด ์นธ์ด๋ผ ํ๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ\n * `RouteDefinition.steps` ์ `RecipeDefinition.inputs[].operation` ์ `simple-json` ์ด๋ค.\n * ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ทธ ์์ ๋ชป ๋ณด๋ฏ๋ก `IN` ์ผ๋ก ๋ชป ์ขํ๋ค. ํ๋ฅผ ํ์ด ๋ค์ง๋ ์๋ฐ์ ์๋ค.\n *\n * **๊ทธ๋์ ์ํ์ด ์๊ณ , ์ํ์ ๊ฑธ๋ฆฌ๋ฉด ๋งํ๋ค**(`referrerScanCapped`). ์กฐ์ฉํ ์๋ฅด๋ฉด ใ์ด ๊ณต์ ์\n * ์๋ฌด๋ ์ ์ด๋คใ์ ใ๋๋ฌด ๋ง์ ๋ค ๋ชป ๋ดค๋คใ๊ฐ ๊ฐ์ ๋ณด์ธ๋ค. ์์ฃ๊ฒ์ ์ง์๋ ๋๋ ๊ณต์ ์ด๊ณ \n * ๋ค์ฃ๊ฒ์ ์ง์ฐ๋ฉด ๋ผ์ธ์ด ์ ๋ค. ํ๋ชฉ์ ์ ์กฐ๋ฒ ํ๊ธฐ๊ฐ ๊ฐ์ ์๋ฆฌ์ ๊ฐ์ ๊ฒ์ ๋๋ค.\n */\nconst OPERATION_SCAN_LIMIT = 2000\n\ninterface OperationUse {\n /** ์ด ๊ณต์ ์ ๋จ๊ณ๋ก ๊ฐ๋ ๋ผ์ฐํ
๋ค. */\n routes: Map<string, string[]>\n /** ์ด ๊ณต์ ์์ ์์ฌ๋ฅผ ๋ฃ๋ ์ ์กฐ๋ฒ๋ค. */\n recipes: Map<string, string[]>\n /** ์ํ์ ๊ฑธ๋ ค ๋ค ๋ณด์ง ๋ชปํ๋. */\n capped: boolean\n}\n\nasync function scanOperationUse(domain: Domain): Promise<OperationUse> {\n const routeRepo = getRepository(RouteDefinition)\n const recipeRepo = getRepository(RecipeDefinition)\n\n const [routeTotal, recipeTotal] = await Promise.all([\n routeRepo.count({ where: { domain: { id: domain.id } } as any }),\n recipeRepo.count({ where: { domain: { id: domain.id } } as any })\n ])\n\n const [routeRows, recipeRows] = await Promise.all([\n /*\n * `id` ๋ฅผ ํจ๊ป ๋ฝ๋๋ค. ๋นผ๋ฉด TypeORM ์ด ใno such column: distinctAlias.โฆ_idใ๋ก ํฐ์ง๋ค โ\n * `take` ๋ฅผ ์ฐ๋ฉด ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ํด ๊ธฐ๋ณธ ํค๋ก ํ ๋ฒ ๋ ๊ฐ์ธ๋๋ฐ, ๊ทธ ํค๋ฅผ ์ ๋ฝ์ผ๋ฉด ๊ฐ์ ๊ฒ์ด ์๋ค.\n */\n routeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'steps'] as any,\n take: OPERATION_SCAN_LIMIT\n }),\n recipeRepo.find({\n where: { domain: { id: domain.id } } as any,\n select: ['id', 'name', 'inputs'] as any,\n take: OPERATION_SCAN_LIMIT\n })\n ])\n\n const routes = indexMultiReferrers(\n routeRows as any[],\n one => one.steps ?? [],\n one => one.name\n )\n\n const recipes = indexMultiReferrers(\n recipeRows as any[],\n one => (one.inputs ?? []).map((part: any) => part?.operation),\n one => one.name\n )\n\n return { routes, recipes, capped: routeTotal > routeRows.length || recipeTotal > recipeRows.length }\n}\n\n/** ์์ฒญ ์์์ ํ ๋ฒ๋ง ํ๋๋ค. **์ฝ์์ ๋ด๋๋ค** โ ์ค๋ค์ด ๊ฑฐ์ ๋์์ ๋ฌป๋๋ค. */\nfunction operationUseOf(context: ResolverContext): Promise<OperationUse> {\n const state = context.state as { domain: Domain; operationUse?: Promise<OperationUse> }\n\n state.operationUse = state.operationUse || scanOperationUse(state.domain)\n\n return state.operationUse\n}\n\n@Resolver(OperationDefinition)\nexport class OperationDefinitionResolver {\n @Directive('@privilege(category: \"ops-master\", privilege: \"query\", domainOwnerGranted: true)')\n @Query(returns => OperationDefinitionList, { description: 'To fetch operation definitions' })\n async operationDefinitions(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<OperationDefinitionList> {\n const { domain } = context.state\n const { items, total } = await listMaster('operationDefinition', params, domain)\n\n return { items: items as OperationDefinition[], total }\n }\n\n /**\n * ์ด ๊ณต์ ์ ๋จ๊ณ๋ก ๊ฐ๋ **๋ผ์ฐํ
๋ค.**\n *\n * ๊ณต์ ์ ๊ณ ์น๊ธฐ ์ ์ ๋ฌด์์ด ๋ธ๋ ค ์ค๋์ง ์ฌ๊ธฐ์ ๋ณธ๋ค. ์ฌ๋ฟ์ผ ์ ์๋ค โ ๊ฐ์ ๊ณต์ ์ ์ฌ๋ฌ ๋ผ์ฐํ
์ด\n * ์ง๋๋ค(์ ๋จ์ ํ์ค์๋ ๋น ๋ฅธ ๊ฒ์๋ ์๋ค).\n *\n * ์๋ฌด๋ ์ ์ฐ๋ฉด ๋น ๋ชฉ๋ก์ด๋ค. ๋ค๋ง ๊ทธ๊ฒ์ด ใ์ ์ด๋คใ์ธ์ง ใ๋ค ๋ชป ๋ดค๋คใ์ธ์ง๋\n * `referrerScanCapped` ๊ฐ ๋งํ๋ค.\n */\n @FieldResolver(type => [String], { description: 'Routes that include this operation as a step' })\n async usedInRoutes(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).routes.get(operation.name) ?? []\n }\n\n /**\n * ์ด ๊ณต์ ์์ ์์ฌ๋ฅผ ๋ฃ๋ **์ ์กฐ๋ฒ๋ค.**\n *\n * ๋ผ์ฐํ
์ ใ์ด๋๋ฅผ ์ง๋๋ใ์ด๊ณ ์ด๊ฒ์ ใ๊ฑฐ๊ธฐ์ ๋ฌด์์ด ๋น ์ง๋ใ๋ค. ๊ณต์ ์ ์์ ๋ฉด ๊ทธ ์์ฌ๊ฐ\n * ๋น ์ง ์๋ฆฌ๋ฅผ ์๋๋ค.\n */\n @FieldResolver(type => [String], { description: 'Recipes that consume materials at this operation' })\n async consumedAt(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<string[]> {\n return (await operationUseOf(context)).recipes.get(operation.name) ?? []\n }\n\n /**\n * ๋ผ์ฐํ
ยท์ ์กฐ๋ฒ์ ๋ค ๋ณด์ง ๋ชปํ๋.\n *\n * **์กฐ์ฉํ ์๋ฅด์ง ์๋๋ค.** ์ํ์ ๊ฑธ๋ฆฌ๋ฉด ์์ ๋ ์นธ์ด ๋ ์ฐฌ ๋ต์ด๊ณ , ๊ทธ๊ฒ์ ๋งํ์ง ์์ผ๋ฉด\n * ใ์ฐ๋ ๋ฐ๊ฐ ์๋คใ์ ใ๋ชป ๋ดค๋คใ๊ฐ ๊ฐ์ ๋ณด์ธ๋ค.\n */\n @FieldResolver(type => Boolean, { description: 'True when routes or recipes were too many to scan fully' })\n async referrerScanCapped(@Root() operation: OperationDefinition, @Ctx() context: ResolverContext): Promise<boolean> {\n return (await operationUseOf(context)).capped\n }\n\n /**\n * ๊ทธ๋ฆฌ๋๊ฐ ๋ณด๋ธ ๋ณ๊ฒฝ์ ํ ๋ฒ์ ์ ์ฉํ๋ค.\n *\n * ํจ์น๋ฅผ `ScalarObject` ๋ก ๋ฐ๋๋ค โ ์ถ๋ง๋ค ์
๋ ฅ ํ์
์ ๋ฐ๋ก ๋ง๋ค๋ฉด ์นธ์ ํ๋ ๋ํ ๋๋ง๋ค ๋ ๊ณณ์\n * ๊ณ ์ณ์ผ ํ๊ณ , ํ์ชฝ์ ๋น ๋จ๋ฆฌ๋ฉด ๊ทธ ์นธ์ด ์ค๋ฅ ๋ณด๊ณ ์์ด ์ ์ฅ๋์ง ์๋๋ค. ๋๋ ค์ฃผ๋ ๊ฒ์ ํ์
์ด ์๋\n * ์ํฐํฐ๋ผ ๋ฌด์์ด ์ ์ฅ๋๋์ง ์คํค๋ง๋ก ํ์ธํ ์ ์๋ค.\n */\n @Directive('@privilege(category: \"ops-master\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Directive('@transaction')\n @Mutation(returns => [OperationDefinition], { description: 'To create, change or retire operation definitions' })\n async updateMultipleOperationDefinition(\n @Arg('patches', type => [ScalarObject]) patches: MasterPatch[],\n @Ctx() context: ResolverContext\n ): Promise<OperationDefinition[]> {\n const { domain, user, tx } = context.state\n const axis = masterAxisOf('operationDefinition')\n\n const saved = await saveMasterPatches(tx, domain, axis.entity, patches, user, {\n hasEffectivePeriod: axis.hasEffectivePeriod\n })\n\n return saved as OperationDefinition[]\n }\n}\n"]}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
export declare class OperationMaster {
|
|
2
2
|
operations: string;
|
|
3
|
+
/**
|
|
4
|
+
* ๋ ์๋ โ **์ด ๊ฐ์ ์ ๋ณด๊ณ ์ฐ๋ฉด ์กฐ์ฉํ ์๋ฆฐ ๋ง์คํฐ๋ก ํธ์์ ์ธ์ฐ๊ฒ ๋๋ค.**
|
|
5
|
+
*
|
|
6
|
+
* ๊ฑฐ์ง์ด ๋ ๋๊น์ง `next` ๋ฅผ `after` ๋ก ๋๊ฒจ ์ด์ด ๋ฐ๋๋ค.
|
|
7
|
+
*/
|
|
8
|
+
hasMore: boolean;
|
|
9
|
+
/** ์ด์ด ๋ฐ์ ์๋ฆฌ. ๋ ์์ผ๋ฉด ์๋ค. */
|
|
10
|
+
next?: string;
|
|
3
11
|
}
|
|
4
12
|
export declare class OperationQuery {
|
|
5
|
-
/** ๊ณต์ ์ ์ ์ ์ฒด โ
|
|
6
|
-
operationMaster(context: ResolverContext): Promise<OperationMaster>;
|
|
13
|
+
/** ๊ณต์ ์ ์ ์ ์ฒด โ ๋ผ์ฐํ
์ ๋จ๊ณ๊ฐ ์ด ํค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. */
|
|
14
|
+
operationMaster(after: string | undefined, limit: number | undefined, context: ResolverContext): Promise<OperationMaster>;
|
|
7
15
|
}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OperationQuery = exports.OperationMaster = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
|
-
const
|
|
6
|
+
const master_page_query_1 = require("../master-page-query");
|
|
7
7
|
const operation_definition_1 = require("./operation-definition");
|
|
8
8
|
const operation_master_1 = require("./operation-master");
|
|
9
9
|
let OperationMaster = class OperationMaster {
|
|
@@ -13,26 +13,41 @@ tslib_1.__decorate([
|
|
|
13
13
|
(0, type_graphql_1.Field)(type => String, { description: 'OperationDef[] as JSON text' }),
|
|
14
14
|
tslib_1.__metadata("design:type", String)
|
|
15
15
|
], OperationMaster.prototype, "operations", void 0);
|
|
16
|
+
tslib_1.__decorate([
|
|
17
|
+
(0, type_graphql_1.Field)({ description: 'true when more rows remain โ keep pulling with next as after' }),
|
|
18
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
19
|
+
], OperationMaster.prototype, "hasMore", void 0);
|
|
20
|
+
tslib_1.__decorate([
|
|
21
|
+
(0, type_graphql_1.Field)(type => String, { nullable: true, description: 'cursor for the next page โ the last name in this page' }),
|
|
22
|
+
tslib_1.__metadata("design:type", String)
|
|
23
|
+
], OperationMaster.prototype, "next", void 0);
|
|
16
24
|
exports.OperationMaster = OperationMaster = tslib_1.__decorate([
|
|
17
25
|
(0, type_graphql_1.ObjectType)({ description: 'Operation definitions as the twin receives them' })
|
|
18
26
|
], OperationMaster);
|
|
19
27
|
let OperationQuery = class OperationQuery {
|
|
20
|
-
/** ๊ณต์ ์ ์ ์ ์ฒด โ
|
|
21
|
-
async operationMaster(context) {
|
|
28
|
+
/** ๊ณต์ ์ ์ ์ ์ฒด โ ๋ผ์ฐํ
์ ๋จ๊ณ๊ฐ ์ด ํค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. */
|
|
29
|
+
async operationMaster(after, limit, context) {
|
|
22
30
|
const { domain } = context.state;
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
31
|
+
const request = { after, limit };
|
|
32
|
+
const page = await (0, master_page_query_1.pullPage)(operation_definition_1.OperationDefinition, domain, request);
|
|
33
|
+
/* ํต์งธ๋ก ๋ฌ๋ผ๊ณ ํ๋๋ฐ ํ๋๋ฅผ ๋์ผ๋ฉด **์๋ฅด์ง ์๊ณ ๊ฑฐ์ ํ๋ค**(ยง`master-page`). */
|
|
34
|
+
(0, master_page_query_1.refuseIfTooLarge)('๊ณต์ ', request, page);
|
|
35
|
+
const operations = page.rows;
|
|
36
|
+
return {
|
|
37
|
+
operations: JSON.stringify((0, operation_master_1.operationMaster)(operations).operations),
|
|
38
|
+
hasMore: page.hasMore,
|
|
39
|
+
...(page.next ? { next: page.next } : {})
|
|
40
|
+
};
|
|
28
41
|
}
|
|
29
42
|
};
|
|
30
43
|
exports.OperationQuery = OperationQuery;
|
|
31
44
|
tslib_1.__decorate([
|
|
32
45
|
(0, type_graphql_1.Query)(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' }),
|
|
33
|
-
tslib_1.__param(0, (0, type_graphql_1.
|
|
46
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('after', { nullable: true, description: 'resume after this name โ the previous page\'s next' })),
|
|
47
|
+
tslib_1.__param(1, (0, type_graphql_1.Arg)('limit', type => type_graphql_1.Int, { nullable: true, description: 'rows per page โ omit only when the axis is small enough to pull whole' })),
|
|
48
|
+
tslib_1.__param(2, (0, type_graphql_1.Ctx)()),
|
|
34
49
|
tslib_1.__metadata("design:type", Function),
|
|
35
|
-
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
50
|
+
tslib_1.__metadata("design:paramtypes", [String, Number, Object]),
|
|
36
51
|
tslib_1.__metadata("design:returntype", Promise)
|
|
37
52
|
], OperationQuery.prototype, "operationMaster", null);
|
|
38
53
|
exports.OperationQuery = OperationQuery = tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-query.js","sourceRoot":"","sources":["../../../server/service/operation/operation-query.ts"],"names":[],"mappings":";;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"operation-query.js","sourceRoot":"","sources":["../../../server/service/operation/operation-query.ts"],"names":[],"mappings":";;;;AAAA,+CAAgF;AAIhF,4DAAiE;AAEjE,iEAA4D;AAC5D,yDAA4E;AAGrE,IAAM,eAAe,GAArB,MAAM,eAAe;CAgB3B,CAAA;AAhBY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC;;mDACpD;AAQlB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;gDACvE;AAIhB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;;6CACnG;0BAdF,eAAe;IAD3B,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;GAClE,eAAe,CAgB3B;AAGM,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,qCAAqC;IAE/B,AAAN,KAAK,CAAC,eAAe,CACkF,KAAyB,EACO,KAAyB,EACvJ,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEhC,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAQ,EAAsB,0CAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;QAEtF,0DAA0D;QAC1D,IAAA,oCAAgB,EAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAA;QAE5B,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAA,kCAAoB,EAAC,UAAU,CAAC,CAAC,UAAU,CAAC;YACvE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC;CACF,CAAA;AAxBY,wCAAc;AAGnB;IADL,IAAA,oBAAK,EAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAE9F,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC,CAAA;IACnG,mBAAA,IAAA,kBAAG,EAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,kBAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uEAAuE,EAAE,CAAC,CAAA;IACnI,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;qDAiBP;yBAvBU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,0CAAmB,CAAC;GACjB,cAAc,CAwB1B","sourcesContent":["import { Arg, Ctx, Field, Int, ObjectType, Query, Resolver } from 'type-graphql'\n\nimport { getRepository } from '@things-factory/shell'\n\nimport { pullPage, refuseIfTooLarge } from '../master-page-query'\n\nimport { OperationDefinition } from './operation-definition'\nimport { operationMaster as buildOperationMaster } from './operation-master'\n\n@ObjectType({ description: 'Operation definitions as the twin receives them' })\nexport class OperationMaster {\n @Field(type => String, { description: 'OperationDef[] as JSON text' })\n operations: string\n\n /**\n * ๋ ์๋ โ **์ด ๊ฐ์ ์ ๋ณด๊ณ ์ฐ๋ฉด ์กฐ์ฉํ ์๋ฆฐ ๋ง์คํฐ๋ก ํธ์์ ์ธ์ฐ๊ฒ ๋๋ค.**\n *\n * ๊ฑฐ์ง์ด ๋ ๋๊น์ง `next` ๋ฅผ `after` ๋ก ๋๊ฒจ ์ด์ด ๋ฐ๋๋ค.\n */\n @Field({ description: 'true when more rows remain โ keep pulling with next as after' })\n hasMore: boolean\n\n /** ์ด์ด ๋ฐ์ ์๋ฆฌ. ๋ ์์ผ๋ฉด ์๋ค. */\n @Field(type => String, { nullable: true, description: 'cursor for the next page โ the last name in this page' })\n next?: string\n\n}\n\n@Resolver(OperationDefinition)\nexport class OperationQuery {\n /** ๊ณต์ ์ ์ ์ ์ฒด โ ๋ผ์ฐํ
์ ๋จ๊ณ๊ฐ ์ด ํค๋ฅผ ๊ฐ๋ฆฌํจ๋ค. */\n @Query(returns => OperationMaster, { description: 'Operation definitions for the twin to pull' })\n async operationMaster(\n @Arg('after', { nullable: true, description: 'resume after this name โ the previous page\\'s next' }) after: string | undefined,\n @Arg('limit', type => Int, { nullable: true, description: 'rows per page โ omit only when the axis is small enough to pull whole' }) limit: number | undefined,\n @Ctx() context: ResolverContext\n ): Promise<OperationMaster> {\n const { domain } = context.state\n\n const request = { after, limit }\n const page = await pullPage<OperationDefinition>(OperationDefinition, domain, request)\n\n /* ํต์งธ๋ก ๋ฌ๋ผ๊ณ ํ๋๋ฐ ํ๋๋ฅผ ๋์ผ๋ฉด **์๋ฅด์ง ์๊ณ ๊ฑฐ์ ํ๋ค**(ยง`master-page`). */\n refuseIfTooLarge('๊ณต์ ', request, page)\n\n const operations = page.rows\n\n return {\n operations: JSON.stringify(buildOperationMaster(operations).operations),\n hasMore: page.hasMore,\n ...(page.next ? { next: page.next } : {})\n }\n }\n}\n"]}
|
|
@@ -53,12 +53,12 @@ tslib_1.__decorate([
|
|
|
53
53
|
], Person.prototype, "homeLocation", void 0);
|
|
54
54
|
tslib_1.__decorate([
|
|
55
55
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
56
|
-
(0, type_graphql_1.Field)(type =>
|
|
56
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'WorkCalendarEntry[]' }),
|
|
57
57
|
tslib_1.__metadata("design:type", Array)
|
|
58
58
|
], Person.prototype, "workCalendar", void 0);
|
|
59
59
|
tslib_1.__decorate([
|
|
60
60
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
61
|
-
(0, type_graphql_1.Field)(type =>
|
|
61
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'ResourceProperty[]' }),
|
|
62
62
|
tslib_1.__metadata("design:type", Array)
|
|
63
63
|
], Person.prototype, "properties", void 0);
|
|
64
64
|
tslib_1.__decorate([
|
|
@@ -68,7 +68,7 @@ tslib_1.__decorate([
|
|
|
68
68
|
], Person.prototype, "testSpecificationIds", void 0);
|
|
69
69
|
tslib_1.__decorate([
|
|
70
70
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
71
|
-
(0, type_graphql_1.Field)(type =>
|
|
71
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'TestResult[]' }),
|
|
72
72
|
tslib_1.__metadata("design:type", Array)
|
|
73
73
|
], Person.prototype, "testResults", void 0);
|
|
74
74
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"person.js","sourceRoot":"","sources":["../../../server/service/personnel/person.ts"],"names":[],"mappings":";;;;AAAA,qCASgB;AAChB,+CAAoD;AAEpD,
|
|
1
|
+
{"version":3,"file":"person.js","sourceRoot":"","sources":["../../../server/service/personnel/person.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, ScalarObject } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\n\n/**\n * ์์
์ โ **ISA-95 `Person`**.\n *\n * ์ฌ๋์ ์ค๋น์ ๋ค๋ฅด๊ฒ ์ฐ๋ค. ๊ณ ์ฅ ๋์ง ์๊ณ ๊ต๋๋ก ์ผํ๋ฉฐ, ์๊ฒฉ์ด ๋ง๋ฃ๋๋ค. ๊ทธ๋์ ์์ ๋ท์ ํ ๊ทธ๋ฆ์\n * ๋ด์ง ์๋๋ค โ ํ์ชฝ์ ์ดํ๊ฐ ๋ค๋ฅธ ์ชฝ์ ๋ถ์ผ๋ฉด ๋ ๋ค ๊ฑฐ์ง์ด ๋๋ค.\n *\n * ํ๋ ์ด๋ฆ์ ์ปค๋ ๊ณ์ฝ์ `persons` ํญ๋ชฉ๊ณผ ๊ฐ๋ค(`@operato/ops-contract`). ์ฎ๊ธธ ๋ ๋ฒ์ญ์ด ์๋ค.\n */\n@Entity({ name: 'ops_person' })\n@Index('ix_ops_person_0', (person: Person) => [person.domain, person.name], { unique: true })\n@ObjectType({ description: 'ISA-95 Person โ a worker who can be assigned to operations' })\nexport class Person {\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((person: Person) => person.domain)\n domainId?: string\n\n /** ํ์ค `PersonID` โ ํธ์์ผ๋ก ๋๊ฐ ๋ `persons[].id` ๊ฐ ๋๋ค. */\n @Column()\n @Field()\n name: string\n\n /** ์ฌ๋์ด ์ฝ๋ ์ด๋ฆ. ํ์ค `PersonName`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n description?: string\n\n /**\n * ์ํ ๋ฑ๊ธ๋ค โ ํ์ค `PersonnelClassID`(๋ณต์).\n *\n * ๋ณต์์ธ ๊ฒ์ด ์ค์ํ๋ค. ํ ์ฌ๋์ด ์ฉ์ ์๊ฒฉ๊ณผ ์ง๊ฒ์ฐจ ์๊ฒฉ์ ํจ๊ป ๊ฐ๋ ์ผ์ด ํํ๊ณ , ํ๋๋ง ๋ด์ผ๋ฉด\n * ๊ทธ ์ฌ๋์ ํ์ชฝ ๊ณต์ ์์ ๋ณด์ด์ง ์๋๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n personnelClassIds?: string[]\n\n /** ์ด ์ฌ๋์ด ์ฃผ๋ก ์๋ ์๋ฆฌ โ ํ์ค `OperationalLocation`. */\n @Column({ nullable: true })\n @Field({ nullable: true })\n homeLocation?: string\n\n /** ๊ทผ๋ฌด ์บ๋ฆฐ๋ โ ํ์ค `WorkCalendar`. ๊ต๋ ์ด๋ฆ๊ณผ ๊ตฌ๊ฐ์ด ์ฌ๊ธฐ ์๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'WorkCalendarEntry[]' })\n workCalendar?: Record<string, unknown>[]\n\n /** ๊ฐ์ฒด ์์ฑ โ ํ์ค `PersonProperty`. `classPropertyId` ๋ก ๋ฑ๊ธ ์์ฑ์ ๊ตฌ์ฒดํํ๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'ResourceProperty[]' })\n properties?: Record<string, unknown>[]\n\n /** ์ด ์ฌ๋์๊ฒ ์๊ตฌ๋๋ `TestSpecification` ์ฐธ์กฐ๋ค โ ํ์ค `TestSpecificationID`. ์ฐธ์กฐ๋ง ๊ฐ๋๋ค. */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => [String], { nullable: true })\n testSpecificationIds?: string[]\n\n /**\n * `TestResult` โ ํ์ค `TestResult`.\n *\n * ๋ฑ๊ธ์ด `TestSpecification` ์ ์๊ตฌํ๋๋ฐ ๊ทธ ์ฌ๋์๊ฒ ๊ฒฐ๊ณผ๊ฐ ์์ ์์ผ๋ฉด, ์๊ฒฉ์ด ์ฑ๋ฆฝํ๋์ง ํ๋จํ ์ ์๋ค.\n * ๋ง๋ฃ๋์๊ฑฐ๋ ๋จ์ด์ก์ผ๋ฉด ๊ทธ ์ฌ๋์๊ฒ ์์
์ด ๊ฐ์ง ์๋๋ค.\n */\n @Column({ type: 'simple-json', nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'TestResult[]' })\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((person: Person) => person.creator)\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true })\n updater?: User\n\n @RelationId((person: Person) => person.updater)\n updaterId?: string\n}\n"]}
|
|
@@ -12,7 +12,7 @@ import { User } from '@things-factory/auth-base';
|
|
|
12
12
|
*
|
|
13
13
|
* ๊ทธ๋ฆฌ๊ณ ํธ์ ์ปค๋์ `personnelClasses` ์๋ฆฌ๊ฐ ์๋๋ฐ, ์ง๊ธ๊น์ง ๋ถ์ธ ์๋ณธ์๋ ๊ทธ ์ฌ์ค์ด ์์๋ค.
|
|
14
14
|
* ๊ทธ๋์ ใ์๊ฒฉ์๊ฐ ๋๋ฟ์ด๋ผ ์ค๋น๊ฐ ๋
ผ๋คใ๋ฅผ ๋งํ ์ ์์๋ค
|
|
15
|
-
* (`operato-twin/design/integration/operato-
|
|
15
|
+
* (`operato-twin/design/integration/operato-plant.md` ยง5).
|
|
16
16
|
*
|
|
17
17
|
* โโ ํ๋ ์ด๋ฆ์ ์๋ก ์ง์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
18
18
|
* ์ปค๋ ๊ณ์ฝ์ `ResourceClassDef` ์ ๊ฐ์ ์ด๋ฆ์ ์ด๋ค(`@operato/ops-contract`). ๊ฐ์ ์ฌ์ค์ ์ด๋ฆ์ด
|
|
@@ -18,7 +18,7 @@ const auth_base_1 = require("@things-factory/auth-base");
|
|
|
18
18
|
*
|
|
19
19
|
* ๊ทธ๋ฆฌ๊ณ ํธ์ ์ปค๋์ `personnelClasses` ์๋ฆฌ๊ฐ ์๋๋ฐ, ์ง๊ธ๊น์ง ๋ถ์ธ ์๋ณธ์๋ ๊ทธ ์ฌ์ค์ด ์์๋ค.
|
|
20
20
|
* ๊ทธ๋์ ใ์๊ฒฉ์๊ฐ ๋๋ฟ์ด๋ผ ์ค๋น๊ฐ ๋
ผ๋คใ๋ฅผ ๋งํ ์ ์์๋ค
|
|
21
|
-
* (`operato-twin/design/integration/operato-
|
|
21
|
+
* (`operato-twin/design/integration/operato-plant.md` ยง5).
|
|
22
22
|
*
|
|
23
23
|
* โโ ํ๋ ์ด๋ฆ์ ์๋ก ์ง์ง ์๋๋ค โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
24
24
|
* ์ปค๋ ๊ณ์ฝ์ `ResourceClassDef` ์ ๊ฐ์ ์ด๋ฆ์ ์ด๋ค(`@operato/ops-contract`). ๊ฐ์ ์ฌ์ค์ ์ด๋ฆ์ด
|
|
@@ -63,7 +63,7 @@ tslib_1.__decorate([
|
|
|
63
63
|
], PersonnelClass.prototype, "testSpecificationIds", void 0);
|
|
64
64
|
tslib_1.__decorate([
|
|
65
65
|
(0, typeorm_1.Column)({ type: 'simple-json', nullable: true }),
|
|
66
|
-
(0, type_graphql_1.Field)(type =>
|
|
66
|
+
(0, type_graphql_1.Field)(type => shell_1.ScalarObject, { nullable: true, description: 'ResourceProperty[]' }),
|
|
67
67
|
tslib_1.__metadata("design:type", Array)
|
|
68
68
|
], PersonnelClass.prototype, "properties", void 0);
|
|
69
69
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"personnel-class.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-class.ts"],"names":[],"mappings":";;;;AAAA,qCASgB;AAChB,+CAAoD;AAEpD,
|
|
1
|
+
{"version":3,"file":"personnel-class.js","sourceRoot":"","sources":["../../../server/service/personnel/personnel-class.ts"],"names":[],"mappings":";;;;AAAA,qCASgB;AAChB,+CAAoD;AAEpD,iDAA4D;AAC5D,yDAAgD;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AAII,IAAM,cAAc,GAApB,MAAM,cAAc;CA6E1B,CAAA;AA7EY,wCAAc;AAGhB;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,CAAC;;0CACC;AAInB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IACzB,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;sCACb,cAAM;8CAAA;AAGf;IADC,IAAA,oBAAU,EAAC,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;;gDACnC;AAKjB;IAFC,IAAA,gBAAM,GAAE;IACR,IAAA,oBAAK,GAAE;;4CACI;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;mDACN;AAUpB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;+CAC1B;AAKlB;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4DACb;AAK/B;IAFC,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC/C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,oBAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;;kDAC7C;AAUtC;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACT,IAAI;IAErB,0DAA0D;;sDAFrC;AAKrB;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACX,IAAI;oDAAA;AAInB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;iDAAA;AAIhB;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACd,IAAI;iDAAA;AAIhB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCAC9B,gBAAI;+CAAA;AAGd;IADC,IAAA,oBAAU,EAAC,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;iDACnC;AAIlB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3C,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,gBAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCAC9B,gBAAI;+CAAA;AAGd;IADC,IAAA,oBAAU,EAAC,CAAC,KAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;iDACnC;yBA5EP,cAAc;IAH1B,IAAA,gBAAM,EAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC;IACvC,IAAA,eAAK,EAAC,0BAA0B,EAAE,CAAC,KAAqB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1G,IAAA,yBAAU,EAAC,EAAE,WAAW,EAAE,iEAAiE,EAAE,CAAC;GAClF,cAAc,CA6E1B","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, ScalarObject } 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-plant.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 => ScalarObject, { nullable: true, description: 'ResourceProperty[]' })\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"]}
|