@things-factory/dataset 5.0.0-alpha.40 → 5.0.0-alpha.41
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/pages/data-ooc/data-ooc-list-page.js +43 -48
- package/client/pages/data-report/data-report-list-page.js +3 -3
- package/client/pages/data-report/jasper-report-oocs-page.js +115 -0
- package/client/pages/data-report/jasper-report-samples-page.js +115 -0
- package/client/pages/data-sample/data-sample-list-page.js +43 -48
- package/client/pages/data-sensor/data-sensor-list-page.js +37 -53
- package/client/pages/data-set/data-set-list-page.js +28 -43
- package/client/route.js +8 -0
- package/config/config.development.js +13 -0
- package/config/config.production.js +1 -0
- package/dist-server/controllers/jasper-report.js +129 -0
- package/dist-server/controllers/jasper-report.js.map +1 -0
- package/dist-server/routes.js +4 -0
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +27 -4
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +23 -0
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +13 -4
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +4 -0
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/package.json +17 -16
- package/server/controllers/jasper-report.ts +130 -0
- package/server/routes.ts +4 -0
- package/server/service/data-set/data-set-mutation.ts +41 -4
- package/server/service/data-set/data-set-query.ts +21 -0
- package/server/service/data-set/data-set-type.ts +7 -0
- package/server/service/data-set/data-set.ts +3 -0
- package/things-factory.config.js +8 -0
- package/translations/en.json +1 -0
- package/translations/ko.json +1 -0
@@ -155,6 +155,10 @@ __decorate([
|
|
155
155
|
(0, type_graphql_1.Field)({ nullable: true }),
|
156
156
|
__metadata("design:type", String)
|
157
157
|
], DataSet.prototype, "reportView", void 0);
|
158
|
+
__decorate([
|
159
|
+
(0, type_graphql_1.Field)({ nullable: true }),
|
160
|
+
__metadata("design:type", String)
|
161
|
+
], DataSet.prototype, "reportTemplate", void 0);
|
158
162
|
__decorate([
|
159
163
|
(0, typeorm_1.Column)({
|
160
164
|
nullable: true
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"data-set.js","sourceRoot":"","sources":["../../../server/service/data-set/data-set.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,+CAAsE;AACtE,qCAUgB;AAEhB,yDAAsD;AACtD,iDAA4D;AAE5D,sDAAiD;AAEjD,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,2CAAuB,CAAA;IACvB,mCAAe,CAAA;IACf,iCAAa,CAAA;IACb,4CAAwB,CAAA;AAC1B,CAAC,EALW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAK3B;AAED,IAAA,+BAAgB,EAAC,gBAAgB,EAAE;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,qCAAqC;CACnD,CAAC,CAAA;AAEF,IAAY,kBAKX;AALD,WAAY,kBAAkB;IAC5B,6CAAuB,CAAA;IACvB,qCAAe,CAAA;IACf,mCAAa,CAAA;IACb,8CAAwB,CAAA;AAC1B,CAAC,EALW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAK7B;AAED,IAAA,+BAAgB,EAAC,kBAAkB,EAAE;IACnC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,uCAAuC;CACrD,CAAC,CAAA;AAEF,IAAY,iBAKX;AALD,WAAY,iBAAiB;IAC3B,4CAAuB,CAAA;IACvB,oCAAe,CAAA;IACf,kCAAa,CAAA;IACb,6CAAwB,CAAA;AAC1B,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B;AAED,IAAA,+BAAgB,EAAC,iBAAiB,EAAE;IAClC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,sCAAsC;CACpD,CAAC,CAAA;AAKF,IAAa,OAAO,GAApB,MAAa,OAAO;
|
1
|
+
{"version":3,"file":"data-set.js","sourceRoot":"","sources":["../../../server/service/data-set/data-set.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.
|
3
|
+
"version": "5.0.0-alpha.41",
|
4
4
|
"main": "dist-server/index.js",
|
5
5
|
"browser": "client/index.js",
|
6
6
|
"things-factory": true,
|
@@ -24,22 +24,23 @@
|
|
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-beta.
|
28
|
-
"@operato/data-grist": "1.0.0-beta.
|
29
|
-
"@operato/dataset": "1.0.0-beta.
|
30
|
-
"@operato/graphql": "1.0.0-beta.
|
31
|
-
"@operato/i18n": "1.0.0-beta.
|
32
|
-
"@operato/layout": "1.0.0-beta.
|
33
|
-
"@operato/shell": "1.0.0-beta.
|
34
|
-
"@operato/styles": "1.0.0-beta.
|
35
|
-
"@operato/utils": "1.0.0-beta.
|
36
|
-
"@things-factory/auth-base": "^5.0.0-alpha.
|
37
|
-
"@things-factory/
|
38
|
-
"@things-factory/
|
39
|
-
"@things-factory/
|
40
|
-
"@things-factory/
|
27
|
+
"@operato/app": "1.0.0-beta.9",
|
28
|
+
"@operato/data-grist": "1.0.0-beta.9",
|
29
|
+
"@operato/dataset": "1.0.0-beta.9",
|
30
|
+
"@operato/graphql": "1.0.0-beta.9",
|
31
|
+
"@operato/i18n": "1.0.0-beta.9",
|
32
|
+
"@operato/layout": "1.0.0-beta.9",
|
33
|
+
"@operato/shell": "1.0.0-beta.9",
|
34
|
+
"@operato/styles": "1.0.0-beta.9",
|
35
|
+
"@operato/utils": "1.0.0-beta.9",
|
36
|
+
"@things-factory/auth-base": "^5.0.0-alpha.41",
|
37
|
+
"@things-factory/aws-base": "^5.0.0-alpha.41",
|
38
|
+
"@things-factory/board-service": "^5.0.0-alpha.41",
|
39
|
+
"@things-factory/env": "^5.0.0-alpha.41",
|
40
|
+
"@things-factory/shell": "^5.0.0-alpha.41",
|
41
|
+
"@things-factory/work-shift": "^5.0.0-alpha.41",
|
41
42
|
"cron-parser": "^4.3.0",
|
42
43
|
"moment-timezone": "^0.5.34"
|
43
44
|
},
|
44
|
-
"gitHead": "
|
45
|
+
"gitHead": "f9ba0b3b997862b3d01c5b25338ce221d71f4fd7"
|
45
46
|
}
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import FormData from 'form-data'
|
2
|
+
import fetch from 'node-fetch'
|
3
|
+
|
4
|
+
import { STORAGE } from '@things-factory/attachment-base'
|
5
|
+
import { AthenaController } from '@things-factory/aws-base'
|
6
|
+
import { config } from '@things-factory/env'
|
7
|
+
|
8
|
+
const dataReportConfig = config.get('dataReport')
|
9
|
+
const { jasper: { endpoint: { protocol, host, port }, datasource: { database } } } = dataReportConfig
|
10
|
+
|
11
|
+
/** author: ywnam123 */
|
12
|
+
function transformValuesToRows(queryResult) {
|
13
|
+
var parseData = []
|
14
|
+
let index = 1
|
15
|
+
for (let i = 0; i < queryResult.Items.length; i++) {
|
16
|
+
var j = 0
|
17
|
+
const data = JSON.parse(queryResult.Items[i].data)
|
18
|
+
const spec = JSON.parse(queryResult.Items[i].spec)
|
19
|
+
|
20
|
+
for (let key in data) {
|
21
|
+
if (Array.isArray(data[key])) {
|
22
|
+
for (j = 0; j < data[key].length; j++) {
|
23
|
+
for (let specKey in spec) {
|
24
|
+
if (key === specKey) {
|
25
|
+
parseData.push({
|
26
|
+
item: spec[specKey].name,
|
27
|
+
index: index + j,
|
28
|
+
value: String(data[key][j])
|
29
|
+
})
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
} else {
|
34
|
+
parseData.push({
|
35
|
+
item: key,
|
36
|
+
index,
|
37
|
+
value: String(data[key])
|
38
|
+
})
|
39
|
+
}
|
40
|
+
}
|
41
|
+
if (j !== 0) {
|
42
|
+
index = index + j
|
43
|
+
} else {
|
44
|
+
index = index + 1
|
45
|
+
}
|
46
|
+
}
|
47
|
+
}
|
48
|
+
|
49
|
+
/** @todo considering trasformation in lambda, as massive dataset */
|
50
|
+
function pivotData(rows) {
|
51
|
+
var parseData = []
|
52
|
+
let index = 1
|
53
|
+
for (let i = 0; i < rows.length; i++) {
|
54
|
+
var j = 0
|
55
|
+
const data = JSON.parse(rows[i].data)
|
56
|
+
const spec = JSON.parse(rows[i].spec)
|
57
|
+
|
58
|
+
for (let key in data) {
|
59
|
+
/** @todo rule to display or not, about unspecified spec */
|
60
|
+
const value = data[key]
|
61
|
+
!(spec[key]?.hidden) && parseData.push({
|
62
|
+
item: spec[key]?.name || key,
|
63
|
+
index,
|
64
|
+
value: Array.isArray(value) ? value.join(', ') : value
|
65
|
+
})
|
66
|
+
}
|
67
|
+
if (j !== 0) {
|
68
|
+
index = index + j
|
69
|
+
} else {
|
70
|
+
index = index + 1
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
return parseData
|
75
|
+
}
|
76
|
+
|
77
|
+
const athenaClient = new AthenaController()
|
78
|
+
async function queryAthena(params) {
|
79
|
+
const queryData = {
|
80
|
+
sql: `select data, spec, from_unixtime(collected_at/1000/1000) collected_at
|
81
|
+
from ${params['table']}
|
82
|
+
where domain='${params['domain']}'
|
83
|
+
and datasetid = '${params['dataSetId']}'
|
84
|
+
and workdate >= '${params['fromWorkDate']}'
|
85
|
+
and workdate <= '${params['toWorkDate']}'
|
86
|
+
and workshift = '${params['workShift'] || 'NA'}'
|
87
|
+
order by collected_at`,
|
88
|
+
db: database
|
89
|
+
}
|
90
|
+
// and json_extract_scalar(data, '$.dauid') = 'A8032AD81730'
|
91
|
+
|
92
|
+
return await athenaClient.query(queryData)
|
93
|
+
}
|
94
|
+
export async function renderJasperReport(context: any) {
|
95
|
+
const { state: { domain }, query } = context
|
96
|
+
const template = await STORAGE.readFile(query['template'] || 'dynamic_header_sample.jrxml', 'utf-8')
|
97
|
+
let templateType = 'crosstab'
|
98
|
+
let parsedData = []
|
99
|
+
|
100
|
+
query['domain'] = domain?.subdomain
|
101
|
+
const queryResult = await queryAthena(query)
|
102
|
+
const rows = queryResult.Items
|
103
|
+
|
104
|
+
if (templateType === 'crosstab') {
|
105
|
+
parsedData = pivotData(rows)
|
106
|
+
} else {
|
107
|
+
/** unused */
|
108
|
+
for (let i = 0; i < rows.length; i++) {
|
109
|
+
const data = JSON.parse(rows[i].data)
|
110
|
+
for (let key in data) {
|
111
|
+
if (Array.isArray(data[key])) {
|
112
|
+
data[key] = data[key].toString()
|
113
|
+
}
|
114
|
+
}
|
115
|
+
parsedData.push(data)
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|
119
|
+
const formData = new FormData()
|
120
|
+
formData.append('template', template)
|
121
|
+
formData.append('jsonString', JSON.stringify(parsedData))
|
122
|
+
|
123
|
+
const reportUrl = `${protocol || 'http'}://${host}:${port}/rest/report/show_html`
|
124
|
+
const response = await fetch(reportUrl, {
|
125
|
+
method: 'POST',
|
126
|
+
body: formData
|
127
|
+
})
|
128
|
+
|
129
|
+
return await response.text()
|
130
|
+
}
|
package/server/routes.ts
CHANGED
@@ -3,6 +3,7 @@ import { getConnection } from 'typeorm'
|
|
3
3
|
import { User } from '@things-factory/auth-base'
|
4
4
|
|
5
5
|
import { createDataSample } from './controllers/create-data-sample'
|
6
|
+
import { renderJasperReport } from './controllers/jasper-report'
|
6
7
|
import { DataSensor } from './service/data-sensor/data-sensor'
|
7
8
|
|
8
9
|
const debug = require('debug')('things-factory:dataset:routes')
|
@@ -87,4 +88,7 @@ process.on('bootstrap-module-domain-private-route' as any, (app, domainPrivateRo
|
|
87
88
|
/*
|
88
89
|
* can add domain private routes to application (auth required, tenancy required)
|
89
90
|
*/
|
91
|
+
domainPrivateRouter.get('/data-report/jasper', async (context, next) => {
|
92
|
+
context.body = await renderJasperReport(context)
|
93
|
+
})
|
90
94
|
})
|
@@ -3,6 +3,7 @@ import { EntityManager, In } from 'typeorm'
|
|
3
3
|
import uuid from 'uuid/v4'
|
4
4
|
|
5
5
|
import { Domain } from '@things-factory/shell'
|
6
|
+
import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
|
6
7
|
|
7
8
|
import { DataItem } from '../data-item/data-item'
|
8
9
|
import { DataSet } from './data-set'
|
@@ -16,12 +17,16 @@ export class DataSetMutation {
|
|
16
17
|
async createDataSet(@Arg('dataSet') dataSet: NewDataSet, @Ctx() context: any): Promise<DataSet> {
|
17
18
|
const { domain, user, tx } = context.state
|
18
19
|
|
19
|
-
|
20
|
+
const result = await tx.getRepository(DataSet).save({
|
20
21
|
...dataSet,
|
21
22
|
domain,
|
22
23
|
creator: user,
|
23
24
|
updater: user
|
24
25
|
})
|
26
|
+
|
27
|
+
await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: '+' })
|
28
|
+
|
29
|
+
return result
|
25
30
|
}
|
26
31
|
|
27
32
|
@Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
|
@@ -35,11 +40,15 @@ export class DataSetMutation {
|
|
35
40
|
where: { domain, id }
|
36
41
|
})
|
37
42
|
|
38
|
-
|
43
|
+
const result = await repository.save({
|
39
44
|
...dataSet,
|
40
45
|
...patch,
|
41
46
|
updater: user
|
42
47
|
})
|
48
|
+
|
49
|
+
await this._createAttachment(context, dataSet.reportTemplate, { refId: result.id, cuFlag: 'M' })
|
50
|
+
|
51
|
+
return result
|
43
52
|
}
|
44
53
|
|
45
54
|
@Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
|
@@ -57,6 +66,7 @@ export class DataSetMutation {
|
|
57
66
|
const dataSetRepo = tx.getRepository(DataSet)
|
58
67
|
|
59
68
|
if (_createRecords.length > 0) {
|
69
|
+
const cuFlag = '+'
|
60
70
|
for (let i = 0; i < _createRecords.length; i++) {
|
61
71
|
const newRecord = _createRecords[i]
|
62
72
|
|
@@ -67,11 +77,14 @@ export class DataSetMutation {
|
|
67
77
|
updater: user
|
68
78
|
})
|
69
79
|
|
70
|
-
|
80
|
+
await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
|
81
|
+
|
82
|
+
results.push({ ...result, cuFlag })
|
71
83
|
}
|
72
84
|
}
|
73
85
|
|
74
86
|
if (_updateRecords.length > 0) {
|
87
|
+
const cuFlag = 'M'
|
75
88
|
for (let i = 0; i < _updateRecords.length; i++) {
|
76
89
|
const newRecord = _updateRecords[i]
|
77
90
|
const dataSet = await dataSetRepo.findOne(newRecord.id)
|
@@ -82,7 +95,9 @@ export class DataSetMutation {
|
|
82
95
|
updater: user
|
83
96
|
})
|
84
97
|
|
85
|
-
|
98
|
+
await this._createAttachment(context, newRecord.reportTemplate, { refId: result.id, cuFlag })
|
99
|
+
|
100
|
+
results.push({ ...result, cuFlag })
|
86
101
|
}
|
87
102
|
}
|
88
103
|
|
@@ -96,6 +111,7 @@ export class DataSetMutation {
|
|
96
111
|
const { domain, tx } = context.state
|
97
112
|
|
98
113
|
await tx.getRepository(DataSet).delete({ domain, id })
|
114
|
+
await deleteAttachmentsByRef(null, { refBys: [`report-${id}`] }, context)
|
99
115
|
return true
|
100
116
|
}
|
101
117
|
|
@@ -110,6 +126,8 @@ export class DataSetMutation {
|
|
110
126
|
id: In(ids)
|
111
127
|
})
|
112
128
|
|
129
|
+
await deleteAttachmentsByRef(null, { refBys: ids.map(id => `report-${id}`) } , context)
|
130
|
+
|
113
131
|
return true
|
114
132
|
}
|
115
133
|
|
@@ -203,4 +221,23 @@ export class DataSetMutation {
|
|
203
221
|
return dataSet
|
204
222
|
})
|
205
223
|
}
|
224
|
+
|
225
|
+
|
226
|
+
async _createAttachment(context, attachment, { refId, cuFlag }) {
|
227
|
+
if (attachment) {
|
228
|
+
const attachmentRef = 'report-' + refId
|
229
|
+
cuFlag == 'M' && await deleteAttachmentsByRef(null, { refBys: [attachmentRef] }, context)
|
230
|
+
await createAttachment(
|
231
|
+
null,
|
232
|
+
{
|
233
|
+
attachment: {
|
234
|
+
file: attachment,
|
235
|
+
refBy: attachmentRef
|
236
|
+
}
|
237
|
+
},
|
238
|
+
context
|
239
|
+
)
|
240
|
+
}
|
241
|
+
}
|
206
242
|
}
|
243
|
+
|
@@ -4,6 +4,7 @@ import { getRepository } from 'typeorm'
|
|
4
4
|
import { Role, User } from '@things-factory/auth-base'
|
5
5
|
import { Board } from '@things-factory/board-service'
|
6
6
|
import { Domain, getQueryBuilderFromListParams, ListParam } from '@things-factory/shell'
|
7
|
+
import { Attachment } from '@things-factory/attachment-base'
|
7
8
|
|
8
9
|
import { DataItem } from '../data-item/data-item'
|
9
10
|
import { DataSample } from '../data-sample/data-sample'
|
@@ -52,6 +53,10 @@ export class DataSetQuery {
|
|
52
53
|
})
|
53
54
|
const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
|
54
55
|
|
56
|
+
if (!roles.length) {
|
57
|
+
return { items: [], total: 0 }
|
58
|
+
}
|
59
|
+
|
55
60
|
const queryBuilder = getQueryBuilderFromListParams({
|
56
61
|
repository: getRepository(DataSet),
|
57
62
|
params,
|
@@ -78,6 +83,10 @@ export class DataSetQuery {
|
|
78
83
|
})
|
79
84
|
const roles = user.roles.filter(role => role.domainId === domain.id).map(role => role.id)
|
80
85
|
|
86
|
+
if (!roles.length) {
|
87
|
+
return { items: [], total: 0 }
|
88
|
+
}
|
89
|
+
|
81
90
|
const queryBuilder = getQueryBuilderFromListParams({
|
82
91
|
repository: getRepository(DataSet),
|
83
92
|
params,
|
@@ -183,4 +192,16 @@ export class DataSetQuery {
|
|
183
192
|
|
184
193
|
return interval.prev().toDate()
|
185
194
|
}
|
195
|
+
|
196
|
+
@FieldResolver(type => String)
|
197
|
+
async reportTemplate(@Root() dataset: DataSet): Promise<string | undefined> {
|
198
|
+
const attachment: Attachment = await getRepository(Attachment).findOne({
|
199
|
+
where: {
|
200
|
+
domain: dataset.domainId,
|
201
|
+
refBy: `report-${dataset.id}`
|
202
|
+
}
|
203
|
+
})
|
204
|
+
|
205
|
+
return attachment?.fullpath
|
206
|
+
}
|
186
207
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
|
2
|
+
import { FileUpload, GraphQLUpload } from 'graphql-upload'
|
2
3
|
|
3
4
|
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
4
5
|
|
@@ -53,6 +54,9 @@ export class NewDataSet {
|
|
53
54
|
|
54
55
|
@Field({ nullable: true })
|
55
56
|
reportView?: string
|
57
|
+
|
58
|
+
@Field(type => GraphQLUpload, { nullable: true })
|
59
|
+
reportTemplate?: FileUpload
|
56
60
|
}
|
57
61
|
|
58
62
|
@InputType()
|
@@ -108,6 +112,9 @@ export class DataSetPatch {
|
|
108
112
|
@Field({ nullable: true })
|
109
113
|
reportView?: string
|
110
114
|
|
115
|
+
@Field(type => GraphQLUpload, { nullable: true })
|
116
|
+
reportTemplate?: FileUpload
|
117
|
+
|
111
118
|
@Field()
|
112
119
|
cuFlag: string
|
113
120
|
}
|
package/things-factory.config.js
CHANGED
@@ -27,6 +27,14 @@ export default {
|
|
27
27
|
{
|
28
28
|
tagname: 'data-report-list-page',
|
29
29
|
page: 'data-report-list'
|
30
|
+
},
|
31
|
+
{
|
32
|
+
tagname: 'jasper-report-samples-page',
|
33
|
+
page: 'jasper-report-samples'
|
34
|
+
},
|
35
|
+
{
|
36
|
+
tagname: 'jasper-report-oocs-page',
|
37
|
+
page: 'jasper-report-oocs'
|
30
38
|
}
|
31
39
|
],
|
32
40
|
bootstrap
|
package/translations/en.json
CHANGED
package/translations/ko.json
CHANGED