@things-factory/dataset 5.0.0-alpha.34 → 5.0.0-alpha.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/client/bootstrap.js +5 -2
  2. package/client/pages/data-entry/data-entry-form.js +7 -5
  3. package/client/pages/data-entry/data-entry-list-page.js +2 -2
  4. package/client/pages/data-ooc/data-ooc-list-page.js +1 -1
  5. package/client/pages/data-report/data-report-list-page.js +4 -3
  6. package/client/pages/data-sample/data-sample-list-page.js +1 -1
  7. package/client/pages/data-sensor/data-sensor-list-page.js +7 -7
  8. package/client/pages/data-set/data-set-list-page.js +12 -11
  9. package/dist-server/controllers/create-data-sample.js +4 -4
  10. package/dist-server/controllers/create-data-sample.js.map +1 -1
  11. package/dist-server/service/data-item/data-item-query.js +7 -2
  12. package/dist-server/service/data-item/data-item-query.js.map +1 -1
  13. package/dist-server/service/data-ooc/data-ooc-query.js +7 -2
  14. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  15. package/dist-server/service/data-sample/data-sample-query.js +7 -2
  16. package/dist-server/service/data-sample/data-sample-query.js.map +1 -1
  17. package/dist-server/service/data-sensor/data-sensor-query.js +7 -2
  18. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  19. package/dist-server/service/data-set/data-set-query.js +41 -24
  20. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  21. package/dist-server/service/data-set/data-set-type.js +4 -0
  22. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  23. package/package.json +16 -16
  24. package/server/controllers/create-data-sample.ts +7 -5
  25. package/server/service/data-item/data-item-query.ts +9 -3
  26. package/server/service/data-ooc/data-ooc-query.ts +9 -3
  27. package/server/service/data-sample/data-sample-query.ts +9 -3
  28. package/server/service/data-sensor/data-sensor-query.ts +9 -3
  29. package/server/service/data-set/data-set-query.ts +48 -28
  30. package/server/service/data-set/data-set-type.ts +3 -0
  31. package/translations/en.json +8 -0
  32. package/translations/ko.json +8 -0
  33. package/translations/ms.json +8 -0
  34. package/translations/zh.json +8 -0
  35. package/yarn-error.log +0 -23244
@@ -77,19 +77,21 @@ export async function createDataSample(
77
77
  }, {})
78
78
 
79
79
  const collectedAt = dataSample.collectedAt || new Date()
80
- // workDate ex) 2022-04-04
81
- const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt)
82
80
 
83
- const dateFormat = 'YYYY-MM-DD'
81
+ const timezone = dataSet.timezone || domain.timezone || 'UTC'
82
+ const format = 'YYYY-MM-DD'
83
+
84
+ // workDate ex) 2022-04-04
85
+ const { workDate, workShift } = await getWorkDateAndShift(domain, collectedAt, { timezone, format })
86
+
84
87
  // local time dataSet timezone or domain timezone or default 'UTC'
85
- const timezone = dataSet['timezone'] || domain['timezone'] || 'UTC'
86
88
 
87
89
  // const collectedAt = dataSample.collectedAt || new Date()
88
90
  const localDateTz = moment(collectedAt).tz(timezone)
89
91
  const defaultPartitionKeys = {
90
92
  domain: domain.subdomain,
91
93
  datasetid: dataSample.dataSet.id, /* It should not be 'data_set_id' as column name duplicated for Glue */
92
- date: localDateTz.format(dateFormat), /* local time date */
94
+ date: localDateTz.format(format), /* local time date */
93
95
  workdate: workDate, /* working date */
94
96
  workshift: workShift
95
97
  }
@@ -2,7 +2,7 @@ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
5
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
7
  import { DataSet } from '../data-set/data-set'
8
8
  import { DataItem } from './data-item'
