@things-factory/dataset 6.2.118 → 6.2.120

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 (68) hide show
  1. package/client/pages/data-ooc/data-ooc-list-page.ts +22 -5
  2. package/client/pages/data-sample/data-sample-list-page.ts +23 -6
  3. package/client/pages/data-sensor/data-sensor-list-page.ts +28 -6
  4. package/dist-client/pages/data-ooc/data-ooc-list-page.js +22 -5
  5. package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -1
  6. package/dist-client/pages/data-sample/data-sample-list-page.js +23 -6
  7. package/dist-client/pages/data-sample/data-sample-list-page.js.map +1 -1
  8. package/dist-client/pages/data-sensor/data-sensor-list-page.js +28 -6
  9. package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -1
  10. package/dist-client/tsconfig.tsbuildinfo +1 -1
  11. package/dist-server/activities/activity-data-collect.js.map +1 -1
  12. package/dist-server/activities/activity-ooc-review.js +1 -1
  13. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  14. package/dist-server/controllers/issue-collect-data.js +55 -0
  15. package/dist-server/controllers/issue-collect-data.js.map +1 -0
  16. package/dist-server/engine/index.js +4 -0
  17. package/dist-server/engine/index.js.map +1 -0
  18. package/dist-server/engine/task/create-data-sample.js +80 -0
  19. package/dist-server/engine/task/create-data-sample.js.map +1 -0
  20. package/dist-server/engine/task/index.js +5 -0
  21. package/dist-server/engine/task/index.js.map +1 -0
  22. package/dist-server/engine/task/issue-collect-data.js +40 -0
  23. package/dist-server/engine/task/issue-collect-data.js.map +1 -0
  24. package/dist-server/index.js +1 -0
  25. package/dist-server/index.js.map +1 -1
  26. package/dist-server/routes.js +36 -65
  27. package/dist-server/routes.js.map +1 -1
  28. package/dist-server/service/data-sample/data-sample.js +2 -1
  29. package/dist-server/service/data-sample/data-sample.js.map +1 -1
  30. package/dist-server/service/data-sensor/data-sensor-query.js +16 -1
  31. package/dist-server/service/data-sensor/data-sensor-query.js.map +1 -1
  32. package/dist-server/service/data-sensor/data-sensor-type.js +8 -0
  33. package/dist-server/service/data-sensor/data-sensor-type.js.map +1 -1
  34. package/dist-server/service/data-sensor/data-sensor.js +15 -1
  35. package/dist-server/service/data-sensor/data-sensor.js.map +1 -1
  36. package/dist-server/service/data-set/data-set-query.js +2 -2
  37. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  38. package/dist-server/tsconfig.tsbuildinfo +1 -1
  39. package/helps/dataset/task/create-data-sample.ja.md +28 -0
  40. package/helps/dataset/task/create-data-sample.ko.md +28 -0
  41. package/helps/dataset/task/create-data-sample.md +28 -0
  42. package/helps/dataset/task/create-data-sample.ms.md +30 -0
  43. package/helps/dataset/task/create-data-sample.zh.md +28 -0
  44. package/helps/dataset/task/issue-collect-data.ja.md +35 -0
  45. package/helps/dataset/task/issue-collect-data.ko.md +32 -0
  46. package/helps/dataset/task/issue-collect-data.md +32 -0
  47. package/helps/dataset/task/issue-collect-data.ms.md +34 -0
  48. package/helps/dataset/task/issue-collect-data.zh.md +32 -0
  49. package/package.json +11 -11
  50. package/server/activities/activity-data-collect.ts +3 -11
  51. package/server/activities/activity-ooc-review.ts +1 -1
  52. package/server/controllers/issue-collect-data.ts +61 -0
  53. package/server/engine/index.ts +1 -0
  54. package/server/engine/task/create-data-sample.ts +92 -0
  55. package/server/engine/task/index.ts +2 -0
  56. package/server/engine/task/issue-collect-data.ts +45 -0
  57. package/server/index.ts +1 -0
  58. package/server/routes.ts +47 -76
  59. package/server/service/data-sample/data-sample.ts +3 -2
  60. package/server/service/data-sensor/data-sensor-query.ts +13 -1
  61. package/server/service/data-sensor/data-sensor-type.ts +6 -0
  62. package/server/service/data-sensor/data-sensor.ts +13 -11
  63. package/server/service/data-set/data-set-query.ts +7 -7
  64. package/translations/en.json +6 -0
  65. package/translations/ja.json +6 -0
  66. package/translations/ko.json +6 -0
  67. package/translations/ms.json +6 -0
  68. package/translations/zh.json +6 -0
