@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"]}
|