@@ -25,8 +25,14 @@ export class DataItemQuery {
25
25
  async dataItems(@Args() params: ListParam, @Ctx() context: any): Promise<DataItemList> {
26
26
  const { domain } = context.state
27
27
 
28
- const convertedParams = convertListParams(params, domain.id)
29
- const [items, total] = await getRepository(DataItem).findAndCount(convertedParams)
28
+ const queryBuilder = getQueryBuilderFromListParams({
29
+ repository: getRepository(DataItem),
30
+ params,
31
+ domain,
32
+ alias: 'dataitem'
33
+ })
34
+
35
+ const [items, total] = await queryBuilder.getManyAndCount()
30
36
 
31
37
  return { items, total }
32
38
  }
@@ -2,7 +2,7 @@ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
5
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
7
  import { DataSample } from '../data-sample/data-sample'
8
8
  import { DataSet } from '../data-set/data-set'
@@ -26,8 +26,14 @@ export class DataOocQuery {
26
26
  async dataOocs(@Args() params: ListParam, @Ctx() context: any): Promise<DataOocList> {
27
27
  const { domain } = context.state
28
28
 
29
- const convertedParams = convertListParams(params, domain.id)
30
- const [items, total] = await getRepository(DataOoc).findAndCount(convertedParams)
29
+ const queryBuilder = getQueryBuilderFromListParams({
30
+ repository: getRepository(DataOoc),
31
+ params,
32
+ domain,
33
+ alias: 'dataooc'
34
+ })
35
+
36
+ const [items, total] = await queryBuilder.getManyAndCount()
31
37
 
32
38
  return { items, total }
33
39
  }
@@ -2,7 +2,7 @@ import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
5
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
7
  import { DataSet } from '../data-set/data-set'
8
8
  import { DataSample } from './data-sample'
@@ -25,8 +25,14 @@ export class DataSampleQuery {
25
25
  async dataSamples(@Args() params: ListParam, @Ctx() context: any): Promise<DataSampleList> {
26
26
  const { domain } = context.state
27
27
 
28
- const convertedParams = convertListParams(params, domain.id)
29
- const [items, total] = await getRepository(DataSample).findAndCount(convertedParams)
28
+ const queryBuilder = getQueryBuilderFromListParams({
29
+ repository: getRepository(DataSample),
30
+ params,
31
+ domain,
32
+ alias: 'datasample'
33
+ })
34
+
35
+ const [items, total] = await queryBuilder.getManyAndCount()
30
36
 
31
37
  return { items, total }
32
38
  }
@@ -2,7 +2,7 @@ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graph
2
2
  import { getRepository } from 'typeorm'
3
3
 
4
4
  import { Appliance, User } from '@things-factory/auth-base'
5
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
5
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
6
6
 
7
7
  import { DataSet } from '../data-set/data-set'
8
8
  import { DataSensor } from './data-sensor'
@@ -23,8 +23,14 @@ export class DataSensorQuery {
23
23
  async dataSensors(@Args() params: ListParam, @Ctx() context: any): Promise<DataSensorList> {
24
24
  const { domain } = context.state
25
25
 
26
- const convertedParams = convertListParams(params, domain.id)
27
- const [items, total] = await getRepository(DataSensor).findAndCount(convertedParams)
26
+ const queryBuilder = getQueryBuilderFromListParams({
27
+ repository: getRepository(DataSensor),
28
+ params,
29
+ domain,
30
+ alias: 'datasensor'
31
+ })
32
+
33
+ const [items, total] = await queryBuilder.getManyAndCount()
28
34
 
29
35
  return { items, total }
30
36
  }
@@ -1,9 +1,9 @@
1
1
  import { Arg, Args, Ctx, Directive, FieldResolver, Query, Resolver, Root } from 'type-graphql'
2
- import { Equal, getRepository } from 'typeorm'
2
+ import { getRepository } from 'typeorm'
3
3
 
4
4
  import { Role, User } from '@things-factory/auth-base'
5
5
  import { Board } from '@things-factory/board-service'
6
- import { convertListParams, Domain, ListParam } from '@things-factory/shell'
6
+ import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
7
7
 
8
8
  import { DataItem } from '../data-item/data-item'
9
9
  import { DataSample } from '../data-sample/data-sample'
@@ -29,47 +29,67 @@ export class DataSetQuery {
29
29
  async dataSets(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
30
30
  const { domain } = context.state
31
31
 
32
- const convertedParams = convertListParams(params, domain.id)
33
- const [items, total] = await getRepository(DataSet).findAndCount(convertedParams)
32
+ const queryBuilder = getQueryBuilderFromListParams({
33
+ repository: getRepository(DataSet),
34
+ params,
35
+ domain,
36
+ alias: 'dataset'
37
+ })
38
+
39
+ const [items, total] = await queryBuilder.getManyAndCount()
34
40
 
35
41
  return { items, total }
36
42
  }
37
43
 
38
44
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
39
45
  async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
40
- const { domain } = context.state
46
+ var { domain, user } = context.state
41
47
 
42
- /* TODO. 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
43
-
44
- const { where = {}, order, skip, take } = convertListParams(params, domain.id)
45
- where.active = Equal(true)
48
+ /* 조회한 사용자가 entry-role을 가진 data-set 리스트만 반환 */
49
+ user = await getRepository(User).findOne({
50
+ where: { id: user.id },
51
+ relations: ['roles']
52
+ })
53
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
46
54
 
47
- const [items, total] = await getRepository(DataSet).findAndCount({
48
- where,
49
- order,
50
- skip,
51
- take
55
+ const queryBuilder = getQueryBuilderFromListParams({
56
+ repository: getRepository(DataSet),
57
+ params,
58
+ domain,
59
+ alias: 'dataset'
52
60
  })
53
61
 
62
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
63
+ queryBuilder.andWhere(`dataset.entry_role_id IN (:...roles)`, { roles })
64
+
65
+ const [items, total] = await queryBuilder.getManyAndCount()
66
+
54
67
  return { items, total }
55
68
  }
56
69
 
57
70
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets to see data report' })
58
71
  async dataSetsForReport(@Args() params: ListParam, @Ctx() context: any): Promise<DataSetList> {
59
- const { domain } = context.state
60
-
61
- /* TODO. 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
72
+ var { domain, user } = context.state
62
73
 
63
- const { where = {}, order, skip, take } = convertListParams(params, domain.id)
64
- where.active = Equal(true)
74
+ /* 조회한 사용자가 supervisory 역할을 가진 data-set 리스트만 반환 */
75
+ user = await getRepository(User).findOne({
76
+ where: { id: user.id },
77
+ relations: ['roles']
78
+ })
79
+ const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
65
80
 
66
- const [items, total] = await getRepository(DataSet).findAndCount({
67
- where,
68
- order,
69
- skip,
70
- take
81
+ const queryBuilder = getQueryBuilderFromListParams({
82
+ repository: getRepository(DataSet),
83
+ params,
84
+ domain,
85
+ alias: 'dataset'
71
86
  })
72
87
 
88
+ queryBuilder.andWhere(`dataset.active = :active`, { active: true })
89
+ queryBuilder.andWhere(`dataset.supervisory_role_id IN (:...roles)`, { roles })
90
+
91
+ const [items, total] = await queryBuilder.getManyAndCount()
92
+
73
93
  return { items, total }
74
94
  }
75
95
 
@@ -136,14 +156,14 @@ export class DataSetQuery {
136
156
 
137
157
  @FieldResolver(type => Date, { nullable: true })
138
158
  async nextSchedule(@Root() dataSet: DataSet): Promise<Date> {
139
- const { timezone, schedule } = dataSet
159
+ const { domainId, schedule, timezone } = dataSet
140
160
 
141
161
  if (!schedule) {
142
162
  return
143
163
  }
144
164
 
145
165
  var interval = parser.parseExpression(schedule, {
146
- tz: timezone
166
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
147
167
  })
148
168
 
149
169
  return interval.next().toDate()
@@ -151,14 +171,14 @@ export class DataSetQuery {
151
171
 
152
172
  @FieldResolver(type => Date, { nullable: true })
153
173
  async prevSchedule(@Root() dataSet: DataSet): Promise<Date> {
154
- const { timezone, schedule } = dataSet
174
+ const { domainId, schedule, timezone } = dataSet
155
175
 
156
176
  if (!schedule) {
157
177
  return
158
178
  }
159
179
 
160
180
  var interval = parser.parseExpression(schedule, {
161
- tz: timezone
181
+ tz: timezone || ((await getRepository(Domain).findOne(domainId)) as Domain).timezone || 'UTC'
162
182
  })
163
183
 
164
184
  return interval.prev().toDate()
@@ -75,6 +75,9 @@ export class DataSetPatch {
75
75
  @Field({ nullable: true })
76
76
  active?: boolean
77
77
 
78
+ @Field({ nullable: true })
79
+ type?: 'manual' | 'automatic' | string
80
+
78
81
  @Field({ nullable: true })
79
82
  useCase?: string
80
83
 
@@ -38,8 +38,16 @@
38
38
  "field.use-case": "use case",
39
39
  "field.work-date": "work date",
40
40
  "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
41
48
  "text.data sample created successfully": "a data sample created successfully",
42
49
  "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
43
51
  "title.data-entry-form": "data entry form",
44
52
  "title.data-entry list": "data entry list",
45
53
  "title.data-item list": "data item list",
@@ -38,8 +38,16 @@
38
38
  "field.use-case": "사용 사례",
39
39
  "field.work-date": "작업기준일",
40
40
  "field.work-shift": "교대근무조",
41
+ "label.acceptables": "허용값",
42
+ "label.critical limits": "허용 한계범위",
43
+ "label.minimum value": "최소값",
44
+ "label.maximum value": "최대값",
45
+ "label.pass limits": "통과 허용범위",
46
+ "label.target limits": "관리 목표범위",
47
+ "text.automatically collected": "자동 수집",
41
48
  "text.data sample created successfully": "데이타 샘플이 성공적으로 생성되었습니다",
42
49
  "text.data ooc updated successfully": "이탈데이타 내용이 수정되었습니다",
50
+ "text.manually collected": "수동 수집",
43
51
  "title.data-entry-form": "데이타 입력",
44
52
  "title.data-item list": "데이타 아이템 조회",
45
53
  "title.data-monitor-view": "데이타 모니터",
@@ -38,8 +38,16 @@
38
38
  "field.use-case": "use case",
39
39
  "field.work-date": "work date",
40
40
  "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
41
48
  "text.data sample created successfully": "a data sample created successfully",
42
49
  "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
43
51
  "title.data-entry-form": "data entry form",
44
52
  "title.data-item list": "data item list",
45
53
  "title.data-monitor-view": "data monitor view",
@@ -38,8 +38,16 @@
38
38
  "field.use-case": "use case",
39
39
  "field.work-date": "work date",
40
40
  "field.work-shift": "work shift",
41
+ "label.acceptables": "acceptables",
42
+ "label.critical limits": "critical limits",
43
+ "label.minimum value": "minimum value",
44
+ "label.maximum value": "maximum value",
45
+ "label.pass limits": "pass limits",
46
+ "label.target limits": "target limits",
47
+ "text.automatically collected": "automatically collected",
41
48
  "text.data sample created successfully": "a data sample created successfully",
42
49
  "text.data ooc updated successfully": "a data ooc updated successfully",
50
+ "text.manually collected": "manually collected",
43
51
  "title.data-entry-form": "data entry form",
44
52
  "title.data-item list": "data item list",
45
53
  "title.data-monitor-view": "data monitor view",