@things-factory/dataset 5.0.0-alpha.25 → 5.0.0-alpha.28

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.
@@ -11,7 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
11
11
  var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
- var _a;
14
+ var _a, _b;
15
15
  Object.defineProperty(exports, "__esModule", { value: true });
16
16
  exports.DataSetQuery = void 0;
17
17
  const type_graphql_1 = require("type-graphql");
@@ -21,6 +21,8 @@ const shell_1 = require("@things-factory/shell");
21
21
  const data_item_1 = require("../data-item/data-item");
22
22
  const data_set_1 = require("./data-set");
23
23
  const data_set_type_1 = require("./data-set-type");
24
+ const data_sample_1 = require("../data-sample/data-sample");
25
+ var parser = require('cron-parser');
24
26
  let DataSetQuery = class DataSetQuery {
25
27
  async dataSet(id, context) {
26
28
  const { domain } = context.state;
@@ -34,6 +36,13 @@ let DataSetQuery = class DataSetQuery {
34
36
  const [items, total] = await (0, typeorm_1.getRepository)(data_set_1.DataSet).findAndCount(convertedParams);
35
37
  return { items, total };
36
38
  }
39
+ async dataSetsForEntry(params, context) {
40
+ const { domain } = context.state;
41
+ /* TODO. 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
42
+ const convertedParams = (0, shell_1.convertListParams)(params, domain.id);
43
+ const [items, total] = await (0, typeorm_1.getRepository)(data_set_1.DataSet).findAndCount(convertedParams);
44
+ return { items, total };
45
+ }
37
46
  async dataItems(dataSet) {
38
47
  return await (0, typeorm_1.getRepository)(data_item_1.DataItem).find({
39
48
  dataSet
@@ -53,6 +62,34 @@ let DataSetQuery = class DataSetQuery {
53
62
  async creator(dataSet) {
54
63
  return await (0, typeorm_1.getRepository)(auth_base_1.User).findOne(dataSet.creatorId);
55
64
  }
65
+ async latestCollectedAt(dataSet) {
66
+ const sample = await (0, typeorm_1.getRepository)(data_sample_1.DataSample).findOne({
67
+ select: ['collectedAt'],
68
+ where: { dataSet },
69
+ order: { collectedAt: 'DESC' }
70
+ });
71
+ return sample === null || sample === void 0 ? void 0 : sample.collectedAt;
72
+ }
73
+ async nextSchedule(dataSet) {
74
+ const { timezone, schedule } = dataSet;
75
+ if (!schedule) {
76
+ return;
77
+ }
78
+ var interval = parser.parseExpression(schedule, {
79
+ tz: timezone
80
+ });
81
+ return interval.next().toDate();
82
+ }
83
+ async prevSchedule(dataSet) {
84
+ const { timezone, schedule } = dataSet;
85
+ if (!schedule) {
86
+ return;
87
+ }
88
+ var interval = parser.parseExpression(schedule, {
89
+ tz: timezone
90
+ });
91
+ return interval.prev().toDate();
92
+ }
56
93
  };
57
94
  __decorate([
58
95
  (0, type_graphql_1.Directive)('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)'),
@@ -72,6 +109,14 @@ __decorate([
72
109
  __metadata("design:paramtypes", [typeof (_a = typeof shell_1.ListParam !== "undefined" && shell_1.ListParam) === "function" ? _a : Object, Object]),
73
110
  __metadata("design:returntype", Promise)
74
111
  ], DataSetQuery.prototype, "dataSets", null);
112
+ __decorate([
113
+ (0, type_graphql_1.Query)(returns => data_set_type_1.DataSetList, { description: 'To fetch multiple DataSets for data entry manually' }),
114
+ __param(0, (0, type_graphql_1.Args)()),
115
+ __param(1, (0, type_graphql_1.Ctx)()),
116
+ __metadata("design:type", Function),
117
+ __metadata("design:paramtypes", [typeof (_b = typeof shell_1.ListParam !== "undefined" && shell_1.ListParam) === "function" ? _b : Object, Object]),
118
+ __metadata("design:returntype", Promise)
119
+ ], DataSetQuery.prototype, "dataSetsForEntry", null);
75
120
  __decorate([
76
121
  (0, type_graphql_1.FieldResolver)(type => [data_item_1.DataItem]),
77
122
  __param(0, (0, type_graphql_1.Root)()),
@@ -107,6 +152,27 @@ __decorate([
107
152
  __metadata("design:paramtypes", [data_set_1.DataSet]),
108
153
  __metadata("design:returntype", Promise)
109
154
  ], DataSetQuery.prototype, "creator", null);
155
+ __decorate([
156
+ (0, type_graphql_1.FieldResolver)(type => Date, { nullable: true }),
157
+ __param(0, (0, type_graphql_1.Root)()),
158
+ __metadata("design:type", Function),
159
+ __metadata("design:paramtypes", [data_set_1.DataSet]),
160
+ __metadata("design:returntype", Promise)
161
+ ], DataSetQuery.prototype, "latestCollectedAt", null);
162
+ __decorate([
163
+ (0, type_graphql_1.FieldResolver)(type => Date, { nullable: true }),
164
+ __param(0, (0, type_graphql_1.Root)()),
165
+ __metadata("design:type", Function),
166
+ __metadata("design:paramtypes", [data_set_1.DataSet]),
167
+ __metadata("design:returntype", Promise)
168
+ ], DataSetQuery.prototype, "nextSchedule", null);
169
+ __decorate([
170
+ (0, type_graphql_1.FieldResolver)(type => Date, { nullable: true }),
171
+ __param(0, (0, type_graphql_1.Root)()),
172
+ __metadata("design:type", Function),
173
+ __metadata("design:paramtypes", [data_set_1.DataSet]),
174
+ __metadata("design:returntype", Promise)
175
+ ], DataSetQuery.prototype, "prevSchedule", null);
110
176
  DataSetQuery = __decorate([
111
177
  (0, type_graphql_1.Resolver)(data_set_1.DataSet)
112
178
  ], DataSetQuery);
@@ -1 +1 @@
1
- {"version":3,"file":"data-set-query.js","sourceRoot":"","sources":["../../../server/service/data-set/data-set-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-set-query.js","sourceRoot":"","sources":["../../../server/service/data-set/data-set-query.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/dataset",
3
- "version": "5.0.0-alpha.25",
3
+ "version": "5.0.0-alpha.28",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "client/index.js",
6
6
  "things-factory": true,
@@ -24,20 +24,21 @@
24
24
  "migration:create": "node ../../node_modules/typeorm/cli.js migration:create -d ./server/migrations"
25
25
  },
26
26
  "dependencies": {
27
- "@operato/app": "1.0.0-alpha.47",
28
- "@operato/data-grist": "1.0.0-alpha.47",
29
- "@operato/dataset": "1.0.0-alpha.47",
30
- "@operato/graphql": "1.0.0-alpha.47",
31
- "@operato/i18n": "1.0.0-alpha.47",
32
- "@operato/layout": "1.0.0-alpha.47",
33
- "@operato/shell": "1.0.0-alpha.47",
34
- "@operato/styles": "1.0.0-alpha.47",
35
- "@operato/utils": "1.0.0-alpha.47",
36
- "@things-factory/auth-base": "^5.0.0-alpha.25",
37
- "@things-factory/env": "^5.0.0-alpha.25",
38
- "@things-factory/shell": "^5.0.0-alpha.25",
39
- "@things-factory/work-shift": "^5.0.0-alpha.25",
40
- "moment": "^2.29.1"
27
+ "@operato/app": "1.0.0-alpha.51",
28
+ "@operato/data-grist": "1.0.0-alpha.51",
29
+ "@operato/dataset": "1.0.0-alpha.51",
30
+ "@operato/graphql": "1.0.0-alpha.51",
31
+ "@operato/i18n": "1.0.0-alpha.51",
32
+ "@operato/layout": "1.0.0-alpha.51",
33
+ "@operato/shell": "1.0.0-alpha.51",
34
+ "@operato/styles": "1.0.0-alpha.51",
35
+ "@operato/utils": "1.0.0-alpha.51",
36
+ "@things-factory/auth-base": "^5.0.0-alpha.28",
37
+ "@things-factory/env": "^5.0.0-alpha.28",
38
+ "@things-factory/shell": "^5.0.0-alpha.28",
39
+ "@things-factory/work-shift": "^5.0.0-alpha.28",
40
+ "cron-parser": "^4.3.0",
41
+ "moment-timezone": "^0.5.34"
41
42
  },
42
- "gitHead": "d4307f6a23ea8be3555a06f17182558b2b00c74d"
43
+ "gitHead": "9adb6cdfd07c7730800f84a2d532d96f0f436288"
43
44
  }
@@ -1,15 +1,17 @@
1
- import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
1
+ import moment from 'moment-timezone'
2
+ import { EntityManager } from 'typeorm'
3
+
4
+ import { User } from '@things-factory/auth-base'
2
5
  import { Domain, getRedirectSubdomainPath, pubsub } from '@things-factory/shell'
3
6
 
4
7
  import { DataItem } from '../service/data-item/data-item'
8
+ import { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'
5
9
  import { DataSample } from '../service/data-sample/data-sample'
10
+ import { NewDataSample } from '../service/data-sample/data-sample-type'
6
11
  import { DataSet } from '../service/data-set/data-set'
7
12
  import { DataUseCase } from './data-use-case'
8
- import { EntityManager } from 'typeorm'
9
- import { NewDataSample } from '../service/data-sample/data-sample-type'
10
- import { User } from '@things-factory/auth-base'
11
13
  import { getWorkDateAndShift } from '@things-factory/work-shift'
12
- import moment from 'moment'
14
+
13
15
 
14
16
  const debug = require('debug')('things-factory:dataset:controller/save-data-sample')
15
17
 
@@ -74,13 +76,21 @@ export async function createDataSample(
74
76
  }, {})
75
77
 
76
78
  const collectedAt = dataSample.collectedAt || new Date()
77
- const momentUtc = moment(collectedAt).utc()
79
+ // workDate ex) 2022-04-04
80
+ const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt)
81
+
82
+ const dateFormat = 'YYYY-MM-DD'
83
+ // local time
84
+ const timezone = 'Asia/Seoul'
85
+
86
+ // const collectedAt = dataSample.collectedAt || new Date()
87
+ const localDateTz = moment(collectedAt).tz(timezone)
78
88
  const defaultPartitionKeys = {
79
89
  domain: domain.subdomain,
80
- datasetid: dataSample.dataSet.id /* It should not be 'data_set_id' as column name duplicated for Glue */,
81
- year: momentUtc.format('Y'),
82
- month: momentUtc.format('M'),
83
- day: momentUtc.format('D')
90
+ datasetid: dataSample.dataSet.id, /* It should not be 'data_set_id' as column name duplicated for Glue */
91
+ date: localDateTz.format(dateFormat), /* local time date */
92
+ workdate: workDate, /* working date */
93
+ workshift: workShift
84
94
  }
85
95
 
86
96
  var partitionKeys = {
@@ -88,14 +98,12 @@ export async function createDataSample(
88
98
  ...dataSet.partitionKeys
89
99
  }
90
100
 
91
- partitionKeys = formatDate(partitionKeys, momentUtc)
101
+ partitionKeys = formatDate(partitionKeys, localDateTz)
92
102
  partitionKeys = replaceVariables(partitionKeys, {
93
103
  ...dataSample.data
94
104
  })
95
105
 
96
106
  const { ooc, oos } = DataUseCase.evaluate(dataSet, dataItems, dataSample.data) || {}
97
- const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt)
98
-
99
107
  const result = await tx.getRepository(DataSample).save({
100
108
  name: dataSet.name,
101
109
  description: dataSet.description,
@@ -7,6 +7,9 @@ import { convertListParams, Domain, ListParam } from '@things-factory/shell'
7
7
  import { DataItem } from '../data-item/data-item'
8
8
  import { DataSet } from './data-set'
9
9
  import { DataSetList } from './data-set-type'
10
+ import { DataSample } from '../data-sample/data-sample'
11
+
12
+ var parser = require('cron-parser')
10
13
 
11
14
  @Resolver(DataSet)
12
15
  export class DataSetQuery {
@@ -31,6 +34,18 @@ export class DataSetQuery {
31
34
  return { items, total }
32
35
  }
33
36
 
37
+ @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
38
+ async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
39
+ const { domain } = context.state
40
+
41
+ /* TODO. 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
42
+
43
+ const convertedParams = convertListParams(params, domain.id)
44
+ const [items, total] = await getRepository(DataSet).findAndCount(convertedParams)
45
+
46
+ return { items, total }
47
+ }
48
+
34
49
  @FieldResolver(type => [DataItem])
35
50
  async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
36
51
  return await getRepository(DataItem).find({
@@ -59,4 +74,45 @@ export class DataSetQuery {
59
74
  async creator(@Root() dataSet: DataSet): Promise<User> {
60
75
  return await getRepository(User).findOne(dataSet.creatorId)
61
76
  }
77
+
78
+ @FieldResolver(type => Date, { nullable: true })
79
+ async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
80
+ const sample = await getRepository(DataSample).findOne({
81
+ select: ['collectedAt'],
82
+ where: { dataSet },
83
+ order: { collectedAt: 'DESC' }
84
+ })
85
+
86
+ return sample?.collectedAt
87
+ }
88
+
89
+ @FieldResolver(type => Date, { nullable: true })
90
+ async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
91
+ const { timezone, schedule } = dataSet
92
+
93
+ if (!schedule) {
94
+ return
95
+ }
96
+
97
+ var interval = parser.parseExpression(schedule, {
98
+ tz: timezone
99
+ })
100
+
101
+ return interval.next().toDate()
102
+ }
103
+
104
+ @FieldResolver(type => Date, { nullable: true })
105
+ async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
106
+ const { timezone, schedule } = dataSet
107
+
108
+ if (!schedule) {
109
+ return
110
+ }
111
+
112
+ var interval = parser.parseExpression(schedule, {
113
+ tz: timezone
114
+ })
115
+
116
+ return interval.prev().toDate()
117
+ }
62
118
  }
@@ -5,20 +5,24 @@ export default {
5
5
  route,
6
6
  routes: [
7
7
  {
8
- tagname: 'data-set-page',
9
- page: 'data-set'
8
+ tagname: 'data-set-list-page',
9
+ page: 'data-set-list'
10
10
  },
11
11
  {
12
- tagname: 'data-sensor-page',
13
- page: 'data-sensor'
12
+ tagname: 'data-sensor-list-page',
13
+ page: 'data-sensor-list'
14
14
  },
15
15
  {
16
- tagname: 'data-sample-page',
17
- page: 'data-sample'
16
+ tagname: 'data-sample-list-page',
17
+ page: 'data-sample-list'
18
18
  },
19
19
  {
20
- tagname: 'data-ooc-page',
21
- page: 'data-ooc'
20
+ tagname: 'data-ooc-list-page',
21
+ page: 'data-ooc-list'
22
+ },
23
+ {
24
+ tagname: 'data-entry-list-page',
25
+ page: 'data-entry-list'
22
26
  }
23
27
  ],
24
28
  bootstrap
@@ -10,11 +10,14 @@
10
10
  "field.data-sample": "data sample",
11
11
  "field.data-set": "data set",
12
12
  "field.device-id": "device id",
13
+ "field.latest-collected-at": "latest collected at",
13
14
  "field.netmask": "network mask",
15
+ "field.next-schedule": "next schedule",
14
16
  "field.oos": "out of critical limit",
15
17
  "field.ooc": "out of control limit",
16
18
  "field.options": "options",
17
19
  "field.partition-keys": "partition keys",
20
+ "field.prev-schedule": "previous schedule",
18
21
  "field.quota": "sampling #",
19
22
  "field.raw-data": "raw data",
20
23
  "field.ref-by": "ref. by",
@@ -30,6 +33,7 @@
30
33
  "text.data sample created successfully": "a data sample created successfully",
31
34
  "text.data ooc updated successfully": "a data ooc updated successfully",
32
35
  "title.data-entry-form": "data entry form",
36
+ "title.data-entry list": "data entry list",
33
37
  "title.data-item list": "data item list",
34
38
  "title.data-ooc list": "data OOC list",
35
39
  "title.data-ooc view": "data OOC view",
@@ -37,4 +41,4 @@
37
41
  "title.data-sample view": "data sample view",
38
42
  "title.data-sensor list": "data sensor list",
39
43
  "title.data-set list": "data set list"
40
- }
44
+ }
@@ -10,11 +10,14 @@
10
10
  "field.data-sample": "데이타 샘플",
11
11
  "field.data-set": "데이타셋",
12
12
  "field.device-id": "디바이스 아이디",
13
+ "field.latest-collected-at": "최근 수집 시간",
13
14
  "field.netmask": "네트워크마스크",
15
+ "field.next-schedule": "다음 수집계획",
14
16
  "field.oos": "허용한계 이탈여부",
15
17
  "field.ooc": "관리한계 이탈여부",
16
18
  "field.options": "선택옵션",
17
19
  "field.partition-keys": "파티션 키",
20
+ "field.prev-schedule": "이전 수집계획",
18
21
  "field.quota": "샘플수",
19
22
  "field.raw-data": "데이타 원본",
20
23
  "field.ref-by": "참조아이템",
@@ -37,4 +40,4 @@
37
40
  "title.data-sample view": "데이타 샘플 상세",
38
41
  "title.data-sensor list": "데이타 센서 조회",
39
42
  "title.data-set list": "데이타 셋 조회"
40
- }
43
+ }
@@ -10,11 +10,14 @@
10
10
  "field.data-sample": "data sample",
11
11
  "field.data-set": "data set",
12
12
  "field.device-id": "device id",
13
+ "field.latest-collected-at": "latest collected at",
13
14
  "field.netmask": "network mask",
15
+ "field.next-schedule": "next schedule",
14
16
  "field.oos": "out of critical limit",
15
17
  "field.ooc": "out of control limit",
16
18
  "field.options": "options",
17
19
  "field.partition-keys": "partition keys",
20
+ "field.prev-schedule": "previous schedule",
18
21
  "field.quota": "sampling #",
19
22
  "field.raw-data": "raw data",
20
23
  "field.ref-by": "ref. by",
@@ -37,4 +40,4 @@
37
40
  "title.data-sample view": "data sample view",
38
41
  "title.data-sensor list": "data sensor list",
39
42
  "title.data-set list": "data set list"
40
- }
43
+ }
@@ -10,11 +10,14 @@
10
10
  "field.data-sample": "data sample",
11
11
  "field.data-set": "data set",
12
12
  "field.device-id": "device id",
13
+ "field.latest-collected-at": "latest collected at",
13
14
  "field.netmask": "network mask",
15
+ "field.next-schedule": "next schedule",
14
16
  "field.oos": "out of critical limit",
15
17
  "field.ooc": "out of control limit",
16
18
  "field.options": "options",
17
19
  "field.partition-keys": "partition keys",
20
+ "field.prev-schedule": "previous schedule",
18
21
  "field.quota": "sampling #",
19
22
  "field.raw-data": "raw data",
20
23
  "field.ref-by": "ref. by",
@@ -37,4 +40,4 @@
37
40
  "title.data-sample view": "data sample view",
38
41
  "title.data-sensor list": "data sensor list",
39
42
  "title.data-set list": "data set list"
40
- }
43
+ }