package/server/routes.ts CHANGED
@@ -2,13 +2,13 @@ import { In } from 'typeorm'
2
2
 
3
3
  import { Domain, getDataSource } from '@things-factory/shell'
4
4
  import { User } from '@things-factory/auth-base'
5
- import { Activity } from '@things-factory/worklist'
6
- import { issue } from '@things-factory/worklist/dist-server/controllers/activity-instance/issue'
5
+ import { runScenario } from '@things-factory/integration-base'
7
6
  import { ScheduleRegisterRequest } from '@things-factory/scheduler-client'
8
7
 
9
8
  import { createDataSample } from './controllers/create-data-sample'
10
9
  import { renderJasperReport } from './controllers/jasper-report'
11
10
  import { renderShinyReport } from './controllers/shiny-report'
11
+ import { issueCollectData } from './controllers/issue-collect-data'
12
12
  import { DataSensor } from './service/data-sensor/data-sensor'
13
13
  import { DataSet } from './service/data-set/data-set'
14
14
 
@@ -23,8 +23,8 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
23
23
  globalPublicRouter.post('/sensor-data', async (context, next) => {
24
24
  // 데이타 검증
25
25
  const { deviceId, data, rawData, timestamp = Date.now() } = context.request.body
26
- if (!deviceId || !data) {
27
- throw new Error(`deviceId(${deviceId}) and data(${JSON.stringify(data)}) properties are mandatory`)
26
+ if (!deviceId) {
27
+ throw new Error(`The deviceId(${deviceId}) property are mandatory`)
28
28
  }
29
29
 
30
30
  // make new data-sample
@@ -32,7 +32,7 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
32
32
  // find sensor through deviceId
33
33
  const sensor = await tx.getRepository(DataSensor).findOne({
34
34
  where: { deviceId },
35
- relations: ['domain', 'appliance', 'dataSet']
35
+ relations: ['domain', 'appliance', 'dataSet', 'decoder']
36
36
  })
37
37
 
38
38
  if (!sensor) {
@@ -47,18 +47,18 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
47
47
  throw new Error(`Appliance of the sensor given deviceId(${deviceId}) is not set up`)
48
48
  }
49
49
 
50
- if (!sensor.dataSet) {
51
- throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`)
52
- }
50
+ // if (!sensor.dataSet) {
51
+ // throw new Error(`DataSet of the sensor given deviceId(${deviceId}) is not set up`)
52
+ // }
53
53
 
54
54
  const domain = sensor.domain
55
55
  const dataSet = sensor.dataSet
56
- const user: User = await tx.getRepository(User).findOne({
57
- where: {
58
- reference: sensor.appliance.id,
59
- userType: 'appliance'
60
- }
61
- })
56
+ // const user: User = await tx.getRepository(User).findOne({
57
+ // where: {
58
+ // reference: sensor.appliance.id,
59
+ // userType: 'appliance'
60
+ // }
61
+ // })
62
62
 
63
63
  context.state = {
64
64
  ...context.state,
@@ -66,19 +66,40 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
66
66
  tx
67
67
  }
68
68
 
69
- return await createDataSample(
70
- {
71
- dataSet,
69
+ var decoded
70
+ if (sensor.decoder) {
71
+ const { name: scenarioName } = sensor.decoder
72
+ const variables = {
73
+ dataSensor: sensor,
74
+ source: deviceId,
72
75
  data,
73
76
  rawData,
74
- source: deviceId,
75
- collectedAt: new Date(timestamp)
76
- },
77
- context
78
- )
79
- })
77
+ timestamp
78
+ }
80
79
 
81
- context.status = 200
80
+ decoded = (await runScenario(null, scenarioName, variables, context))?.result
81
+ }
82
+
83
+ if (dataSet) {
84
+ await createDataSample(
85
+ {
86
+ dataSet,
87
+ data,
88
+ rawData,
89
+ source: deviceId,
90
+ collectedAt: new Date(timestamp),
91
+ ...decoded
92
+ },
93
+ context
94
+ )
95
+ }
96
+
97
+ context.status = 200
98
+ context.body = {
99
+ data,
100
+ ...decoded
101
+ }
102
+ })
82
103
  })
83
104
 
84
105
  /* When a callback occurs from the scheduler when a scheduled dataset is on schedule, data collection task for the dataset should be issued. */
@@ -95,55 +116,7 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
95
116
  throw new Error(`group(${domainId}) and key(${dataSetId}) properties should not be empty`)
96
117
  }
97
118
 
98
- await getDataSource().transaction(async tx => {
99
- const domain = await tx.getRepository(Domain).findOneBy({ id: domainId })
100
-
101
- if (!domain) {
102
- throw new Error(`domain(${domainId}) not found`)
103
- }
104
-
105
- const dataSet = await tx
106
- .getRepository(DataSet)
107
- .findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })
108
-
109
- const activity = (await tx.getRepository(Activity).findOneBy({
110
- domain: { id: domainId },
111
- name: 'Collect Data'
112
- })) as Activity
113
-
114
- if (activity) {
115
- const { assignees } = dataSet
116
-
117
- /* 해당 dataset에 대한 데이타 수집 태스크를 dataset assignees에게 할당한다. */
118
- if (assignees && assignees instanceof Array && assignees.length > 0) {
119
- const activityInstance = {
120
- name: `[Data 수집] ${dataSet.name}`,
121
- description: dataSet.description,
122
- activityId: activity.id,
123
- dueAt: new Date(Date.now() + 24 * 60 * 60 * 1000),
124
- input: {
125
- dataSetId: dataSet.id,
126
- dataSetName: dataSet.name
127
- },
128
- assignees
129
- }
130
-
131
- context.state = {
132
- ...context.state,
133
- domain,
134
- tx
135
- }
136
-
137
- await issue(activityInstance, context)
138
- } else {
139
- throw new Error(
140
- `Assignees not set. So Data Collect Activity for ${dataSet.name}($dataSet.id) could not be issued.`
141
- )
142
- }
143
- } else {
144
- throw new Error(`Data Collect Activity is not installed.`)
145
- }
146
- })
119
+ await issueCollectData(domainId, dataSetId, context)
147
120
 
148
121
  context.status = 200
149
122
  })
@@ -169,9 +142,7 @@ process.on('bootstrap-module-global-public-route' as any, (app, globalPublicRout
169
142
  throw new Error(`domain(${domainId}) not found`)
170
143
  }
171
144
 
172
- const dataSet = await tx
173
- .getRepository(DataSet)
174
- .findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })
145
+ const dataSet = await tx.getRepository(DataSet).findOne({ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id: dataSetId } })
175
146
 
176
147
  // do what you gotta do
177
148
  })
@@ -3,7 +3,7 @@ import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, OneToOn
3
3
 
4
4
  import { User } from '@things-factory/auth-base'
5
5
  import { config } from '@things-factory/env'
6
- import { Domain, ScalarObject } from '@things-factory/shell'
6
+ import { Domain, ScalarObject, json5Transformer } from '@things-factory/shell'
7
7
  import { ActivityInstance } from '@things-factory/worklist'
8
8
 
9
9
  import { DataItem } from '../data-set/data-item-type'
@@ -74,7 +74,8 @@ export class DataSample {
74
74
 
75
75
  @Column({
76
76
  nullable: true,
77
- type: DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? 'longtext' : DATABASE_TYPE == 'oracle' ? 'clob' : 'varchar'
77
+ type: DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb' ? 'longtext' : DATABASE_TYPE == 'oracle' ? 'clob' : 'varchar',
78
+ transformer: json5Transformer
78
79
  })
79
80
  @Field({ nullable: true })
80
81
  rawData?: string
@@ -2,6 +2,7 @@ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graph
2
2
 
3
3
  import { Appliance, User } from '@things-factory/auth-base'
4
4
  import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
5
+ import { Scenario } from '@things-factory/integration-base'
5
6
 
6
7
  import { DataSet } from '../data-set/data-set'
7
8
  import { DataSensor } from './data-sensor'
@@ -39,11 +40,22 @@ export class DataSensorQuery {
39
40
  return dataSensor.applianceId && (await getRepository(Appliance).findOneBy({ id: dataSensor.applianceId }))
40
41
  }
41
42
 
42
- @FieldResolver(type => Appliance)
43
+ @FieldResolver(type => DataSet)
43
44
  async dataSet(@Root() dataSensor: DataSensor): Promise<DataSet> {
44
45
  return dataSensor.dataSetId && (await getRepository(DataSet).findOneBy({ id: dataSensor.dataSetId }))
45
46
  }
46
47
 
48
+ @FieldResolver(type => Scenario)
49
+ async decoder(@Root() dataSensor: DataSensor): Promise<Scenario> {
50
+ return (
51
+ dataSensor.decoder ||
52
+ (dataSensor.decoderId &&
53
+ (await getRepository(Scenario).findOneBy({
54
+ id: dataSensor.decoderId
55
+ })))
56
+ )
57
+ }
58
+
47
59
  @FieldResolver(type => Domain)
48
60
  async domain(@Root() dataSensor: DataSensor): Promise<Domain> {
49
61
  return dataSensor.domainId && (await getRepository(Domain).findOneBy({ id: dataSensor.domainId }))
@@ -41,6 +41,9 @@ export class NewDataSensor {
41
41
 
42
42
  @Field(type => ObjectRef, { nullable: true })
43
43
  dataSet?: ObjectRef
44
+
45
+ @Field(type => ObjectRef, { nullable: true })
46
+ decoder?: ObjectRef
44
47
  }
45
48
 
46
49
  @InputType()
@@ -84,6 +87,9 @@ export class DataSensorPatch {
84
87
  @Field(type => ObjectRef, { nullable: true })
85
88
  dataSet?: ObjectRef
86
89
 
90
+ @Field(type => ObjectRef, { nullable: true })
91
+ decoder?: ObjectRef
92
+
87
93
  @Field()
88
94
  cuFlag: string
89
95
  }
@@ -1,17 +1,9 @@
1
1
  import { Field, ID, ObjectType } from 'type-graphql'
2
- import {
3
- Column,
4
- CreateDateColumn,
5
- Entity,
6
- Index,
7
- ManyToOne,
8
- PrimaryGeneratedColumn,
9
- RelationId,
10
- UpdateDateColumn
11
- } from 'typeorm'
2
+ import { Column, CreateDateColumn, Entity, Index, ManyToOne, PrimaryGeneratedColumn, RelationId, UpdateDateColumn } from 'typeorm'
12
3
 
13
- import { Appliance, User } from '@things-factory/auth-base'
14
4
  import { Domain } from '@things-factory/shell'
5
+ import { Appliance, User } from '@things-factory/auth-base'
6
+ import { Scenario } from '@things-factory/integration-base'
15
7
 
16
8
  import { DataSet } from '../data-set/data-set'
17
9
 
@@ -91,6 +83,16 @@ export class DataSensor {
91
83
  @RelationId((dataSensor: DataSensor) => dataSensor.dataSet)
92
84
  dataSetId?: string
93
85
 
86
+ @ManyToOne(type => Scenario, { nullable: true })
87
+ @Field(type => Scenario, {
88
+ nullable: true,
89
+ description: 'The decoder scenario that automatically executes based on the trigger of raw data collection'
90
+ })
91
+ decoder?: Scenario
92
+
93
+ @RelationId((dataSensor: DataSensor) => dataSensor.decoder)
94
+ decoderId?: string
95
+
94
96
  @CreateDateColumn()
95
97
  @Field({ nullable: true })
96
98
  createdAt?: Date
@@ -243,21 +243,21 @@ export class DataSetQuery {
243
243
  }
244
244
 
245
245
  @FieldResolver(type => Board, { nullable: true })
246
- async entryBoard(@Root() dataSet: DataSet) {
246
+ async entryBoard(@Root() dataSet: DataSet): Promise<Board> {
247
247
  if (dataSet.entryType == 'board' && dataSet.entryView) {
248
248
  return await getRepository(Board).findOneBy({ id: dataSet.entryView })
249
249
  }
250
250
  }
251
251
 
252
252
  @FieldResolver(type => Board, { nullable: true })
253
- async monitorBoard(@Root() dataSet: DataSet) {
253
+ async monitorBoard(@Root() dataSet: DataSet): Promise<Board> {
254
254
  if (dataSet.monitorType == 'board' && dataSet.monitorView) {
255
255
  return await getRepository(Board).findOneBy({ id: dataSet.monitorView })
256
256
  }
257
257
  }
258
258
 
259
259
  @FieldResolver(type => DataKeySet, { nullable: true })
260
- async dataKeySet(@Root() dataSet: DataSet) {
260
+ async dataKeySet(@Root() dataSet: DataSet): Promise<DataKeySet> {
261
261
  return (
262
262
  dataSet.dataKeySet ||
263
263
  (dataSet.dataKeySetId &&
@@ -267,8 +267,8 @@ export class DataSetQuery {
267
267
  )
268
268
  }
269
269
 
270
- @FieldResolver(type => Role)
271
- async normalScenario(@Root() dataSet: DataSet): Promise<Role> {
270
+ @FieldResolver(type => Scenario)
271
+ async normalScenario(@Root() dataSet: DataSet): Promise<Scenario> {
272
272
  return (
273
273
  dataSet.normalScenario ||
274
274
  (dataSet.normalScenarioId &&
@@ -278,8 +278,8 @@ export class DataSetQuery {
278
278
  )
279
279
  }
280
280
 
281
- @FieldResolver(type => Role)
282
- async outlierScenario(@Root() dataSet: DataSet): Promise<Role> {
281
+ @FieldResolver(type => Scenario)
282
+ async outlierScenario(@Root() dataSet: DataSet): Promise<Scenario> {
283
283
  return (
284
284
  dataSet.outlierScenario ||
285
285
  (dataSet.outlierScenarioId &&
@@ -27,6 +27,8 @@
27
27
  "field.data-sample": "data sample",
28
28
  "field.data-set": "data set",
29
29
  "field.date": "date",
30
+ "field.decoder": "decoder",
31
+ "field.decoder-scenario": "decoder scenario",
30
32
  "field.device-id": "device id",
31
33
  "field.download-url": "download url",
32
34
  "field.entry-role": "entry role",
@@ -85,6 +87,7 @@
85
87
  "label.corrective action": "corrective action",
86
88
  "label.corrective instruction": "corrective instruction",
87
89
  "label.critical-limits": "critical limits",
90
+ "label.data-set": "data set",
88
91
  "label.data-set-type": "type",
89
92
  "label.datasample review timeline": "data sample review timeline",
90
93
  "label.end-date": "end date",
@@ -99,11 +102,13 @@
99
102
  "label.period-this-month": "this month",
100
103
  "label.period-this-year": "this year",
101
104
  "label.period-today": "today",
105
+ "label.raw-data": "raw data",
102
106
  "label.start-date": "start date",
103
107
  "label.state-corrected": "corrected",
104
108
  "label.state-issued": "issued",
105
109
  "label.state-reviewed": "reviewed",
106
110
  "label.target-limits": "target limits",
111
+ "label.timestamp": "timestamp",
107
112
  "text.automatically collected": "automatically collected",
108
113
  "text.corrective action placeholder": "Please enter details for implementing corrective and preventive actions",
109
114
  "text.corrective instruction placeholder": "Please enter instructions for corrective and preventive actions",
@@ -145,6 +150,7 @@
145
150
  "title.edit duration": "edit duration",
146
151
  "title.edit hashtag": "edit hashtag",
147
152
  "title.edit json": "edit json",
153
+ "title.lookup scenario": "lookup scenario",
148
154
  "title.open data sample report page": "open data sample report page",
149
155
  "title.open data sample search page": "open data sample search page",
150
156
  "title.open data sample view": "open data sample view",
@@ -27,6 +27,8 @@
27
27
  "field.data-sample": "データ サンプル",
28
28
  "field.data-set": "データ セット",
29
29
  "field.date": "日時",
30
+ "field.decoder": "デコーダー",
31
+ "field.decoder-scenario": "デコーダーシナリオ",
30
32
  "field.device-id": "デバイスID",
31
33
  "field.download-url": "ダウンロード アドレス",
32
34
  "field.entry-role": "入力担当ロール",
@@ -85,6 +87,7 @@
85
87
  "label.corrective action": "是正措置",
86
88
  "label.corrective instruction": "是正指示",
87
89
  "label.critical-limits": "許容限界範囲",
90
+ "label.data-set": "データ セット",
88
91
  "label.data-set-type": "タイプ",
89
92
  "label.datasample review timeline": "データサンプルレビュータイムライン",
90
93
  "label.end-date": "終了日",
@@ -99,11 +102,13 @@
99
102
  "label.period-this-month": "今月",
100
103
  "label.period-this-year": "今年",
101
104
  "label.period-today": "今日",
105
+ "label.raw-data": "生データ",
102
106
  "label.start-date": "開始日",
103
107
  "label.state-corrected": "修正済",
104
108
  "label.state-issued": "発行済",
105
109
  "label.state-reviewed": "審査済",
106
110
  "label.target-limits": "管理目標範囲",
111
+ "label.timestamp": "タイムスタンプ",
107
112
  "text.automatically collected": "自動収集",
108
113
  "text.corrective action placeholder": "是正及び予防措置の実施事項を入力してください",
109
114
  "text.corrective instruction placeholder": "是正及び予防措置の指示事項を入力してください",
@@ -144,6 +149,7 @@
144
149
  "title.edit duration": "周期編集",
145
150
  "title.edit hashtag": "ハッシュタグ編集",
146
151
  "title.edit json": "JSON編集",
152
+ "title.lookup scenario": "ルックアップシナリオ",
147
153
  "title.open data sample report page": "データ サンプル レポート ページを開く",
148
154
  "title.open data sample search page": "データ サンプル検索ページを開く",
149
155
  "title.open data sample view": "データ サンプル ビューページを開く",
@@ -27,6 +27,8 @@
27
27
  "field.data-sample": "데이타 샘플",
28
28
  "field.data-set": "데이타셋",
29
29
  "field.date": "일자",
30
+ "field.decoder": "디코더",
31
+ "field.decoder-scenario": "디코더 시나리오",
30
32
  "field.device-id": "디바이스 아이디",
31
33
  "field.download-url": "다운로드 주소",
32
34
  "field.entry-role": "입력담당 역할",
@@ -85,6 +87,7 @@
85
87
  "label.corrective action": "수정 조치",
86
88
  "label.corrective instruction": "수정 지시",
87
89
  "label.critical-limits": "허용 한계범위",
90
+ "label.data-set": "데이타셋",
88
91
  "label.data-set-type": "유형",
89
92
  "label.datasample review timeline": "데이타샘플 리뷰 타임라인",
90
93
  "label.end-date": "종료일",
@@ -99,11 +102,13 @@
99
102
  "label.period-this-month": "이번달",
100
103
  "label.period-this-year": "올해",
101
104
  "label.period-today": "오늘",
105
+ "label.raw-data": "원시 데이타",
102
106
  "label.start-date": "시작일",
103
107
  "label.state-corrected": "조치완료",
104
108
  "label.state-issued": "발생",
105
109
  "label.state-reviewed": "검토완료",
106
110
  "label.target-limits": "관리 목표범위",
111
+ "label.timestamp": "타임스탬프",
107
112
  "text.automatically collected": "자동 수집",
108
113
  "text.corrective action placeholder": "시정 및 예방을 위한 조치 이행 사항을 입력해주세요",
109
114
  "text.corrective instruction placeholder": "시정 및 예방을 위한 조치 지시 사항을 입력해주세요",
@@ -144,6 +149,7 @@
144
149
  "title.edit duration": "주기 편집",
145
150
  "title.edit hashtag": "해시태그 편집",
146
151
  "title.edit json": "JSON 편집",
152
+ "title.lookup scenario": "시나리오 선택",
147
153
  "title.open data sample report page": "데이타 샘플 레포트 페이지 열기",
148
154
  "title.open data sample search page": "데이타 샘플 검색 페이지 열기",
149
155
  "title.open data sample view": "데이타 샘플 뷰페이지 열기",
@@ -27,6 +27,8 @@
27
27
  "field.data-sample": "sampel data",
28
28
  "field.data-set": "set data",
29
29
  "field.date": "tarikh",
30
+ "field.decoder": "Pengekod",
31
+ "field.decoder-scenario": "Skenario Pengekod",
30
32
  "field.device-id": "id peranti",
31
33
  "field.download-url": "url muat turun",
32
34
  "field.entry-role": "peranan masukan",
@@ -85,6 +87,7 @@
85
87
  "label.corrective action": "tindakan pembetulan",
86
88
  "label.corrective instruction": "instruksi pembetulan",
87
89
  "label.critical-limits": "had kritikal",
90
+ "label.data-set": "set data",
88
91
  "label.data-set-type": "jenis",
89
92
  "label.datasample review timeline": "garis masa ulasan sampel data",
90
93
  "label.end-date": "tarikh tamat",
@@ -99,11 +102,13 @@
99
102
  "label.period-this-month": "bulan ini",
100
103
  "label.period-this-year": "tahun ini",
101
104
  "label.period-today": "hari ini",
105
+ "label.raw-data": "data mentah",
102
106
  "label.start-date": "tarikh mula",
103
107
  "label.state-corrected": "diperbetulkan",
104
108
  "label.state-issued": "dikeluarkan",
105
109
  "label.state-reviewed": "disemak",
106
110
  "label.target-limits": "had sasaran",
111
+ "label.timestamp": "Cap waktu",
107
112
  "text.automatically collected": "dikumpulkan secara automatik",
108
113
  "text.corrective action placeholder": "Sila masukkan butiran pelaksanaan tindakan pembetulan dan pencegahan",
109
114
  "text.corrective instruction placeholder": "Sila masukkan arahan tindakan pembetulan dan pencegahan",
@@ -145,6 +150,7 @@
145
150
  "title.edit duration": "edit tempoh",
146
151
  "title.edit hashtag": "edit hashtag",
147
152
  "title.edit json": "edit json",
153
+ "title.lookup scenario": "skenario carian",
148
154
  "title.open data sample report page": "buka laman laporan sampel data",
149
155
  "title.open data sample search page": "buka laman pencarian sampel data",
150
156
  "title.open data sample view": "buka paparan sampel data",
@@ -27,6 +27,8 @@
27
27
  "field.data-sample": "数据样本",
28
28
  "field.data-set": "数据集",
29
29
  "field.date": "日期",
30
+ "field.decoder": "解码器",
31
+ "field.decoder-scenario": "解码器场景",
30
32
  "field.device-id": "设备ID",
31
33
  "field.download-url": "下载地址",
32
34
  "field.entry-role": "输入负责角色",
@@ -85,6 +87,7 @@
85
87
  "label.corrective action": "纠正措施",
86
88
  "label.corrective instruction": "纠正指示",
87
89
  "label.critical-limits": "临界限制",
90
+ "label.data-set": "数据集",
88
91
  "label.data-set-type": "类型",
89
92
  "label.datasample review timeline": "数据样本审查时间线",
90
93
  "label.end-date": "结束日期",
@@ -99,11 +102,13 @@
99
102
  "label.period-this-month": "本月",
100
103
  "label.period-this-year": "今年",
101
104
  "label.period-today": "今天",
105
+ "label.raw-data": "原始数据",
102
106
  "label.start-date": "开始日期",
103
107
  "label.state-corrected": "已处理",
104
108
  "label.state-issued": "发生",
105
109
  "label.state-reviewed": "审核完成",
106
110
  "label.target-limits": "管理目标范围",
111
+ "label.timestamp": "时间戳",
107
112
  "text.automatically collected": "自动收集",
108
113
  "text.corrective action placeholder": "请输入实施纠正和预防措施的事项",
109
114
  "text.corrective instruction placeholder": "请输入纠正和预防措施的指示事项",
@@ -144,6 +149,7 @@
144
149
  "title.edit duration": "周期编辑",
145
150
  "title.edit hashtag": "哈希标签编辑",
146
151
  "title.edit json": "JSON编辑",
152
+ "title.lookup scenario": "查找场景",
147
153
  "title.open data sample report page": "打开数据样本报告页面",
148
154
  "title.open data sample search page": "打开数据样本搜索页面",
149
155
  "title.open data sample view": "打开数据样本视图页面",