@things-factory/dataset 6.0.27 → 6.0.29
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/assets/images/data-collect.png +0 -0
- package/client/activities/activity-data-collect-view.ts +100 -0
- package/client/activities/activity-ooc-resolve-view.ts +174 -0
- package/client/{components/data-ooc-activity-view.ts → activities/activity-ooc-review-view.ts} +16 -16
- package/client/bootstrap.ts +4 -2
- package/client/pages/data-ooc/data-ooc-list-page.ts +6 -0
- package/client/pages/data-ooc/data-ooc-view-page.ts +115 -0
- package/client/pages/data-ooc/data-ooc-view.ts +7 -61
- package/client/pages/data-set/data-set-list-page.ts +111 -4
- package/client/route.ts +4 -0
- package/config/config.development.js +30 -30
- package/config/config.production.js +31 -31
- package/dist-client/activities/activity-data-collect-view.d.ts +19 -0
- package/dist-client/activities/activity-data-collect-view.js +101 -0
- package/dist-client/activities/activity-data-collect-view.js.map +1 -0
- package/dist-client/activities/activity-ooc-resolve-view.d.ts +1 -0
- package/dist-client/activities/activity-ooc-resolve-view.js +175 -0
- package/dist-client/activities/activity-ooc-resolve-view.js.map +1 -0
- package/dist-client/activities/activity-ooc-review-view.d.ts +1 -0
- package/dist-client/activities/activity-ooc-review-view.js +155 -0
- package/dist-client/activities/activity-ooc-review-view.js.map +1 -0
- package/dist-client/bootstrap.d.ts +3 -1
- package/dist-client/bootstrap.js +4 -2
- package/dist-client/bootstrap.js.map +1 -1
- package/dist-client/components/data-collect-activity-view.d.ts +19 -0
- package/dist-client/components/data-collect-activity-view.js +101 -0
- package/dist-client/components/data-collect-activity-view.js.map +1 -0
- package/dist-client/components/ooc-resolve-activity-view.d.ts +1 -0
- package/dist-client/components/ooc-resolve-activity-view.js +175 -0
- package/dist-client/components/ooc-resolve-activity-view.js.map +1 -0
- package/dist-client/components/ooc-review-activity-view.d.ts +1 -0
- package/dist-client/components/ooc-review-activity-view.js +155 -0
- package/dist-client/components/ooc-review-activity-view.js.map +1 -0
- package/dist-client/pages/data-ooc/data-ooc-list-page.js +6 -0
- package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -1
- package/dist-client/pages/data-ooc/data-ooc-view-page.d.ts +18 -0
- package/dist-client/pages/data-ooc/data-ooc-view-page.js +114 -0
- package/dist-client/pages/data-ooc/data-ooc-view-page.js.map +1 -0
- package/dist-client/pages/data-ooc/data-ooc-view.d.ts +15 -1
- package/dist-client/pages/data-ooc/data-ooc-view.js +9 -58
- package/dist-client/pages/data-ooc/data-ooc-view.js.map +1 -1
- package/dist-client/pages/data-set/data-set-list-page.d.ts +2 -0
- package/dist-client/pages/data-set/data-set-list-page.js +106 -4
- package/dist-client/pages/data-set/data-set-list-page.js.map +1 -1
- package/dist-client/route.js +3 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/activities/activity-data-collect.js +82 -0
- package/dist-server/activities/activity-data-collect.js.map +1 -0
- package/dist-server/activities/activity-ooc-resolve.js +100 -0
- package/dist-server/activities/activity-ooc-resolve.js.map +1 -0
- package/dist-server/activities/activity-ooc-review.js +107 -0
- package/dist-server/activities/activity-ooc-review.js.map +1 -0
- package/dist-server/activities/index.js +10 -0
- package/dist-server/activities/index.js.map +1 -0
- package/dist-server/controllers/activity-template/activity-data-collect.js +82 -0
- package/dist-server/controllers/activity-template/activity-data-collect.js.map +1 -0
- package/dist-server/controllers/activity-template/activity-ooc-resolve.js +100 -0
- package/dist-server/controllers/activity-template/activity-ooc-resolve.js.map +1 -0
- package/dist-server/controllers/activity-template/activity-ooc-review.js +107 -0
- package/dist-server/controllers/activity-template/activity-ooc-review.js.map +1 -0
- package/dist-server/controllers/create-data-sample.js +44 -42
- package/dist-server/controllers/create-data-sample.js.map +1 -1
- package/dist-server/controllers/data-use-case.js +1 -1
- package/dist-server/controllers/data-use-case.js.map +1 -1
- package/dist-server/controllers/index.js +0 -5
- package/dist-server/controllers/index.js.map +1 -1
- package/dist-server/index.js +1 -1
- package/dist-server/index.js.map +1 -1
- package/dist-server/routes.js +45 -1
- package/dist-server/routes.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc-query.js +22 -2
- package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
- package/dist-server/service/data-ooc/data-ooc.js +26 -0
- package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
- package/dist-server/service/data-set/data-set-mutation.js +86 -0
- package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
- package/dist-server/service/data-set/data-set-query.js +33 -0
- package/dist-server/service/data-set/data-set-query.js.map +1 -1
- package/dist-server/service/data-set/data-set-type.js +16 -0
- package/dist-server/service/data-set/data-set-type.js.map +1 -1
- package/dist-server/service/data-set/data-set.js +52 -3
- package/dist-server/service/data-set/data-set.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/dataset/data-ooc.md +5 -4
- package/package.json +10 -8
- package/server/activities/activity-data-collect.ts +84 -0
- package/server/activities/activity-ooc-resolve.ts +114 -0
- package/server/activities/activity-ooc-review.ts +118 -0
- package/server/activities/index.ts +10 -0
- package/server/controllers/create-data-sample.ts +48 -53
- package/server/controllers/data-use-case.ts +1 -1
- package/server/controllers/index.ts +0 -9
- package/server/index.ts +1 -1
- package/server/routes.ts +61 -2
- package/server/service/data-ooc/data-ooc-query.ts +12 -2
- package/server/service/data-ooc/data-ooc.ts +23 -0
- package/server/service/data-set/data-set-mutation.ts +97 -0
- package/server/service/data-set/data-set-query.ts +34 -1
- package/server/service/data-set/data-set-type.ts +14 -0
- package/server/service/data-set/data-set.ts +40 -2
- package/things-factory.config.js +4 -0
- package/translations/en.json +2 -0
- package/translations/ko.json +2 -0
- package/translations/ms.json +2 -0
- package/translations/zh.json +2 -0
- package/server/controllers/activity-template/activity-ooc.ts +0 -55
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ActivityDataCollect = void 0;
|
4
|
+
const worklist_1 = require("@things-factory/worklist");
|
5
|
+
const create_data_sample_1 = require("../controllers/create-data-sample");
|
6
|
+
async function callback(activityInstance, context) {
|
7
|
+
const { domain, tx } = context.state;
|
8
|
+
const { input, output, state } = activityInstance;
|
9
|
+
if (state == worklist_1.ActivityInstanceStatus.Ended) {
|
10
|
+
const activity = (await tx.getRepository(worklist_1.Activity).findOneBy({
|
11
|
+
domain: { id: domain.id },
|
12
|
+
name: 'Collect Data'
|
13
|
+
}));
|
14
|
+
/* collect-data 액티비티는 한명의 assignee(thread)만 수행하도록 한다. 따라서, output 중에서 샘플 한개만을 data로 취한다. */
|
15
|
+
const assignees = Object.keys(output);
|
16
|
+
const data = assignees.length > 0 && output[assignees[0]];
|
17
|
+
if (activity) {
|
18
|
+
const dataSample = {
|
19
|
+
dataSet: {
|
20
|
+
id: input.dataSetId
|
21
|
+
},
|
22
|
+
data
|
23
|
+
};
|
24
|
+
await (0, create_data_sample_1.createDataSample)(dataSample, context);
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
console.error('Collect Data Activity not installed.');
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
exports.ActivityDataCollect = {
|
32
|
+
name: 'Collect Data',
|
33
|
+
description: 'Tasks assigned for data collection',
|
34
|
+
release: '1.0.0',
|
35
|
+
provider: 'hatiolab.com',
|
36
|
+
category: 'quality',
|
37
|
+
activityType: 'user',
|
38
|
+
searchKeys: [
|
39
|
+
{
|
40
|
+
name: 'dataSetName',
|
41
|
+
description: 'DataSet name',
|
42
|
+
inputKey: 'dataSetName',
|
43
|
+
tKey: 'data-set-name'
|
44
|
+
}
|
45
|
+
],
|
46
|
+
startable: true,
|
47
|
+
model: [
|
48
|
+
{
|
49
|
+
name: 'dataSetId',
|
50
|
+
description: 'DataSet Id.',
|
51
|
+
tag: 'dataSetId',
|
52
|
+
hidden: true,
|
53
|
+
mandatory: true,
|
54
|
+
inout: 'in',
|
55
|
+
type: 'string',
|
56
|
+
options: {},
|
57
|
+
unit: null,
|
58
|
+
quantifier: [1],
|
59
|
+
spec: {}
|
60
|
+
},
|
61
|
+
{
|
62
|
+
name: 'dataSetName',
|
63
|
+
description: 'DataSet name',
|
64
|
+
tag: 'dataSetName',
|
65
|
+
hidden: true,
|
66
|
+
mandatory: true,
|
67
|
+
inout: 'in',
|
68
|
+
type: 'string',
|
69
|
+
options: {},
|
70
|
+
unit: null,
|
71
|
+
quantifier: [1],
|
72
|
+
spec: {}
|
73
|
+
}
|
74
|
+
],
|
75
|
+
uiType: 'custom-element',
|
76
|
+
uiSource: 'activity-data-collect-view',
|
77
|
+
reportType: 'page',
|
78
|
+
reportSource: 'activity-data-collect-view',
|
79
|
+
thumbnail: '/assets/images/data-collect.png',
|
80
|
+
callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
|
81
|
+
};
|
82
|
+
//# sourceMappingURL=activity-data-collect.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"activity-data-collect.js","sourceRoot":"","sources":["../../server/activities/activity-data-collect.ts"],"names":[],"mappings":";;;AAAA,uDAA6F;AAE7F,0EAAoE;AAEpE,KAAK,UAAU,QAAQ,CAAC,gBAAkC,EAAE,OAAwB;IAClF,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,IAAI,EAAE,cAAc;SACrB,CAAC,CAAa,CAAA;QAEf,2FAA2F;QAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzD,IAAI,QAAQ,EAAE;YACZ,MAAM,UAAU,GAAkB;gBAChC,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK,CAAC,SAAS;iBACpB;gBACD,IAAI;aACL,CAAA;YAED,MAAM,IAAA,qCAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;SAC5C;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;SACtD;KACF;AACH,CAAC;AAEY,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,SAAS,EAAE,IAAI;IACf,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,4BAA4B;IACtC,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,4BAA4B;IAC1C,SAAS,EAAE,iCAAiC;IAC5C,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { Activity, ActivityInstance, ActivityInstanceStatus } from '@things-factory/worklist'\nimport { NewDataSample } from 'service/data-sample/data-sample-type'\nimport { createDataSample } from '../controllers/create-data-sample'\n\nasync function callback(activityInstance: ActivityInstance, context: ResolverContext) {\n const { domain, tx } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: domain.id },\n name: 'Collect Data'\n })) as Activity\n\n /* collect-data 액티비티는 한명의 assignee(thread)만 수행하도록 한다. 따라서, output 중에서 샘플 한개만을 data로 취한다. */\n const assignees = Object.keys(output)\n const data = assignees.length > 0 && output[assignees[0]]\n\n if (activity) {\n const dataSample: NewDataSample = {\n dataSet: {\n id: input.dataSetId\n },\n data\n }\n\n await createDataSample(dataSample, context)\n } else {\n console.error('Collect Data Activity not installed.')\n }\n }\n}\n\nexport const ActivityDataCollect = {\n name: 'Collect Data',\n description: 'Tasks assigned for data collection',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startable: true,\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-data-collect-view',\n reportType: 'page',\n reportSource: 'activity-data-collect-view',\n thumbnail: '/assets/images/data-collect.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ActivityOocResolve = void 0;
|
4
|
+
const worklist_1 = require("@things-factory/worklist");
|
5
|
+
const data_ooc_1 = require("../service/data-ooc/data-ooc");
|
6
|
+
async function callback(activityInstance, context) {
|
7
|
+
var _a;
|
8
|
+
const { tx, user, domain } = context.state;
|
9
|
+
const { id, input, output, state, terminatedAt } = activityInstance;
|
10
|
+
/* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */
|
11
|
+
if (state == worklist_1.ActivityInstanceStatus.Ended) {
|
12
|
+
const activityThreads = await tx.getRepository(worklist_1.ActivityThread).find({
|
13
|
+
where: {
|
14
|
+
domain: { id: domain.id },
|
15
|
+
activityInstance: { id },
|
16
|
+
state: worklist_1.ActivityThreadStatus.Ended
|
17
|
+
},
|
18
|
+
relations: ['assignee']
|
19
|
+
});
|
20
|
+
const corrector = (_a = activityThreads[0]) === null || _a === void 0 ? void 0 : _a.assignee;
|
21
|
+
const { dataOocId } = input;
|
22
|
+
const correctiveAction = Object.values(output)
|
23
|
+
.map((o) => o.action)
|
24
|
+
.join('\n');
|
25
|
+
var dataOoc = await tx.getRepository(data_ooc_1.DataOoc).findOne({
|
26
|
+
where: {
|
27
|
+
domain: { id: domain.id },
|
28
|
+
id: dataOocId
|
29
|
+
},
|
30
|
+
relations: ['dataSet']
|
31
|
+
});
|
32
|
+
/* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
|
33
|
+
dataOoc = await tx.getRepository(data_ooc_1.DataOoc).save(Object.assign(Object.assign({}, dataOoc), { correctedAt: terminatedAt, corrector: corrector, correctiveAction, updater: user, state: data_ooc_1.DataOocStatus.CORRECTED }));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
exports.ActivityOocResolve = {
|
37
|
+
name: 'OOC Resolve',
|
38
|
+
description: 'Task to take remedial action based on Out Of Control data',
|
39
|
+
release: '1.0.0',
|
40
|
+
provider: 'hatiolab.com',
|
41
|
+
category: 'quality',
|
42
|
+
activityType: 'user',
|
43
|
+
searchKeys: [
|
44
|
+
{
|
45
|
+
name: 'dataOocId',
|
46
|
+
description: 'OOC Id.',
|
47
|
+
inputKey: 'dataOocId',
|
48
|
+
tKey: 'data-ooc-id'
|
49
|
+
}
|
50
|
+
],
|
51
|
+
startable: true,
|
52
|
+
model: [
|
53
|
+
{
|
54
|
+
name: 'dataOocId',
|
55
|
+
description: 'OOC id',
|
56
|
+
tag: 'dataOocId',
|
57
|
+
hidden: true,
|
58
|
+
mandatory: true,
|
59
|
+
inout: 'in',
|
60
|
+
type: 'string',
|
61
|
+
options: {},
|
62
|
+
unit: null,
|
63
|
+
quantifier: [1],
|
64
|
+
spec: {}
|
65
|
+
},
|
66
|
+
{
|
67
|
+
name: 'instruction',
|
68
|
+
description: 'Instructions for resolving OOC',
|
69
|
+
tag: 'instruction',
|
70
|
+
hidden: false,
|
71
|
+
mandatory: true,
|
72
|
+
inout: 'in',
|
73
|
+
type: 'textarea',
|
74
|
+
options: {},
|
75
|
+
unit: null,
|
76
|
+
quantifier: [1],
|
77
|
+
spec: {}
|
78
|
+
},
|
79
|
+
{
|
80
|
+
name: 'action',
|
81
|
+
description: 'Action Description',
|
82
|
+
tag: 'action',
|
83
|
+
hidden: false,
|
84
|
+
mandatory: true,
|
85
|
+
inout: 'out',
|
86
|
+
type: 'textarea',
|
87
|
+
options: {},
|
88
|
+
unit: null,
|
89
|
+
quantifier: [1],
|
90
|
+
spec: {}
|
91
|
+
}
|
92
|
+
],
|
93
|
+
uiType: 'custom-element',
|
94
|
+
uiSource: 'activity-ooc-resolve-view',
|
95
|
+
reportType: 'page',
|
96
|
+
reportSource: 'data-ooc-report-page',
|
97
|
+
thumbnail: '/assets/images/ooc.png',
|
98
|
+
callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
|
99
|
+
};
|
100
|
+
//# sourceMappingURL=activity-ooc-resolve.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"activity-ooc-resolve.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActivityInstance,\n ActivityInstanceStatus,\n ActivityThread,\n ActivityThreadStatus\n} from '@things-factory/worklist'\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(activityInstance: ActivityInstance, context: ResolverContext) {\n const { tx, user, domain } = context.state\n const { id, input, output, state, terminatedAt } = activityInstance\n\n /* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */\n if (state == ActivityInstanceStatus.Ended) {\n const activityThreads = await tx.getRepository(ActivityThread).find({\n where: {\n domain: { id: domain.id },\n activityInstance: { id },\n state: ActivityThreadStatus.Ended\n },\n relations: ['assignee']\n })\n\n const corrector = activityThreads[0]?.assignee\n\n const { dataOocId } = input\n const correctiveAction = Object.values(output)\n .map((o: any) => o.action)\n .join('\\n')\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n correctedAt: terminatedAt,\n corrector: corrector,\n correctiveAction,\n updater: user,\n state: DataOocStatus.CORRECTED\n })\n }\n}\n\nexport const ActivityOocResolve = {\n name: 'OOC Resolve',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startable: true,\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'instruction',\n description: 'Instructions for resolving OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'in',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'action',\n description: 'Action Description',\n tag: 'action',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-resolve-view',\n reportType: 'page',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
|
@@ -0,0 +1,107 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ActivityOocReview = void 0;
|
4
|
+
const worklist_1 = require("@things-factory/worklist");
|
5
|
+
const post_1 = require("@things-factory/worklist/dist-server/controllers/activity-instance/post");
|
6
|
+
const data_ooc_1 = require("../service/data-ooc/data-ooc");
|
7
|
+
async function callback(activityInstance, context) {
|
8
|
+
const { domain, user, tx } = context.state;
|
9
|
+
const { input, output, state, terminatedAt } = activityInstance;
|
10
|
+
if (state == worklist_1.ActivityInstanceStatus.Ended) {
|
11
|
+
const activity = (await tx.getRepository(worklist_1.Activity).findOneBy({
|
12
|
+
domain: { id: domain.id },
|
13
|
+
name: 'OOC Resolve'
|
14
|
+
}));
|
15
|
+
if (activity) {
|
16
|
+
const { dataOocId } = input;
|
17
|
+
const correctiveInstruction = Object.values(output)
|
18
|
+
.map((o) => o.instruction)
|
19
|
+
.join('\n');
|
20
|
+
var dataOoc = await tx.getRepository(data_ooc_1.DataOoc).findOne({
|
21
|
+
where: {
|
22
|
+
domain: { id: domain.id },
|
23
|
+
id: dataOocId
|
24
|
+
},
|
25
|
+
relations: ['dataSet']
|
26
|
+
});
|
27
|
+
const dataSet = dataOoc.dataSet;
|
28
|
+
const { assignees, approvalLine } = dataSet;
|
29
|
+
/* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
|
30
|
+
dataOoc = await tx.getRepository(data_ooc_1.DataOoc).save(Object.assign(Object.assign({}, dataOoc), { reviewedAt: terminatedAt, reviewer: user, correctiveInstruction, state: data_ooc_1.DataOocStatus.REVIEWED }));
|
31
|
+
/* 해당 dataset의 작업 담당자(assignees)에게 OOC 해결을 위한 태스크를 지시한다. */
|
32
|
+
if (assignees && assignees instanceof Array && assignees.length > 0) {
|
33
|
+
const activityInstance = {
|
34
|
+
name: `[OOC 조치] ${dataSet.name}`,
|
35
|
+
activityId: activity.id,
|
36
|
+
description: `Data OOC occurred on '${dataSet.name}'`,
|
37
|
+
dueAt: new Date(terminatedAt.getTime() + 24 * 60 * 60 * 1000),
|
38
|
+
input: {
|
39
|
+
dataOocId,
|
40
|
+
instruction: correctiveInstruction
|
41
|
+
},
|
42
|
+
assignees,
|
43
|
+
approvalLine
|
44
|
+
};
|
45
|
+
await (0, post_1.post)(activityInstance, context);
|
46
|
+
}
|
47
|
+
else {
|
48
|
+
console.error(`Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be posted.`);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
console.error('OOC Resolve Activity not installed.');
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
exports.ActivityOocReview = {
|
57
|
+
name: 'OOC Review',
|
58
|
+
description: 'Task to take remedial action based on Out Of Control data',
|
59
|
+
release: '1.0.0',
|
60
|
+
provider: 'hatiolab.com',
|
61
|
+
category: 'quality',
|
62
|
+
activityType: 'user',
|
63
|
+
searchKeys: [
|
64
|
+
{
|
65
|
+
name: 'dataOocId',
|
66
|
+
description: 'OOC Id.',
|
67
|
+
inputKey: 'dataOocId',
|
68
|
+
tKey: 'data-ooc-id'
|
69
|
+
}
|
70
|
+
],
|
71
|
+
startable: true,
|
72
|
+
model: [
|
73
|
+
{
|
74
|
+
name: 'dataOocId',
|
75
|
+
description: 'OOC id',
|
76
|
+
tag: 'dataOocId',
|
77
|
+
hidden: true,
|
78
|
+
mandatory: true,
|
79
|
+
inout: 'in',
|
80
|
+
type: 'string',
|
81
|
+
options: {},
|
82
|
+
unit: null,
|
83
|
+
quantifier: [1],
|
84
|
+
spec: {}
|
85
|
+
},
|
86
|
+
{
|
87
|
+
name: 'Instruction',
|
88
|
+
description: 'Instructions for preventing OOC',
|
89
|
+
tag: 'instruction',
|
90
|
+
hidden: false,
|
91
|
+
mandatory: true,
|
92
|
+
inout: 'out',
|
93
|
+
type: 'textarea',
|
94
|
+
options: {},
|
95
|
+
unit: null,
|
96
|
+
quantifier: [1],
|
97
|
+
spec: {}
|
98
|
+
}
|
99
|
+
],
|
100
|
+
uiType: 'custom-element',
|
101
|
+
uiSource: 'activity-ooc-review-view',
|
102
|
+
reportType: 'page',
|
103
|
+
reportSource: 'data-ooc-report-page',
|
104
|
+
thumbnail: '/assets/images/ooc.png',
|
105
|
+
callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
|
106
|
+
};
|
107
|
+
//# sourceMappingURL=activity-ooc-review.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"activity-ooc-review.js","sourceRoot":"","sources":["../../server/activities/activity-ooc-review.ts"],"names":[],"mappings":"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","sourcesContent":["import { Activity, ActivityInstance, ActivityInstanceStatus } from '@things-factory/worklist'\nimport { post } from '@things-factory/worklist/dist-server/controllers/activity-instance/post'\nimport { DataOoc, DataOocStatus } from '../service/data-ooc/data-ooc'\n\nasync function callback(activityInstance: ActivityInstance, context: ResolverContext) {\n const { domain, user, tx } = context.state\n const { input, output, state, terminatedAt } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: domain.id },\n name: 'OOC Resolve'\n })) as Activity\n\n if (activity) {\n const { dataOocId } = input\n const correctiveInstruction = Object.values(output)\n .map((o: any) => o.instruction)\n .join('\\n')\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n const dataSet = dataOoc.dataSet\n const { assignees, approvalLine } = dataSet\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n reviewedAt: terminatedAt,\n reviewer: user,\n correctiveInstruction,\n state: DataOocStatus.REVIEWED\n })\n\n /* 해당 dataset의 작업 담당자(assignees)에게 OOC 해결을 위한 태스크를 지시한다. */\n if (assignees && assignees instanceof Array && assignees.length > 0) {\n const activityInstance = {\n name: `[OOC 조치] ${dataSet.name}`,\n activityId: activity.id,\n description: `Data OOC occurred on '${dataSet.name}'`,\n dueAt: new Date(terminatedAt.getTime() + 24 * 60 * 60 * 1000),\n input: {\n dataOocId,\n instruction: correctiveInstruction\n },\n assignees,\n approvalLine\n }\n\n await post(activityInstance, context)\n } else {\n console.error(\n `Assignees are not set. So, Data OOC Resolve task for ${dataOoc.name}(${dataOoc.id}) could not be posted.`\n )\n }\n } else {\n console.error('OOC Resolve Activity not installed.')\n }\n }\n}\n\nexport const ActivityOocReview = {\n name: 'OOC Review',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startable: true,\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'Instruction',\n description: 'Instructions for preventing OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'activity-ooc-review-view',\n reportType: 'page',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const worklist_1 = require("@things-factory/worklist");
|
4
|
+
const activity_ooc_review_1 = require("./activity-ooc-review");
|
5
|
+
const activity_ooc_resolve_1 = require("./activity-ooc-resolve");
|
6
|
+
const activity_data_collect_1 = require("./activity-data-collect");
|
7
|
+
[activity_ooc_review_1.ActivityOocReview, activity_ooc_resolve_1.ActivityOocResolve, activity_data_collect_1.ActivityDataCollect].forEach(template => {
|
8
|
+
worklist_1.ActivityInstallations.installActivityTemplate(template);
|
9
|
+
});
|
10
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/activities/index.ts"],"names":[],"mappings":";;AAAA,uDAAgE;AAEhE,+DAAyD;AACzD,iEAA2D;AAC3D,mEAGC;AAAA,CAAC,uCAAiB,EAAE,yCAAkB,EAAE,2CAAmB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAC/E,gCAAqB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA","sourcesContent":["import { ActivityInstallations } from '@things-factory/worklist'\n\nimport { ActivityOocReview } from './activity-ooc-review'\nimport { ActivityOocResolve } from './activity-ooc-resolve'\nimport { ActivityDataCollect } from './activity-data-collect'\n\n/* activity templates installation */\n;[ActivityOocReview, ActivityOocResolve, ActivityDataCollect].forEach(template => {\n ActivityInstallations.installActivityTemplate(template)\n})\n"]}
|
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ActivityDataCollect = void 0;
|
4
|
+
const worklist_1 = require("@things-factory/worklist");
|
5
|
+
const create_data_sample_1 = require("../../controllers/create-data-sample");
|
6
|
+
async function callback(activityInstance, context) {
|
7
|
+
const { domain, tx } = context.state;
|
8
|
+
const { input, output, state } = activityInstance;
|
9
|
+
if (state == worklist_1.ActivityInstanceStatus.Ended) {
|
10
|
+
const activity = (await tx.getRepository(worklist_1.Activity).findOneBy({
|
11
|
+
domain: { id: domain.id },
|
12
|
+
name: 'Collect Data'
|
13
|
+
}));
|
14
|
+
/* collect-data 액티비티는 한명의 assignee(thread)만 수행하도록 한다. 따라서, output 중에서 샘플 한개만을 data로 취한다. */
|
15
|
+
const assignees = Object.keys(output);
|
16
|
+
const data = assignees.length > 0 && output[assignees[0]];
|
17
|
+
if (activity) {
|
18
|
+
const dataSample = {
|
19
|
+
dataSet: {
|
20
|
+
id: input.dataSetId
|
21
|
+
},
|
22
|
+
data
|
23
|
+
};
|
24
|
+
await (0, create_data_sample_1.createDataSample)(dataSample, context);
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
console.error('Collect Data Activity not installed.');
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
exports.ActivityDataCollect = {
|
32
|
+
name: 'Collect Data',
|
33
|
+
description: 'Tasks assigned for data collection',
|
34
|
+
release: '1.0.0',
|
35
|
+
provider: 'hatiolab.com',
|
36
|
+
category: 'quality',
|
37
|
+
activityType: 'user',
|
38
|
+
searchKeys: [
|
39
|
+
{
|
40
|
+
name: 'dataSetName',
|
41
|
+
description: 'DataSet name',
|
42
|
+
inputKey: 'dataSetName',
|
43
|
+
tKey: 'data-set-name'
|
44
|
+
}
|
45
|
+
],
|
46
|
+
startable: true,
|
47
|
+
model: [
|
48
|
+
{
|
49
|
+
name: 'dataSetId',
|
50
|
+
description: 'DataSet Id.',
|
51
|
+
tag: 'dataSetId',
|
52
|
+
hidden: true,
|
53
|
+
mandatory: true,
|
54
|
+
inout: 'in',
|
55
|
+
type: 'string',
|
56
|
+
options: {},
|
57
|
+
unit: null,
|
58
|
+
quantifier: [1],
|
59
|
+
spec: {}
|
60
|
+
},
|
61
|
+
{
|
62
|
+
name: 'dataSetName',
|
63
|
+
description: 'DataSet name',
|
64
|
+
tag: 'dataSetName',
|
65
|
+
hidden: true,
|
66
|
+
mandatory: true,
|
67
|
+
inout: 'in',
|
68
|
+
type: 'string',
|
69
|
+
options: {},
|
70
|
+
unit: null,
|
71
|
+
quantifier: [1],
|
72
|
+
spec: {}
|
73
|
+
}
|
74
|
+
],
|
75
|
+
uiType: 'custom-element',
|
76
|
+
uiSource: 'data-collect-activity-view',
|
77
|
+
reportType: 'page',
|
78
|
+
reportSource: 'data-collect-activity-view',
|
79
|
+
thumbnail: '/assets/images/data-collect.png',
|
80
|
+
callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
|
81
|
+
};
|
82
|
+
//# sourceMappingURL=activity-data-collect.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"activity-data-collect.js","sourceRoot":"","sources":["../../../server/controllers/activity-template/activity-data-collect.ts"],"names":[],"mappings":";;;AACA,uDAA6F;AAE7F,6EAAuE;AAEvE,KAAK,UAAU,QAAQ,CAAC,gBAAkC,EAAE,OAAwB;IAClF,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IACpC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAA;IAEjD,IAAI,KAAK,IAAI,iCAAsB,CAAC,KAAK,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,mBAAQ,CAAC,CAAC,SAAS,CAAC;YAC3D,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,IAAI,EAAE,cAAc;SACrB,CAAC,CAAa,CAAA;QAEf,2FAA2F;QAC3F,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzD,IAAI,QAAQ,EAAE;YACZ,MAAM,UAAU,GAAkB;gBAChC,OAAO,EAAE;oBACP,EAAE,EAAE,KAAK,CAAC,SAAS;iBACpB;gBACD,IAAI;aACL,CAAA;YAED,MAAM,IAAA,qCAAgB,EAAC,UAAU,EAAE,OAAO,CAAC,CAAA;SAC5C;aAAM;YACL,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAA;SACtD;KACF;AACH,CAAC;AAEY,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oCAAoC;IACjD,OAAO,EAAE,OAAO;IAChB,QAAQ,EAAE,cAAc;IACxB,QAAQ,EAAE,SAAS;IACnB,YAAY,EAAE,MAAM;IACpB,UAAU,EAAE;QACV;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,aAAa;YACvB,IAAI,EAAE,eAAe;SACtB;KACF;IACD,SAAS,EAAE,IAAI;IACf,KAAK,EAAE;QACL;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,aAAa;YAC1B,GAAG,EAAE,WAAW;YAChB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;QACD;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,cAAc;YAC3B,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;YACX,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,EAAE;SACT;KACF;IACD,MAAM,EAAE,gBAAgB;IACxB,QAAQ,EAAE,4BAA4B;IACtC,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,4BAA4B;IAC1C,SAAS,EAAE,iCAAiC;IAC5C,QAAQ,CAAC,mFAAmF;CAC7F,CAAA","sourcesContent":["import { Domain } from '@things-factory/shell'\nimport { Activity, ActivityInstance, ActivityInstanceStatus } from '@things-factory/worklist'\nimport { NewDataSample } from 'service/data-sample/data-sample-type'\nimport { createDataSample } from '../../controllers/create-data-sample'\n\nasync function callback(activityInstance: ActivityInstance, context: ResolverContext) {\n const { domain, tx } = context.state\n const { input, output, state } = activityInstance\n\n if (state == ActivityInstanceStatus.Ended) {\n const activity = (await tx.getRepository(Activity).findOneBy({\n domain: { id: domain.id },\n name: 'Collect Data'\n })) as Activity\n\n /* collect-data 액티비티는 한명의 assignee(thread)만 수행하도록 한다. 따라서, output 중에서 샘플 한개만을 data로 취한다. */\n const assignees = Object.keys(output)\n const data = assignees.length > 0 && output[assignees[0]]\n\n if (activity) {\n const dataSample: NewDataSample = {\n dataSet: {\n id: input.dataSetId\n },\n data\n }\n\n await createDataSample(dataSample, context)\n } else {\n console.error('Collect Data Activity not installed.')\n }\n }\n}\n\nexport const ActivityDataCollect = {\n name: 'Collect Data',\n description: 'Tasks assigned for data collection',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n searchKeys: [\n {\n name: 'dataSetName',\n description: 'DataSet name',\n inputKey: 'dataSetName',\n tKey: 'data-set-name'\n }\n ],\n startable: true,\n model: [\n {\n name: 'dataSetId',\n description: 'DataSet Id.',\n tag: 'dataSetId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'dataSetName',\n description: 'DataSet name',\n tag: 'dataSetName',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'data-collect-activity-view',\n reportType: 'page',\n reportSource: 'data-collect-activity-view',\n thumbnail: '/assets/images/data-collect.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
|
@@ -0,0 +1,100 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ActivityOocResolve = void 0;
|
4
|
+
const worklist_1 = require("@things-factory/worklist");
|
5
|
+
const data_ooc_1 = require("../../service/data-ooc/data-ooc");
|
6
|
+
async function callback(activityInstance, context) {
|
7
|
+
var _a;
|
8
|
+
const { tx, user, domain } = context.state;
|
9
|
+
const { id, input, output, state, terminatedAt } = activityInstance;
|
10
|
+
/* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */
|
11
|
+
if (state == worklist_1.ActivityInstanceStatus.Ended) {
|
12
|
+
const activityThreads = await tx.getRepository(worklist_1.ActivityThread).find({
|
13
|
+
where: {
|
14
|
+
domain: { id: domain.id },
|
15
|
+
activityInstance: { id },
|
16
|
+
state: worklist_1.ActivityThreadStatus.Ended
|
17
|
+
},
|
18
|
+
relations: ['assignee']
|
19
|
+
});
|
20
|
+
const corrector = (_a = activityThreads[0]) === null || _a === void 0 ? void 0 : _a.assignee;
|
21
|
+
const { dataOocId } = input;
|
22
|
+
const correctiveAction = Object.values(output)
|
23
|
+
.map((o) => o.action)
|
24
|
+
.join('\n');
|
25
|
+
var dataOoc = await tx.getRepository(data_ooc_1.DataOoc).findOne({
|
26
|
+
where: {
|
27
|
+
domain: { id: domain.id },
|
28
|
+
id: dataOocId
|
29
|
+
},
|
30
|
+
relations: ['dataSet']
|
31
|
+
});
|
32
|
+
/* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */
|
33
|
+
dataOoc = await tx.getRepository(data_ooc_1.DataOoc).save(Object.assign(Object.assign({}, dataOoc), { correctedAt: terminatedAt, corrector: corrector, correctiveAction, updater: user, state: data_ooc_1.DataOocStatus.CORRECTED }));
|
34
|
+
}
|
35
|
+
}
|
36
|
+
exports.ActivityOocResolve = {
|
37
|
+
name: 'OOC Resolve',
|
38
|
+
description: 'Task to take remedial action based on Out Of Control data',
|
39
|
+
release: '1.0.0',
|
40
|
+
provider: 'hatiolab.com',
|
41
|
+
category: 'quality',
|
42
|
+
activityType: 'user',
|
43
|
+
searchKeys: [
|
44
|
+
{
|
45
|
+
name: 'dataOocId',
|
46
|
+
description: 'OOC Id.',
|
47
|
+
inputKey: 'dataOocId',
|
48
|
+
tKey: 'data-ooc-id'
|
49
|
+
}
|
50
|
+
],
|
51
|
+
startable: true,
|
52
|
+
model: [
|
53
|
+
{
|
54
|
+
name: 'dataOocId',
|
55
|
+
description: 'OOC id',
|
56
|
+
tag: 'dataOocId',
|
57
|
+
hidden: true,
|
58
|
+
mandatory: true,
|
59
|
+
inout: 'in',
|
60
|
+
type: 'string',
|
61
|
+
options: {},
|
62
|
+
unit: null,
|
63
|
+
quantifier: [1],
|
64
|
+
spec: {}
|
65
|
+
},
|
66
|
+
{
|
67
|
+
name: 'instruction',
|
68
|
+
description: 'Instructions for resolving OOC',
|
69
|
+
tag: 'instruction',
|
70
|
+
hidden: false,
|
71
|
+
mandatory: true,
|
72
|
+
inout: 'in',
|
73
|
+
type: 'textarea',
|
74
|
+
options: {},
|
75
|
+
unit: null,
|
76
|
+
quantifier: [1],
|
77
|
+
spec: {}
|
78
|
+
},
|
79
|
+
{
|
80
|
+
name: 'action',
|
81
|
+
description: 'Action Description',
|
82
|
+
tag: 'action',
|
83
|
+
hidden: false,
|
84
|
+
mandatory: true,
|
85
|
+
inout: 'out',
|
86
|
+
type: 'textarea',
|
87
|
+
options: {},
|
88
|
+
unit: null,
|
89
|
+
quantifier: [1],
|
90
|
+
spec: {}
|
91
|
+
}
|
92
|
+
],
|
93
|
+
uiType: 'custom-element',
|
94
|
+
uiSource: 'ooc-resolve-activity-view',
|
95
|
+
reportType: 'page',
|
96
|
+
reportSource: 'data-ooc-report-page',
|
97
|
+
thumbnail: '/assets/images/ooc.png',
|
98
|
+
callback /* Called when there is a change in the lifecycle of a task (activity-instance). */
|
99
|
+
};
|
100
|
+
//# sourceMappingURL=activity-ooc-resolve.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"activity-ooc-resolve.js","sourceRoot":"","sources":["../../../server/controllers/activity-template/activity-ooc-resolve.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ActivityInstance,\n ActivityInstanceStatus,\n ActivityThread,\n ActivityThreadStatus\n} from '@things-factory/worklist'\nimport { DataOoc, DataOocStatus } from '../../service/data-ooc/data-ooc'\n\nasync function callback(activityInstance: ActivityInstance, context: ResolverContext) {\n const { tx, user, domain } = context.state\n const { id, input, output, state, terminatedAt } = activityInstance\n\n /* Resolve Activity가 완료되면, 해당 data-ooc 엔티티의 correctiveAction, correctorId, correctedAt 을 update한다. */\n if (state == ActivityInstanceStatus.Ended) {\n const activityThreads = await tx.getRepository(ActivityThread).find({\n where: {\n domain: { id: domain.id },\n activityInstance: { id },\n state: ActivityThreadStatus.Ended\n },\n relations: ['assignee']\n })\n\n const corrector = activityThreads[0]?.assignee\n\n const { dataOocId } = input\n const correctiveAction = Object.values(output)\n .map((o: any) => o.action)\n .join('\\n')\n\n var dataOoc = await tx.getRepository(DataOoc).findOne({\n where: {\n domain: { id: domain.id },\n id: dataOocId\n },\n relations: ['dataSet']\n })\n\n /* dataOoc Review 결과를 dataOoc 엔티티에 반영한다. */\n dataOoc = await tx.getRepository(DataOoc).save({\n ...dataOoc,\n correctedAt: terminatedAt,\n corrector: corrector,\n correctiveAction,\n updater: user,\n state: DataOocStatus.CORRECTED\n })\n }\n}\n\nexport const ActivityOocResolve = {\n name: 'OOC Resolve',\n description: 'Task to take remedial action based on Out Of Control data',\n release: '1.0.0',\n provider: 'hatiolab.com',\n category: 'quality',\n activityType: 'user',\n searchKeys: [\n {\n name: 'dataOocId',\n description: 'OOC Id.',\n inputKey: 'dataOocId',\n tKey: 'data-ooc-id'\n }\n ],\n startable: true,\n model: [\n {\n name: 'dataOocId',\n description: 'OOC id',\n tag: 'dataOocId',\n hidden: true,\n mandatory: true,\n inout: 'in',\n type: 'string',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'instruction',\n description: 'Instructions for resolving OOC',\n tag: 'instruction',\n hidden: false,\n mandatory: true,\n inout: 'in',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n },\n {\n name: 'action',\n description: 'Action Description',\n tag: 'action',\n hidden: false,\n mandatory: true,\n inout: 'out',\n type: 'textarea',\n options: {},\n unit: null,\n quantifier: [1],\n spec: {}\n }\n ],\n uiType: 'custom-element',\n uiSource: 'ooc-resolve-activity-view',\n reportType: 'page',\n reportSource: 'data-ooc-report-page',\n thumbnail: '/assets/images/ooc.png',\n callback /* Called when there is a change in the lifecycle of a task (activity-instance). */\n}\n"]}
|