@things-factory/dataset 7.0.0-alpha.5 → 7.0.0-alpha.7
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/client/activities/activity-data-collect-view.ts +7 -0
- package/client/activities/activity-data-review-edit.ts +66 -4
- package/client/activities/activity-data-review-view.ts +78 -4
- package/client/activities/activity-ooc-resolve-view.ts +12 -0
- package/client/activities/activity-ooc-review-view.ts +12 -0
- package/client/pages/data-entry/data-entry-list-page.ts +8 -23
- package/client/pages/data-ooc/data-ooc-list-page.ts +63 -19
- package/client/pages/data-ooc/{data-ooc-view-page.ts → data-ooc-page.ts} +43 -1
- package/client/pages/data-ooc/data-ooc-view.ts +198 -41
- package/client/pages/data-ooc/data-oocs-page.ts +198 -0
- package/client/pages/data-sample/data-sample-list-page.ts +48 -26
- package/client/pages/data-sample/{data-sample-view-page.ts → data-sample-page.ts} +8 -1
- package/client/pages/data-sample/data-sample-search-page.ts +25 -20
- package/client/pages/data-sample/data-sample-view.ts +191 -21
- package/client/pages/data-sample/data-samples-page.ts +247 -0
- package/client/pages/data-sensor/data-sensor-list-page.ts +28 -6
- package/client/pages/data-set/data-item-list.ts +2 -2
- package/client/route.ts +10 -2
- package/dist-client/activities/activity-data-collect-view.js +7 -0
- package/dist-client/activities/activity-data-collect-view.js.map +1 -1
- package/dist-client/activities/activity-data-review-edit.d.ts +1 -1
- package/dist-client/activities/activity-data-review-edit.js +63 -5
- package/dist-client/activities/activity-data-review-edit.js.map +1 -1
- package/dist-client/activities/activity-data-review-view.d.ts +1 -1
- package/dist-client/activities/activity-data-review-view.js +75 -5
- package/dist-client/activities/activity-data-review-view.js.map +1 -1
- package/dist-client/activities/activity-ooc-resolve-view.js +12 -0
- package/dist-client/activities/activity-ooc-resolve-view.js.map +1 -1
- package/dist-client/activities/activity-ooc-review-view.js +12 -0
- package/dist-client/activities/activity-ooc-review-view.js.map +1 -1
- package/dist-client/pages/data-entry/data-entry-list-page.js +3 -15
- package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -1
- package/dist-client/pages/data-ooc/data-ooc-list-page.d.ts +6 -0
- package/dist-client/pages/data-ooc/data-ooc-list-page.js +55 -12
- package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -1
- package/dist-client/pages/data-ooc/{data-ooc-view-page.js → data-ooc-page.js} +44 -2
- package/dist-client/pages/data-ooc/data-ooc-page.js.map +1 -0
- package/dist-client/pages/data-ooc/data-ooc-view.d.ts +11 -4
- package/dist-client/pages/data-ooc/data-ooc-view.js +193 -48
- package/dist-client/pages/data-ooc/data-ooc-view.js.map +1 -1
- package/dist-client/pages/data-ooc/data-oocs-page.d.ts +18 -0
- package/dist-client/pages/data-ooc/data-oocs-page.js +198 -0
- package/dist-client/pages/data-ooc/data-oocs-page.js.map +1 -0
- package/dist-client/pages/data-sample/data-sample-list-page.d.ts +6 -1
- package/dist-client/pages/data-sample/data-sample-list-page.js +42 -19
- package/dist-client/pages/data-sample/data-sample-list-page.js.map +1 -1
- package/dist-client/pages/data-sample/{data-sample-view-page.js → data-sample-page.js} +9 -2
- package/dist-client/pages/data-sample/data-sample-page.js.map +1 -0
- package/dist-client/pages/data-sample/data-sample-search-page.d.ts +6 -1
- package/dist-client/pages/data-sample/data-sample-search-page.js +19 -13
- package/dist-client/pages/data-sample/data-sample-search-page.js.map +1 -1
- package/dist-client/pages/data-sample/data-sample-view.d.ts +18 -0
- package/dist-client/pages/data-sample/data-sample-view.js +185 -19
- package/dist-client/pages/data-sample/data-sample-view.js.map +1 -1
- package/dist-client/pages/data-sample/data-samples-page.d.ts +21 -0
- package/dist-client/pages/data-sample/data-samples-page.js +247 -0
- package/dist-client/pages/data-sample/data-samples-page.js.map +1 -0
- package/dist-client/pages/data-sensor/data-sensor-list-page.js +28 -6
- package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -1
- package/dist-client/pages/data-set/data-item-list.js +2 -2
- package/dist-client/pages/data-set/data-item-list.js.map +1 -1
- package/dist-client/route.js +8 -2
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/activities/activity-data-review.js.map +1 -1
- package/dist-server/activities/activity-ooc-review.js +2 -1
- package/dist-server/activities/activity-ooc-review.js.map +1 -1
- package/dist-server/controllers/create-data-sample.js +27 -29
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/engine/index.js +4 -0
- package/dist-server/engine/index.js.map +1 -0
- package/dist-server/engine/task/create-data-sample.js +80 -0
- package/dist-server/engine/task/create-data-sample.js.map +1 -0
- package/dist-server/engine/task/index.js +4 -0
- package/dist-server/engine/task/index.js.map +1 -0
- package/dist-server/index.js +1 -0
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +35 -27
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +32 -0
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc.js +44 -37
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
- package/dist-server/service/data-sample/data-sample-query.js +24 -0
- package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
- package/dist-server/service/data-sample/data-sample.js +30 -31
- package/dist-server/service/data-sample/data-sample.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-query.js +16 -1
- package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor-type.js +8 -0
- package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
- package/dist-server/service/data-sensor/data-sensor.js +15 -1
- package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
- package/dist-server/service/data-set/data-item-type.js +1 -0
- package/dist-server/service/data-set/data-item-type.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +2 -2
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/dataset/task/create-data-sample.ja.md +28 -0
- package/helps/dataset/task/create-data-sample.ko.md +28 -0
- package/helps/dataset/task/create-data-sample.md +28 -0
- package/helps/dataset/task/create-data-sample.ms.md +30 -0
- package/helps/dataset/task/create-data-sample.zh.md +28 -0
- package/package.json +14 -11
- package/server/activities/activity-data-review.ts +1 -5
- package/server/activities/activity-ooc-review.ts +5 -15
- package/server/controllers/create-data-sample.ts +31 -38
- package/server/engine/index.ts +1 -0
- package/server/engine/task/create-data-sample.ts +92 -0
- package/server/engine/task/index.ts +1 -0
- package/server/index.ts +1 -0
- package/server/routes.ts +47 -31
- package/server/service/data-ooc/data-ooc-query.ts +17 -0
- package/server/service/data-ooc/data-ooc.ts +39 -51
- package/server/service/data-sample/data-sample-query.ts +17 -17
- package/server/service/data-sample/data-sample.ts +29 -52
- package/server/service/data-sensor/data-sensor-query.ts +13 -1
- package/server/service/data-sensor/data-sensor-type.ts +6 -0
- package/server/service/data-sensor/data-sensor.ts +13 -11
- package/server/service/data-set/data-item-type.ts +1 -0
- package/server/service/data-set/data-set-query.ts +7 -7
- package/things-factory.config.js +10 -2
- package/translations/en.json +15 -2
- package/translations/ja.json +12 -1
- package/translations/ko.json +14 -1
- package/translations/ms.json +11 -0
- package/translations/zh.json +12 -1
- package/dist-client/pages/data-ooc/data-ooc-view-page.js.map +0 -1
- package/dist-client/pages/data-sample/data-sample-view-page.js.map +0 -1
- /package/dist-client/pages/data-ooc/{data-ooc-view-page.d.ts → data-ooc-page.d.ts} +0 -0
- /package/dist-client/pages/data-sample/{data-sample-view-page.d.ts → data-sample-page.d.ts} +0 -0
@@ -0,0 +1,28 @@
|
|
1
|
+
# create-data-sample
|
2
|
+
|
3
|
+
このタスクは、特定のデータセットに関連するデータサンプルを作成し、接続されたデバイスや外部データソースからデータを抽出して処理します。
|
4
|
+
|
5
|
+
## パラメーター
|
6
|
+
|
7
|
+
- **データセット (dataset)**
|
8
|
+
- データサンプルが追加されるデータセットの一意の識別子(ID)です。このデータセットはシステム内に既に存在している必要があります。
|
9
|
+
- **ソース (source)**
|
10
|
+
- データが収集されるデバイスまたはデータソースの識別子です。これは、デバイス ID または記述的な名前である可能性があります。
|
11
|
+
- [アクセッサー](../../integration/concept/data-accessor.md)
|
12
|
+
- **生データ (rawData)**
|
13
|
+
- コンテキストまたは受信データペイロードから生データを取得するためのアクセスパスです。このパスは、提供されたデータ構造内で生データを見つける場所を指定します。
|
14
|
+
- [アクセッサー](../../integration/concept/data-accessor.md)
|
15
|
+
- **データ (data)**
|
16
|
+
- コンテキストまたは受信データペイロードから処理されたまたは抽出されたデータを取得するためのアクセスパスです。rawData と同様に、これは提供されたデータ構造内で関連データを見つける場所を指定します。
|
17
|
+
- [アクセッサー](../../integration/concept/data-accessor.md)
|
18
|
+
- **タイムスタンプ (timestamp)**
|
19
|
+
- データサンプルの作成に関連するタイムスタンプです。提供されない場合は、現在の時刻が使用されます。このタイムスタンプは、データが収集または生成された時点をマークします。
|
20
|
+
- [アクセッサー](../../integration/concept/data-accessor.md)
|
21
|
+
|
22
|
+
## 使用法
|
23
|
+
|
24
|
+
このタスクは、デバイスや外部ソースから収集されたデータを構造化して大規模なデータセットの一部として保存する必要があるシナリオで設計されています。IoT アプリケーション、データ分析ワークフロー、およびさまざまなソースからのデータを集約して処理および分析するあらゆる状況で特に役立ちます。
|
25
|
+
|
26
|
+
タスクを構成する際には、データセット ID がシステム内の既存のデータセットに対応していることを確認してください。ソース、生データ、およびデータパラメーターは、受信ペイロード内のデータを正確に位置付けて処理するために正しく指定されている必要があります。タイムスタンプパラメーターにより、データサンプルをその起源または収集点の時点と時間的に関連付けることができます。
|
27
|
+
|
28
|
+
このタスクは、データ収集および保存プロセスを自動化し、アプリケーション内で効率的なデータ管理および分析を可能にします。それは、データ中心のワークフローにシームレスに統合され、さまざまなソースからのデータが体系的にキャプチャされ、カタログ化されて将来の使用のために保存されることを保証します。
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# create-data-sample
|
2
|
+
|
3
|
+
이 작업은 특정 데이터셋과 관련된 데이터 샘플을 생성하며, 연결된 장치나 외부 데이터 소스에서 데이터를 추출하고 처리합니다.
|
4
|
+
|
5
|
+
## 매개변수
|
6
|
+
|
7
|
+
- **데이터셋 (dataset)**
|
8
|
+
- 데이터 샘플이 추가될 데이터셋의 고유 식별자(ID)입니다. 이 데이터셋은 시스템 내에 이미 존재해야 합니다.
|
9
|
+
- **소스 (source)**
|
10
|
+
- 데이터가 수집되는 장치 또는 데이터 소스의 식별자입니다. 이는 장치 ID 또는 설명적 이름일 수 있습니다.
|
11
|
+
- [접근자](../../integration/concept/data-accessor.md)
|
12
|
+
- **원시 데이터 (rawData)**
|
13
|
+
- 맥락이나 들어오는 데이터 페이로드에서 원시 데이터를 검색하기 위한 접근자 경로입니다. 이 경로는 제공된 데이터 구조 내에서 원시 데이터를 찾을 위치를 지정합니다.
|
14
|
+
- [접근자](../../integration/concept/data-accessor.md)
|
15
|
+
- **데이터 (data)**
|
16
|
+
- 맥락이나 들어오는 데이터 페이로드에서 처리되거나 추출된 데이터를 검색하기 위한 접근자 경로입니다. rawData와 유사하게, 이는 제공된 데이터 구조 내에서 관련 데이터를 찾을 위치를 지정합니다.
|
17
|
+
- [접근자](../../integration/concept/data-accessor.md)
|
18
|
+
- **타임스탬프 (timestamp)**
|
19
|
+
- 데이터 샘플 생성과 관련된 타임스탬프입니다. 제공되지 않은 경우, 현재 시간이 사용됩니다. 이 타임스탬프는 데이터가 수집되거나 생성된 시점을 표시합니다.
|
20
|
+
- [접근자](../../integration/concept/data-accessor.md)
|
21
|
+
|
22
|
+
## 사용 방법
|
23
|
+
|
24
|
+
이 작업은 장치나 외부 소스에서 수집된 데이터를 구조화하고 큰 데이터셋의 일부로 저장해야 하는 시나리오에 설계되었습니다. IoT 애플리케이션, 데이터 분석 워크플로우 및 다양한 소스에서 데이터를 집계하여 처리 및 분석하는 모든 상황에서 유용합니다.
|
25
|
+
|
26
|
+
작업을 구성할 때, 데이터셋 ID가 시스템 내에 존재하는 데이터셋에 해당하는지 확인해야 합니다. 소스, rawData, 데이터 매개변수는 들어오는 페이로드 내에서 데이터를 정확하게 찾아내고 처리할 수 있도록 올바르게 지정되어야 합니다. 타임스탬프 매개변수는 데이터 샘플이 그 기원이나 수집 지점과 시간적으로 연관되도록 합니다.
|
27
|
+
|
28
|
+
이 작업은 데이터 수집 및 저장 과정을 자동화하여, 애플리케이션 내에서 효율적인 데이터 관리 및 분석을 가능하게 합니다. 다양한 소스에서의 데이터를 체계적으로 캡처하고 카탈로그화하여 향후 사용을 위해 저장하는 데이터 중심 워크플로우에 원활하게 통합됩니다.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# create-data-sample
|
2
|
+
|
3
|
+
This task creates a data sample associated with a specific dataset, extracting and processing data from a connected device or an external data source.
|
4
|
+
|
5
|
+
## Parameters
|
6
|
+
|
7
|
+
- **Dataset (dataset)**
|
8
|
+
- The unique identifier (ID) of the dataset to which the data sample will be added. This dataset should already exist within the system.
|
9
|
+
- **Source (source)**
|
10
|
+
- The identifier of the device or data source from which the data is being collected. This could be a device ID or a descriptive name.
|
11
|
+
- [accessor](../../integration/concept/data-accessor.md)
|
12
|
+
- **Raw Data (rawData)**
|
13
|
+
- An accessor path to retrieve the raw data from the context or the incoming data payload. This path specifies where to find the raw data within the data structure provided to the task.
|
14
|
+
- [accessor](../../integration/concept/data-accessor.md)
|
15
|
+
- **Data (data)**
|
16
|
+
- An accessor path to retrieve the processed or extracted data from the context or the incoming data payload. Similar to rawData, this specifies where to find the relevant data within the provided data structure.
|
17
|
+
- [accessor](../../integration/concept/data-accessor.md)
|
18
|
+
- **Timestamp (timestamp)**
|
19
|
+
- The timestamp associated with the data sample creation. If not provided, the current time will be used. This timestamp marks when the data was collected or generated.
|
20
|
+
- [accessor](../../integration/concept/data-accessor.md)
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
This task is designed for scenarios where data collected from devices or external sources needs to be structured and stored as part of a larger dataset. It is particularly useful in IoT applications, data analysis workflows, and any situation where data from various sources is aggregated for processing and analysis.
|
25
|
+
|
26
|
+
When configuring the task, ensure that the dataset ID corresponds to an existing dataset within your system. The source, rawData, and data parameters must be correctly specified to accurately locate and process the data within the incoming payload. The timestamp parameter allows for the temporal association of the data sample with its point of origin or collection.
|
27
|
+
|
28
|
+
This task automates the process of data collection and storage, enabling efficient data management and analysis within your applications. It integrates seamlessly into data-centric workflows, ensuring that data from varied sources is systematically captured and catalogued for future use.
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# create-data-sample
|
2
|
+
|
3
|
+
Tugas ini mencipta sampel data yang berkaitan dengan set data tertentu, mengeluarkan dan memproses data dari peranti yang disambungkan atau sumber data luaran.
|
4
|
+
|
5
|
+
## Parameter
|
6
|
+
|
7
|
+
- **Dataset (dataset)**
|
8
|
+
- Pengenal unik (ID) set data yang sampel datanya akan ditambahkan. Set data ini seharusnya sudah wujud dalam sistem.
|
9
|
+
- **Sumber (source)**
|
10
|
+
- Pengenal peranti atau sumber data dari mana data sedang dikumpul. Ini boleh jadi ID peranti atau nama deskriptif.
|
11
|
+
- [aksesor](../../integration/concept/data-accessor.md)
|
12
|
+
- **Data Mentah (rawData)**
|
13
|
+
- Laluan akses untuk mengambil data mentah dari konteks atau muatan data masuk. Laluan ini menentukan di mana untuk mencari data mentah dalam struktur data yang disediakan.
|
14
|
+
- [aksesor](../../integration/concept/data-accessor.md)
|
15
|
+
- **Data (data)**
|
16
|
+
- Laluan akses untuk mengambil data yang diproses atau diekstrak dari konteks atau muatan data masuk. Sama seperti rawData, ini menentukan di mana untuk mencari data yang relevan dalam struktur data yang disediakan.
|
17
|
+
- [aksesor](../../integration/concept/data-accessor.md)
|
18
|
+
- **Timestamp (timestamp)**
|
19
|
+
- Cap waktu yang berkaitan dengan penciptaan sampel data. Jika tidak disediakan, waktu sekarang akan digunakan. Cap waktu ini menandai bila data dikumpulkan atau dihasilkan.
|
20
|
+
- [aksesor](../../integration/concept/data-accessor.md)
|
21
|
+
|
22
|
+
## Penggunaan
|
23
|
+
|
24
|
+
Tugas ini direka untuk skenario di mana data yang dikumpul dari peranti atau sumber luaran perlu disusun dan disimpan sebagai sebahagian dari set data yang lebih besar. Ia sangat berguna dalam aplikasi IoT, aliran kerja analisis data, dan situasi apa pun di mana data dari pelbagai sumber diagregasi untuk pemprosesan dan analisis.
|
25
|
+
|
26
|
+
Semasa mengkonfigurasi tugas, pastikan ID set data sesuai dengan set data yang sudah ada dalam sistem anda. Sumber, rawData, dan parameter
|
27
|
+
|
28
|
+
data harus ditentukan dengan tepat untuk secara akurat menemukan dan memproses data dalam muatan yang masuk. Parameter timestamp membolehkan pengaitan temporal sampel data dengan titik asal atau pengumpulan.
|
29
|
+
|
30
|
+
Tugas ini mengautomatikkan proses pengumpulan dan penyimpanan data, memungkinkan pengurusan data dan analisis yang efisien dalam aplikasi anda. Ia berintegrasi dengan lancar ke dalam aliran kerja berpusat data, memastikan data dari pelbagai sumber secara sistematis ditangkap dan dikatalogkan untuk penggunaan masa depan.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# create-data-sample
|
2
|
+
|
3
|
+
这个任务创建了一个与特定数据集相关的数据样本,从连接的设备或外部数据源提取和处理数据。
|
4
|
+
|
5
|
+
## 参数
|
6
|
+
|
7
|
+
- **数据集 (dataset)**
|
8
|
+
- 数据样本将被添加到的数据集的唯一标识符(ID)。该数据集应该已经存在于系统中。
|
9
|
+
- **来源 (source)**
|
10
|
+
- 数据收集来源的标识符,可以是设备 ID 或描述性名称。
|
11
|
+
- [访问器](../../integration/concept/data-accessor.md)
|
12
|
+
- **原始数据 (rawData)**
|
13
|
+
- 从上下文或传入的数据负载中检索原始数据的访问路径。此路径指定在提供的数据结构内找到原始数据的位置。
|
14
|
+
- [访问器](../../integration/concept/data-accessor.md)
|
15
|
+
- **数据 (data)**
|
16
|
+
- 从上下文或传入的数据负载中检索处理或提取的数据的访问路径。类似于 rawData,这指定了在提供的数据结构内找到相关数据的位置。
|
17
|
+
- [访问器](../../integration/concept/data-accessor.md)
|
18
|
+
- **时间戳 (timestamp)**
|
19
|
+
- 与数据样本创建相关的时间戳。如果未提供,将使用当前时间。此时间戳标记数据被收集或生成的时刻。
|
20
|
+
- [访问器](../../integration/concept/data-accessor.md)
|
21
|
+
|
22
|
+
## 使用场景
|
23
|
+
|
24
|
+
此任务设计用于从设备或外部来源收集的数据需要被结构化并作为更大数据集的一部分存储的场景。它在 IoT 应用、数据分析工作流程以及任何需要聚合各种来源数据进行处理和分析的情况下特别有用。
|
25
|
+
|
26
|
+
配置任务时,确保数据集 ID 对应于您系统内的现有数据集。必须正确指定来源、原始数据和数据参数,以准确地定位和处理传入负载中的数据。时间戳参数允许数据样本与其起源点或收集点时间上的关联。
|
27
|
+
|
28
|
+
这个任务自动化了数据收集和存储过程,使得在应用程序中进行高效的数据管理和分析成为可能。它无缝集成到以数据为中心的工作流程中,确保来自各种来源的数据被系统地捕获和编目,以备将来使用。
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@things-factory/dataset",
|
3
|
-
"version": "7.0.0-alpha.
|
3
|
+
"version": "7.0.0-alpha.7",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "dist-client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -27,9 +27,12 @@
|
|
27
27
|
"migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
|
28
28
|
},
|
29
29
|
"dependencies": {
|
30
|
+
"@material/mwc-fab": "^0.27.0",
|
31
|
+
"@material/mwc-icon": "^0.27.0",
|
30
32
|
"@operato/app": "^2.0.0-alpha.0",
|
31
33
|
"@operato/data-grist": "^2.0.0-alpha.0",
|
32
34
|
"@operato/dataset": "^2.0.0-alpha.0",
|
35
|
+
"@operato/ghost-print": "^2.0.0-alpha.0",
|
33
36
|
"@operato/graphql": "^2.0.0-alpha.0",
|
34
37
|
"@operato/grist-editor": "^2.0.0-alpha.0",
|
35
38
|
"@operato/i18n": "^2.0.0-alpha.0",
|
@@ -37,20 +40,20 @@
|
|
37
40
|
"@operato/shell": "^2.0.0-alpha.0",
|
38
41
|
"@operato/styles": "^2.0.0-alpha.0",
|
39
42
|
"@operato/utils": "^2.0.0-alpha.0",
|
40
|
-
"@things-factory/auth-base": "^7.0.0-alpha.
|
41
|
-
"@things-factory/aws-base": "^7.0.0-alpha.
|
42
|
-
"@things-factory/board-service": "^7.0.0-alpha.
|
43
|
+
"@things-factory/auth-base": "^7.0.0-alpha.7",
|
44
|
+
"@things-factory/aws-base": "^7.0.0-alpha.7",
|
45
|
+
"@things-factory/board-service": "^7.0.0-alpha.7",
|
43
46
|
"@things-factory/env": "^7.0.0-alpha.0",
|
44
|
-
"@things-factory/integration-base": "^7.0.0-alpha.
|
45
|
-
"@things-factory/organization": "^7.0.0-alpha.
|
46
|
-
"@things-factory/scheduler-client": "^7.0.0-alpha.
|
47
|
-
"@things-factory/shell": "^7.0.0-alpha.
|
48
|
-
"@things-factory/work-shift": "^7.0.0-alpha.
|
49
|
-
"@things-factory/worklist": "^7.0.0-alpha.
|
47
|
+
"@things-factory/integration-base": "^7.0.0-alpha.7",
|
48
|
+
"@things-factory/organization": "^7.0.0-alpha.7",
|
49
|
+
"@things-factory/scheduler-client": "^7.0.0-alpha.7",
|
50
|
+
"@things-factory/shell": "^7.0.0-alpha.7",
|
51
|
+
"@things-factory/work-shift": "^7.0.0-alpha.7",
|
52
|
+
"@things-factory/worklist": "^7.0.0-alpha.7",
|
50
53
|
"cron-parser": "^4.3.0",
|
51
54
|
"moment-timezone": "^0.5.40",
|
52
55
|
"simple-statistics": "^7.8.3",
|
53
56
|
"statistics": "^3.3.0"
|
54
57
|
},
|
55
|
-
"gitHead": "
|
58
|
+
"gitHead": "85c46b9027d6188ddbd5104215a2256ff5331c19"
|
56
59
|
}
|
@@ -3,11 +3,7 @@ import { ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAd
|
|
3
3
|
import { DataOocStatus } from '../service/data-ooc/data-ooc'
|
4
4
|
import { DataSample } from '../service/data-sample/data-sample'
|
5
5
|
|
6
|
-
async function callback(
|
7
|
-
activityInstance: ActivityInstance,
|
8
|
-
addendum: UpdateActivityInstanceStateAddendum,
|
9
|
-
context: ResolverContext
|
10
|
-
) {
|
6
|
+
async function callback(activityInstance: ActivityInstance, addendum: UpdateActivityInstanceStateAddendum, context: ResolverContext) {
|
11
7
|
const { domain, tx, user } = context.state
|
12
8
|
const { input, output, state } = activityInstance
|
13
9
|
|
@@ -1,18 +1,9 @@
|
|
1
|
-
import {
|
2
|
-
Activity,
|
3
|
-
ActivityInstance,
|
4
|
-
ActivityInstanceStatus,
|
5
|
-
UpdateActivityInstanceStateAddendum
|
6
|
-
} from '@things-factory/worklist'
|
1
|
+
import { Activity, ActivityInstance, ActivityInstanceStatus, UpdateActivityInstanceStateAddendum } from '@things-factory/worklist'
|
7
2
|
import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
|
8
3
|
|
9
4
|
import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
|
10
5
|
|
11
|
-
async function callback(
|
12
|
-
activityInstance: ActivityInstance,
|
13
|
-
addendum: UpdateActivityInstanceStateAddendum,
|
14
|
-
context: ResolverContext
|
15
|
-
) {
|
6
|
+
async function callback(activityInstance: ActivityInstance, addendum: UpdateActivityInstanceStateAddendum, context: ResolverContext) {
|
16
7
|
const { domain, user, tx } = context.state
|
17
8
|
const { input, output, state, terminatedAt } = activityInstance
|
18
9
|
const { causedBy } = addendum || {}
|
@@ -62,11 +53,10 @@ async function callback(
|
|
62
53
|
approvalLine: outlierApprovalLine
|
63
54
|
}
|
64
55
|
|
65
|
-
await issue(activityInstance, context)
|
56
|
+
dataOoc.resolveActivityInstance = await issue(activityInstance, context)
|
57
|
+
await tx.getRepository(DataOoc).save(dataOoc)
|
66
58
|
} else {
|
67
|
-
console.error(
|
68
|
-
`Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
|
69
|
-
)
|
59
|
+
console.error(`Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`)
|
70
60
|
}
|
71
61
|
} else {
|
72
62
|
console.error('OOC Resolve Activity not installed.')
|
@@ -55,16 +55,16 @@ const formatDate = (keys, _moment) => {
|
|
55
55
|
return keys
|
56
56
|
}
|
57
57
|
|
58
|
-
export async function createDataSample(
|
58
|
+
export async function createDataSample(newDataSample: NewDataSample, context: ResolverContext): Promise<DataSample> {
|
59
59
|
const { domain, user, tx } = context.state
|
60
60
|
|
61
61
|
const dataSet = await tx.getRepository(DataSet).findOne({
|
62
|
-
where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id:
|
62
|
+
where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: newDataSample.dataSet.id },
|
63
63
|
relations: ['dataKeySet']
|
64
64
|
})
|
65
65
|
|
66
66
|
const { dataItems, tag: publishTag, normalScenarioId, outlierScenarioId } = dataSet
|
67
|
-
const collectedAt =
|
67
|
+
const collectedAt = newDataSample.collectedAt || new Date()
|
68
68
|
|
69
69
|
const timezone = dataSet.timezone || domain.timezone || 'UTC'
|
70
70
|
const format = 'YYYY-MM-DD'
|
@@ -77,7 +77,7 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
77
77
|
const localDateTz = moment(collectedAt).tz(timezone)
|
78
78
|
const defaultPartitionKeys = {
|
79
79
|
domain: domain.subdomain,
|
80
|
-
datasetid:
|
80
|
+
datasetid: newDataSample.dataSet.id /* It should not be 'data_set_id' as column name duplicated for Glue */,
|
81
81
|
date: localDateTz.format(format) /* local time date */,
|
82
82
|
workdate: workDate /* working date */,
|
83
83
|
workshift: workShift
|
@@ -89,11 +89,11 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
89
89
|
}
|
90
90
|
|
91
91
|
partitionKeys = formatDate(partitionKeys, localDateTz)
|
92
|
-
partitionKeys = replaceVariables(partitionKeys,
|
92
|
+
partitionKeys = replaceVariables(partitionKeys, newDataSample.data)
|
93
93
|
|
94
|
-
const dataKeys = fillDataKeys(dataSet?.dataKeySet,
|
94
|
+
const dataKeys = fillDataKeys(dataSet?.dataKeySet, newDataSample.data)
|
95
95
|
|
96
|
-
const { ooc, oos, judgment } = DataUseCase.evaluate(dataSet, dataItems,
|
96
|
+
const { ooc, oos, judgment } = DataUseCase.evaluate(dataSet, dataItems, newDataSample.data) || {}
|
97
97
|
|
98
98
|
const old = await tx.getRepository(DataSample).findOne({
|
99
99
|
where: {
|
@@ -110,7 +110,7 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
110
110
|
If [FileUpload[]] type needed, add 'files' type for dataset
|
111
111
|
*/
|
112
112
|
|
113
|
-
const data =
|
113
|
+
const data = newDataSample.data
|
114
114
|
const attachments = []
|
115
115
|
|
116
116
|
for (let dataItem of dataItems) {
|
@@ -164,13 +164,13 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
164
164
|
}
|
165
165
|
}
|
166
166
|
|
167
|
-
const
|
167
|
+
const dataSample = await tx.getRepository(DataSample).save({
|
168
168
|
...old,
|
169
169
|
name: dataSet.name,
|
170
170
|
description: dataSet.description,
|
171
171
|
useCase: dataSet.useCase,
|
172
172
|
type: dataSet.type,
|
173
|
-
...
|
173
|
+
...newDataSample,
|
174
174
|
...dataKeys,
|
175
175
|
dataSetVersion: dataSet.version,
|
176
176
|
domain,
|
@@ -197,13 +197,13 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
197
197
|
|
198
198
|
/* post-process for for file attachment. */
|
199
199
|
if (attachments.length > 0) {
|
200
|
-
attachments.forEach(attachment => (attachment.refId =
|
200
|
+
attachments.forEach(attachment => (attachment.refId = dataSample.id))
|
201
201
|
tx.getRepository(Attachment).save(attachments)
|
202
202
|
}
|
203
203
|
|
204
204
|
if (ooc || oos) {
|
205
205
|
const dataOoc = await tx.getRepository(DataOoc).save({
|
206
|
-
...
|
206
|
+
...dataSample,
|
207
207
|
history: [
|
208
208
|
{
|
209
209
|
user: {
|
@@ -214,7 +214,8 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
214
214
|
timestamp: collectedAt
|
215
215
|
}
|
216
216
|
],
|
217
|
-
state: DataOocStatus.ISSUED
|
217
|
+
state: DataOocStatus.ISSUED,
|
218
|
+
dataSample: dataSample
|
218
219
|
})
|
219
220
|
|
220
221
|
if (outlierScenarioId) {
|
@@ -227,9 +228,9 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
227
228
|
})
|
228
229
|
|
229
230
|
if (scenario) {
|
230
|
-
scenario.start(scenario.name + ':' + dataSet.name + ':' +
|
231
|
+
scenario.start(scenario.name + ':' + dataSet.name + ':' + dataSample.id, {
|
231
232
|
dataOocId: dataOoc.id,
|
232
|
-
dataSampleId:
|
233
|
+
dataSampleId: dataSample.id,
|
233
234
|
dataSet: dataSet.id,
|
234
235
|
data,
|
235
236
|
ooc,
|
@@ -260,9 +261,7 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
260
261
|
})) as Activity
|
261
262
|
|
262
263
|
if (activity) {
|
263
|
-
const assignee =
|
264
|
-
dataSet.supervisoryRoleId &&
|
265
|
-
(await tx.getRepository(Role).findOneBy({ domain: { id: domain.id }, id: dataSet.supervisoryRoleId }))
|
264
|
+
const assignee = dataSet.supervisoryRoleId && (await tx.getRepository(Role).findOneBy({ domain: { id: domain.id }, id: dataSet.supervisoryRoleId }))
|
266
265
|
|
267
266
|
const assignees = dataSet.supervisoryRoleId ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }] : []
|
268
267
|
|
@@ -280,11 +279,10 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
280
279
|
approvalLine: []
|
281
280
|
}
|
282
281
|
|
283
|
-
await issue(activityInstance, context)
|
282
|
+
dataOoc.reviewActivityInstance = await issue(activityInstance, context)
|
283
|
+
await tx.getRepository(DataOoc).save(dataOoc)
|
284
284
|
} else {
|
285
|
-
console.error(
|
286
|
-
`Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`
|
287
|
-
)
|
285
|
+
console.error(`Assignees are not set. So Data OOC Review task for ${dataOoc.name}(${dataOoc.id}) could not be issued.`)
|
288
286
|
}
|
289
287
|
} else {
|
290
288
|
console.error('OOC Review Activity not installed.')
|
@@ -320,8 +318,8 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
320
318
|
})
|
321
319
|
|
322
320
|
if (scenario) {
|
323
|
-
scenario.start(scenario.name + ':' + dataSet.name + ':' +
|
324
|
-
dataSampleId:
|
321
|
+
scenario.start(scenario.name + ':' + dataSet.name + ':' + dataSample.id, {
|
322
|
+
dataSampleId: dataSample.id,
|
325
323
|
dataSet: dataSet.id,
|
326
324
|
data,
|
327
325
|
ooc,
|
@@ -353,30 +351,27 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
353
351
|
})) as Activity
|
354
352
|
|
355
353
|
if (activity) {
|
356
|
-
const assignee =
|
357
|
-
dataSet.supervisoryRoleId &&
|
358
|
-
(await tx.getRepository(Role).findOneBy({ domain: { id: domain.id }, id: dataSet.supervisoryRoleId }))
|
354
|
+
const assignee = dataSet.supervisoryRoleId && (await tx.getRepository(Role).findOneBy({ domain: { id: domain.id }, id: dataSet.supervisoryRoleId }))
|
359
355
|
|
360
|
-
const assignees = dataSet.supervisoryRoleId
|
361
|
-
? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }]
|
362
|
-
: []
|
356
|
+
const assignees = dataSet.supervisoryRoleId ? [{ type: 'Role', value: dataSet.supervisoryRoleId, assignee }] : []
|
363
357
|
|
364
358
|
/* 해당 dataset의 supervisor로 하여금, data를 리뷰하고 instruction을 작성해서, approvalLine을 이용해서 승인을 한다. */
|
365
359
|
if (assignees && assignees instanceof Array && assignees.length > 0) {
|
366
|
-
|
360
|
+
dataSample.dataItems = dataItems
|
367
361
|
const activityInstance = {
|
368
362
|
name: `[Data 검토] ${dataSet.name}`,
|
369
363
|
description: dataSet.description,
|
370
364
|
activityId: activity.id,
|
371
365
|
dueAt: new Date(collectedAt.getTime() + 24 * 60 * 60 * 1000),
|
372
366
|
input: {
|
373
|
-
|
367
|
+
dataSampleId: dataSample.id
|
374
368
|
},
|
375
369
|
assignees,
|
376
370
|
approvalLine: dataSet.reviewApprovalLine
|
377
371
|
}
|
378
372
|
|
379
|
-
await issue(activityInstance, context)
|
373
|
+
dataSample.reviewActivityInstance = await issue(activityInstance, context)
|
374
|
+
await tx.getRepository(DataSample).save(dataSample)
|
380
375
|
|
381
376
|
try {
|
382
377
|
pubsub.publish('notification', {
|
@@ -385,7 +380,7 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
385
380
|
type: 'info',
|
386
381
|
title: `[Data Review] ${dataSet.name}`,
|
387
382
|
body: `Data Review occurred on '${dataSet.name}'`,
|
388
|
-
url: getRedirectSubdomainPath(context, domain.subdomain, `/data-sample/${
|
383
|
+
url: getRedirectSubdomainPath(context, domain.subdomain, `/data-sample/${dataSample.id}`),
|
389
384
|
timestamp: collectedAt
|
390
385
|
}
|
391
386
|
})
|
@@ -393,9 +388,7 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
393
388
|
logger.error('Notification', err)
|
394
389
|
}
|
395
390
|
} else {
|
396
|
-
console.error(
|
397
|
-
`Assignees are not set. So Data Review task for ${dataSet.name}(${dataSet.id}) could not be issued.`
|
398
|
-
)
|
391
|
+
console.error(`Assignees are not set. So Data Review task for ${dataSet.name}(${dataSet.id}) could not be issued.`)
|
399
392
|
}
|
400
393
|
} else {
|
401
394
|
console.error('Data Review Activity not installed.')
|
@@ -403,5 +396,5 @@ export async function createDataSample(dataSample: NewDataSample, context: Resol
|
|
403
396
|
}
|
404
397
|
}
|
405
398
|
|
406
|
-
return
|
399
|
+
return dataSample
|
407
400
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
import './task'
|
@@ -0,0 +1,92 @@
|
|
1
|
+
import { TaskRegistry } from '@things-factory/integration-base'
|
2
|
+
import { getDataSource } from '@things-factory/shell'
|
3
|
+
import { access } from '@things-factory/utils'
|
4
|
+
import i18next from 'i18next'
|
5
|
+
|
6
|
+
import { DataSet } from '../../service/data-set/data-set'
|
7
|
+
|
8
|
+
import { createDataSample } from '../../controllers/create-data-sample'
|
9
|
+
|
10
|
+
async function CreateDataSample(step, context) {
|
11
|
+
const { logger, data, domain, user, lng } = context
|
12
|
+
var {
|
13
|
+
params: { dataset: dataSetId, source: sourceAccessor, rawData: rawDataAccessor, data: dataAccessor, timestamp }
|
14
|
+
} = step
|
15
|
+
|
16
|
+
if (!dataSetId) {
|
17
|
+
throw new Error(`no dataset found`)
|
18
|
+
}
|
19
|
+
|
20
|
+
// make new data-sample
|
21
|
+
await getDataSource().transaction(async tx => {
|
22
|
+
const dataSet = await tx.getRepository(DataSet).findOne({
|
23
|
+
where: {
|
24
|
+
id: dataSetId
|
25
|
+
}
|
26
|
+
})
|
27
|
+
|
28
|
+
var source = await access(sourceAccessor, data)
|
29
|
+
var extractedData = await access(dataAccessor, data)
|
30
|
+
var extractedRawData = rawDataAccessor && (await access(rawDataAccessor, data))
|
31
|
+
|
32
|
+
const dataSample = await createDataSample(
|
33
|
+
{
|
34
|
+
dataSet,
|
35
|
+
data: extractedData,
|
36
|
+
rawData: extractedRawData,
|
37
|
+
source,
|
38
|
+
collectedAt: new Date(timestamp || new Date())
|
39
|
+
},
|
40
|
+
{
|
41
|
+
t: i18next.t,
|
42
|
+
state: {
|
43
|
+
domain,
|
44
|
+
user,
|
45
|
+
lng,
|
46
|
+
tx
|
47
|
+
}
|
48
|
+
}
|
49
|
+
)
|
50
|
+
|
51
|
+
return {
|
52
|
+
data: dataSample
|
53
|
+
}
|
54
|
+
})
|
55
|
+
}
|
56
|
+
|
57
|
+
CreateDataSample.parameterSpec = [
|
58
|
+
{
|
59
|
+
type: 'entity-selector',
|
60
|
+
name: 'dataset',
|
61
|
+
label: 'data-set',
|
62
|
+
property: {
|
63
|
+
queryName: 'dataSets',
|
64
|
+
valueKey: 'id'
|
65
|
+
}
|
66
|
+
},
|
67
|
+
{
|
68
|
+
type: 'string',
|
69
|
+
name: 'source',
|
70
|
+
label: 'source'
|
71
|
+
},
|
72
|
+
{
|
73
|
+
type: 'string',
|
74
|
+
name: 'rawData',
|
75
|
+
label: 'raw-data'
|
76
|
+
},
|
77
|
+
{
|
78
|
+
type: 'string',
|
79
|
+
name: 'data',
|
80
|
+
label: 'data'
|
81
|
+
},
|
82
|
+
{
|
83
|
+
type: 'string',
|
84
|
+
name: 'timestamp',
|
85
|
+
label: 'timestamp'
|
86
|
+
}
|
87
|
+
]
|
88
|
+
|
89
|
+
CreateDataSample.connectorFree = true
|
90
|
+
CreateDataSample.help = 'dataset/task/create-data-sample'
|
91
|
+
|
92
|
+
TaskRegistry.registerTaskHandler('create-data-sample', CreateDataSample)
|
@@ -0,0 +1 @@
|
|
1
|
+
import './create-data-sample'
|