@things-factory/kpi 9.0.18 → 9.0.19
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/bootstrap.ts +8 -0
- package/client/pages/kpi/kpi-list-page.ts +91 -11
- package/client/pages/kpi-category/kpi-category-list-page.ts +80 -8
- package/client/pages/kpi-history/kpi-history-list-page.ts +1 -1
- package/client/pages/kpi-metric/kpi-metric-list-page.ts +31 -7
- package/client/pages/kpi-metric-value/kpi-metric-value-importer.ts +65 -0
- package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +299 -0
- package/client/pages/{kpi-value/kpi-value-manual-entry-form.ts → kpi-metric-value/kpi-metric-value-manual-entry-form.ts} +18 -44
- package/client/pages/{kpi-value/kpi-value-manual-entry-page.ts → kpi-metric-value/kpi-metric-value-manual-entry-page.ts} +21 -21
- package/client/pages/kpi-value/kpi-value-list-page.ts +4 -6
- package/client/route.ts +6 -2
- package/dist-client/bootstrap.d.ts +2 -0
- package/dist-client/bootstrap.js +7 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/pages/kpi/kpi-list-page.d.ts +6 -0
- package/dist-client/pages/kpi/kpi-list-page.js +94 -11
- package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
- package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +5 -0
- package/dist-client/pages/kpi-category/kpi-category-list-page.js +83 -8
- package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
- package/dist-client/pages/kpi-history/kpi-history-list-page.js +1 -1
- package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +29 -5
- package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +75 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +61 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +301 -0
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
- package/dist-client/pages/{kpi-value/kpi-value-manual-entry-form.d.ts → kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts} +3 -5
- package/dist-client/pages/{kpi-value/kpi-value-manual-entry-form.js → kpi-metric-value/kpi-metric-value-manual-entry-form.js} +27 -56
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
- package/dist-client/pages/{kpi-value/kpi-value-manual-entry-page.d.ts → kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts} +5 -5
- package/dist-client/pages/{kpi-value/kpi-value-manual-entry-page.js → kpi-metric-value/kpi-metric-value-manual-entry-page.js} +28 -28
- package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
- package/dist-client/pages/kpi-value/kpi-value-list-page.js +4 -6
- package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +5 -2
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/index.d.ts +4 -2
- package/dist-server/service/index.js +6 -1
- package/dist-server/service/index.js.map +1 -1
- package/dist-server/service/kpi/aggregate-kpi.js +5 -7
- package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
- package/dist-server/service/kpi/kpi-history.d.ts +3 -1
- package/dist-server/service/kpi/kpi-history.js +10 -0
- package/dist-server/service/kpi/kpi-history.js.map +1 -1
- package/dist-server/service/kpi/kpi-mutation.js +1 -1
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi/kpi-type.d.ts +2 -0
- package/dist-server/service/kpi/kpi-type.js +8 -0
- package/dist-server/service/kpi/kpi-type.js.map +1 -1
- package/dist-server/service/kpi/kpi.d.ts +9 -0
- package/dist-server/service/kpi/kpi.js +23 -1
- package/dist-server/service/kpi/kpi.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -8
- package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category-type.d.ts +4 -2
- package/dist-server/service/kpi-category/kpi-category-type.js +16 -8
- package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
- package/dist-server/service/kpi-category/kpi-category.d.ts +2 -2
- package/dist-server/service/kpi-category/kpi-category.js +8 -8
- package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +31 -74
- package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-mutation.js +15 -28
- package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +6 -4
- package/dist-server/service/kpi-metric/kpi-metric-type.js +20 -12
- package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
- package/dist-server/service/kpi-metric/kpi-metric.d.ts +15 -2
- package/dist-server/service/kpi-metric/kpi-metric.js +34 -14
- package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
- package/dist-server/service/kpi-metric-value/index.d.ts +6 -0
- package/dist-server/service/kpi-metric-value/index.js +10 -0
- package/dist-server/service/kpi-metric-value/index.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +11 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +229 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +13 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +95 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +26 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +112 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +23 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js +106 -0
- package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -0
- package/dist-server/service/kpi-value/kpi-value-mutation.js +1 -2
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.js +1 -1
- package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-type.d.ts +2 -4
- package/dist-server/service/kpi-value/kpi-value-type.js +4 -18
- package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value.d.ts +3 -3
- package/dist-server/service/kpi-value/kpi-value.js +13 -14
- package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/server/service/index.ts +6 -1
- package/server/service/kpi/aggregate-kpi.ts +5 -8
- package/server/service/kpi/kpi-history.ts +9 -1
- package/server/service/kpi/kpi-mutation.ts +1 -1
- package/server/service/kpi/kpi-type.ts +6 -0
- package/server/service/kpi/kpi.ts +21 -0
- package/server/service/kpi-category/kpi-category-mutation.ts +0 -10
- package/server/service/kpi-category/kpi-category-type.ts +12 -6
- package/server/service/kpi-category/kpi-category.ts +6 -6
- package/server/service/kpi-metric/aggregate-kpi-metric.ts +29 -69
- package/server/service/kpi-metric/kpi-metric-mutation.ts +15 -26
- package/server/service/kpi-metric/kpi-metric-type.ts +17 -12
- package/server/service/kpi-metric/kpi-metric.ts +32 -11
- package/server/service/kpi-metric-value/index.ts +7 -0
- package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +215 -0
- package/server/service/kpi-metric-value/kpi-metric-value-query.ts +60 -0
- package/server/service/kpi-metric-value/kpi-metric-value-type.ts +82 -0
- package/server/service/kpi-metric-value/kpi-metric-value.ts +91 -0
- package/server/service/kpi-value/kpi-value-mutation.ts +1 -2
- package/server/service/kpi-value/kpi-value-query.ts +1 -1
- package/server/service/kpi-value/kpi-value-type.ts +4 -16
- package/server/service/kpi-value/kpi-value.ts +14 -14
- package/things-factory.config.js +5 -3
- package/translations/en.json +8 -1
- package/translations/ja.json +8 -1
- package/translations/ko.json +9 -2
- package/translations/ms.json +9 -2
- package/translations/zh.json +8 -1
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +0 -1
- package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\n\nimport { KpiCategory } from './kpi-category'\nimport { NewKpiCategory, KpiCategoryPatch } from './kpi-category-type'\n\n@Resolver(KpiCategory)\nexport class KpiCategoryMutation {\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'Create a new KPI category with the provided details.' })\n async createKpiCategory(\n @Arg('category', { description: 'Input object containing details for the new KPI category.' })\n category: NewKpiCategory,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n let parent = category.parentId\n ? await getRepository(KpiCategory).findOne({ where: { id: category.parentId } })\n : undefined\n\n const result = await getRepository(KpiCategory, tx).save({\n ...category,\n parent,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'To modify KpiCategory information' })\n async updateKpiCategory(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiCategoryPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiCategory, tx)\n const kpiCategory = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let parent = patch.parentId\n ? await getRepository(KpiCategory).findOne({ where: { id: patch.parentId } })\n : kpiCategory.parent\n\n const result = await repository.save({\n ...kpiCategory,\n ...patch,\n parent,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => [KpiCategory], { description: \"To modify multiple KpiCategories' information\" })\n async updateMultipleKpiCategory(\n @Arg('patches', type => [KpiCategoryPatch]) patches: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiCategoryRepo = getRepository(KpiCategory, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiCategoryRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiCategory = await kpiCategoryRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiCategoryRepo.save({\n ...kpiCategory,\n ...updateRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete KpiCategory' })\n async deleteKpiCategory(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiCategories' })\n async deleteKpiCategories(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiCategories' })\n async importKpiCategories(\n @Arg('kpiCategories', type => [KpiCategoryPatch]) kpiCategories: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiCategories.map(async (kpiCategory: KpiCategoryPatch) => {\n const createdKpiCategory: KpiCategory = await getRepository(KpiCategory, tx).save({ domain, ...kpiCategory })\n })\n )\n\n return true\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-category-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\n\nimport { KpiCategory } from './kpi-category'\nimport { NewKpiCategory, KpiCategoryPatch } from './kpi-category-type'\n\n@Resolver(KpiCategory)\nexport class KpiCategoryMutation {\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'Create a new KPI category with the provided details.' })\n async createKpiCategory(\n @Arg('category', { description: 'Input object containing details for the new KPI category.' })\n category: NewKpiCategory,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(KpiCategory, tx).save({\n ...category,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => KpiCategory, { description: 'To modify KpiCategory information' })\n async updateKpiCategory(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiCategoryPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiCategory, tx)\n const kpiCategory = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...kpiCategory,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => [KpiCategory], { description: \"To modify multiple KpiCategories' information\" })\n async updateMultipleKpiCategory(\n @Arg('patches', type => [KpiCategoryPatch]) patches: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiCategory[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiCategoryRepo = getRepository(KpiCategory, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiCategoryRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiCategory = await kpiCategoryRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiCategoryRepo.save({\n ...kpiCategory,\n ...updateRecord,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete KpiCategory' })\n async deleteKpiCategory(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiCategories' })\n async deleteKpiCategories(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiCategory, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiCategories' })\n async importKpiCategories(\n @Arg('kpiCategories', type => [KpiCategoryPatch]) kpiCategories: KpiCategoryPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiCategories.map(async (kpiCategory: KpiCategoryPatch) => {\n const createdKpiCategory: KpiCategory = await getRepository(KpiCategory, tx).save({ domain, ...kpiCategory })\n })\n )\n\n return true\n }\n}\n"]}
|
|
@@ -2,15 +2,17 @@ import { KpiCategory } from './kpi-category';
|
|
|
2
2
|
export declare class NewKpiCategory {
|
|
3
3
|
name: string;
|
|
4
4
|
description?: string;
|
|
5
|
-
parentId?: string;
|
|
6
5
|
active?: boolean;
|
|
6
|
+
formula?: string;
|
|
7
|
+
weight?: number;
|
|
7
8
|
}
|
|
8
9
|
export declare class KpiCategoryPatch {
|
|
9
10
|
id?: string;
|
|
10
11
|
name?: string;
|
|
11
12
|
description?: string;
|
|
12
|
-
parentId?: string;
|
|
13
13
|
active?: boolean;
|
|
14
|
+
formula?: string;
|
|
15
|
+
weight?: number;
|
|
14
16
|
cuFlag?: string;
|
|
15
17
|
}
|
|
16
18
|
export declare class KpiCategoryList {
|
|
@@ -15,14 +15,18 @@ tslib_1.__decorate([
|
|
|
15
15
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Detailed description of this KPI category.' }),
|
|
16
16
|
tslib_1.__metadata("design:type", String)
|
|
17
17
|
], NewKpiCategory.prototype, "description", void 0);
|
|
18
|
-
tslib_1.__decorate([
|
|
19
|
-
(0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true, description: 'ID of the parent category, if any.' }),
|
|
20
|
-
tslib_1.__metadata("design:type", String)
|
|
21
|
-
], NewKpiCategory.prototype, "parentId", void 0);
|
|
22
18
|
tslib_1.__decorate([
|
|
23
19
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Whether this category is active (usable) or not.' }),
|
|
24
20
|
tslib_1.__metadata("design:type", Boolean)
|
|
25
21
|
], NewKpiCategory.prototype, "active", void 0);
|
|
22
|
+
tslib_1.__decorate([
|
|
23
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Aggregation formula using child KPI codes.' }),
|
|
24
|
+
tslib_1.__metadata("design:type", String)
|
|
25
|
+
], NewKpiCategory.prototype, "formula", void 0);
|
|
26
|
+
tslib_1.__decorate([
|
|
27
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in higher-level summary.' }),
|
|
28
|
+
tslib_1.__metadata("design:type", Number)
|
|
29
|
+
], NewKpiCategory.prototype, "weight", void 0);
|
|
26
30
|
exports.NewKpiCategory = NewKpiCategory = tslib_1.__decorate([
|
|
27
31
|
(0, type_graphql_1.InputType)({
|
|
28
32
|
description: 'Input type for creating a new KPI category. Used in mutations to provide category details.'
|
|
@@ -43,14 +47,18 @@ tslib_1.__decorate([
|
|
|
43
47
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Detailed description of this KPI category.' }),
|
|
44
48
|
tslib_1.__metadata("design:type", String)
|
|
45
49
|
], KpiCategoryPatch.prototype, "description", void 0);
|
|
46
|
-
tslib_1.__decorate([
|
|
47
|
-
(0, type_graphql_1.Field)(type => type_graphql_1.ID, { nullable: true, description: 'ID of the parent category, if any.' }),
|
|
48
|
-
tslib_1.__metadata("design:type", String)
|
|
49
|
-
], KpiCategoryPatch.prototype, "parentId", void 0);
|
|
50
50
|
tslib_1.__decorate([
|
|
51
51
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Whether this category is active (usable) or not.' }),
|
|
52
52
|
tslib_1.__metadata("design:type", Boolean)
|
|
53
53
|
], KpiCategoryPatch.prototype, "active", void 0);
|
|
54
|
+
tslib_1.__decorate([
|
|
55
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Aggregation formula using child KPI codes.' }),
|
|
56
|
+
tslib_1.__metadata("design:type", String)
|
|
57
|
+
], KpiCategoryPatch.prototype, "formula", void 0);
|
|
58
|
+
tslib_1.__decorate([
|
|
59
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in higher-level summary.' }),
|
|
60
|
+
tslib_1.__metadata("design:type", Number)
|
|
61
|
+
], KpiCategoryPatch.prototype, "weight", void 0);
|
|
54
62
|
tslib_1.__decorate([
|
|
55
63
|
(0, type_graphql_1.Field)({ nullable: true, description: 'Custom flag for update operations (internal use).' }),
|
|
56
64
|
tslib_1.__metadata("design:type", String)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category-type.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-type.ts"],"names":[],"mappings":";;;;AAEA,+CAAsF;AAItF,iDAA4C;AAKrC,IAAM,cAAc,GAApB,MAAM,cAAc;
|
|
1
|
+
{"version":3,"file":"kpi-category-type.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category-type.ts"],"names":[],"mappings":";;;;AAEA,+CAAsF;AAItF,iDAA4C;AAKrC,IAAM,cAAc,GAApB,MAAM,cAAc;CAe1B,CAAA;AAfY,wCAAc;AAEzB;IADC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;4CACxC;AAGZ;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;mDACjE;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;8CAC3E;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;+CACrE;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;;8CAC3E;yBAdJ,cAAc;IAH1B,IAAA,wBAAS,EAAC;QACT,WAAW,EAAE,4FAA4F;KAC1G,CAAC;GACW,cAAc,CAe1B;AAKM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;CAqB5B,CAAA;AArBY,4CAAgB;AAE3B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC;;4CAC7E;AAGX;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;8CACvD;AAGb;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;qDACjE;AAGpB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;gDAC3E;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;iDACrE;AAGhB;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;;gDAC3E;AAGf;IADC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;;gDAC7E;2BApBJ,gBAAgB;IAH5B,IAAA,wBAAS,EAAC;QACT,WAAW,EAAE,gGAAgG;KAC9G,CAAC;GACW,gBAAgB,CAqB5B;AAGM,IAAM,eAAe,GAArB,MAAM,eAAe;CAM3B,CAAA;AANY,0CAAe;AAE1B;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,0BAAW,CAAC,CAAC;;8CACT;AAGpB;IADC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,kBAAG,CAAC;;8CACN;0BALF,eAAe;IAD3B,IAAA,yBAAU,GAAE;GACA,eAAe,CAM3B","sourcesContent":["import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'\nimport GraphQLUpload from 'graphql-upload/GraphQLUpload.js'\nimport { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'\n\nimport { ObjectRef, ScalarObject } from '@things-factory/shell'\n\nimport { KpiCategory } from './kpi-category'\n\n@InputType({\n description: 'Input type for creating a new KPI category. Used in mutations to provide category details.'\n})\nexport class NewKpiCategory {\n @Field({ description: 'Name of the KPI category.' })\n name: string\n\n @Field({ nullable: true, description: 'Detailed description of this KPI category.' })\n description?: string\n\n @Field({ nullable: true, description: 'Whether this category is active (usable) or not.' })\n active?: boolean\n\n @Field({ nullable: true, description: 'Aggregation formula using child KPI codes.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in higher-level summary.' })\n weight?: number\n}\n\n@InputType({\n description: 'Input type for updating an existing KPI category. Used in mutations to patch category details.'\n})\nexport class KpiCategoryPatch {\n @Field(type => ID, { nullable: true, description: 'ID of the KPI category to update.' })\n id?: string\n\n @Field({ nullable: true, description: 'Name of the KPI category.' })\n name?: string\n\n @Field({ nullable: true, description: 'Detailed description of this KPI category.' })\n description?: string\n\n @Field({ nullable: true, description: 'Whether this category is active (usable) or not.' })\n active?: boolean\n\n @Field({ nullable: true, description: 'Aggregation formula using child KPI codes.' })\n formula?: string\n\n @Field({ nullable: true, description: 'Weight for aggregation in higher-level summary.' })\n weight?: number\n\n @Field({ nullable: true, description: 'Custom flag for update operations (internal use).' })\n cuFlag?: string\n}\n\n@ObjectType()\nexport class KpiCategoryList {\n @Field(type => [KpiCategory])\n items: KpiCategory[]\n\n @Field(type => Int)\n total: number\n}\n"]}
|
|
@@ -41,15 +41,15 @@ tslib_1.__decorate([
|
|
|
41
41
|
tslib_1.__metadata("design:type", Boolean)
|
|
42
42
|
], KpiCategory.prototype, "active", void 0);
|
|
43
43
|
tslib_1.__decorate([
|
|
44
|
-
(0, typeorm_1.
|
|
45
|
-
(0, type_graphql_1.Field)(
|
|
46
|
-
tslib_1.__metadata("design:type", KpiCategory)
|
|
47
|
-
], KpiCategory.prototype, "parent", void 0);
|
|
48
|
-
tslib_1.__decorate([
|
|
49
|
-
(0, typeorm_1.RelationId)((category) => category.parent),
|
|
50
|
-
(0, type_graphql_1.Field)({ nullable: true, description: 'ID of the parent category, if any.' }),
|
|
44
|
+
(0, typeorm_1.Column)({ nullable: true }),
|
|
45
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Aggregation formula using child KPI codes.' }),
|
|
51
46
|
tslib_1.__metadata("design:type", String)
|
|
52
|
-
], KpiCategory.prototype, "
|
|
47
|
+
], KpiCategory.prototype, "formula", void 0);
|
|
48
|
+
tslib_1.__decorate([
|
|
49
|
+
(0, typeorm_1.Column)({ type: 'float', nullable: true, default: 1 }),
|
|
50
|
+
(0, type_graphql_1.Field)({ nullable: true, description: 'Weight for aggregation in higher-level summary.' }),
|
|
51
|
+
tslib_1.__metadata("design:type", Number)
|
|
52
|
+
], KpiCategory.prototype, "weight", void 0);
|
|
53
53
|
tslib_1.__decorate([
|
|
54
54
|
(0, typeorm_1.ManyToOne)(type => auth_base_1.User, { nullable: true }),
|
|
55
55
|
(0, type_graphql_1.Field)(type => auth_base_1.User, { nullable: true, description: 'User who created this KPI category.' }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-category.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category.ts"],"names":[],"mappings":";;;;AAAA,qCAUgB;AAChB,+CAAyD;AAEzD,iDAA8C;AAC9C,yDAAgD;AAChD,oCAAgC;AAUzB,IAAM,WAAW,GAAjB,MAAM,WAAW;CA4DvB,CAAA;AA5DY,kCAAW;AAGb;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;uCAC5D;AAInB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,cAAM,CAAC;IACzB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;sCACrF,cAAM;2CAAA;AAIf;IAFC,IAAA,oBAAU,EAAC,CAAC,QAAqB,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;IACtD,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;6CAC1E;AAIjB;IAFC,IAAA,gBAAM,GAAE;IACR,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC;;yCACxC;AAIZ;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1B,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;;gDACjE;AAIpB;IAFC,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3C,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,kDAAkD,EAAE,CAAC;;2CAC3E;AAIhB;IAFC,IAAA,
|
|
1
|
+
{"version":3,"file":"kpi-category.js","sourceRoot":"","sources":["../../../server/service/kpi-category/kpi-category.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateDateColumn,\n UpdateDateColumn,\n Entity,\n Index,\n Column,\n RelationId,\n ManyToOne,\n OneToMany,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Field, Int, ID } from 'type-graphql'\n\nimport { Domain } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { Kpi } from '../kpi/kpi'\n\n@Entity()\n@Index('ix_kpi_category_0', (kpiCategory: KpiCategory) => [kpiCategory.domain, kpiCategory.name], {\n unique: true\n})\n@ObjectType({\n description:\n 'KPI category entity. Represents a classification or group for KPIs. Supports hierarchical (tree) structure.'\n})\nexport class KpiCategory {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'Unique identifier for this KPI category.' })\n readonly id: string\n\n @ManyToOne(type => Domain)\n @Field({ nullable: true, description: 'Domain (tenant) to which this KPI category belongs.' })\n domain?: Domain\n\n @RelationId((category: KpiCategory) => category.domain)\n @Field({ nullable: true, description: 'ID of the domain (tenant) for this KPI category.' })\n domainId?: string\n\n @Column()\n @Field({ description: 'Name of the KPI category.' })\n name: string\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Detailed description of this KPI category.' })\n description?: string\n\n @Column({ nullable: false, default: false })\n @Field({ nullable: true, description: 'Whether this category is active (usable) or not.' })\n active?: boolean\n\n @Column({ nullable: true })\n @Field({ nullable: true, description: 'Aggregation formula using child KPI codes.' })\n formula?: string\n\n @Column({ type: 'float', nullable: true, default: 1 })\n @Field({ nullable: true, description: 'Weight for aggregation in higher-level summary.' })\n weight?: number\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who created this KPI category.' })\n creator?: User\n\n @RelationId((category: KpiCategory) => category.creator)\n @Field({ nullable: true, description: 'ID of the user who created this KPI category.' })\n creatorId?: string\n\n @ManyToOne(type => User, { nullable: true })\n @Field(type => User, { nullable: true, description: 'User who last updated this KPI category.' })\n updater?: User\n\n @RelationId((category: KpiCategory) => category.updater)\n @Field({ nullable: true, description: 'ID of the user who last updated this KPI category.' })\n updaterId?: string\n\n @CreateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI category was created.' })\n createdAt?: Date\n\n @UpdateDateColumn()\n @Field({ nullable: true, description: 'Timestamp when this KPI category was last updated.' })\n updatedAt?: Date\n\n @OneToMany(type => Kpi, kpi => kpi.category)\n @Field(type => [Kpi], { nullable: true, description: 'List of KPIs belonging to this category.' })\n kpis?: Kpi[]\n}\n"]}
|
|
@@ -7,7 +7,6 @@ const finalize_data_collection_1 = require("@things-factory/dataset/dist-server/
|
|
|
7
7
|
const kpi_metric_1 = require("./kpi-metric");
|
|
8
8
|
const kpi_value_1 = require("../kpi-value/kpi-value");
|
|
9
9
|
const kpi_1 = require("../kpi/kpi");
|
|
10
|
-
const kpi_formula_service_1 = require("../kpi/kpi-formula.service");
|
|
11
10
|
/**
|
|
12
11
|
* KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)
|
|
13
12
|
* @param metricId KPI-Metric ID
|
|
@@ -25,93 +24,52 @@ async function aggregateKpiMetricValue(metricId, domainId, context) {
|
|
|
25
24
|
throw new Error('Metric 정보 없음');
|
|
26
25
|
if (!metric.active)
|
|
27
26
|
throw new Error('비활성화된 Metric');
|
|
28
|
-
//
|
|
27
|
+
// formula 분기 제거: metric은 항상 dataset 집계만 수행
|
|
29
28
|
let values = [];
|
|
30
|
-
if (metric.
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
// formula 계산 (js eval, 보안상 제한적 사용)
|
|
54
|
-
for (const key in groupMap) {
|
|
55
|
-
const ctx = groupMap[key]._values;
|
|
56
|
-
let value = null;
|
|
57
|
-
try {
|
|
58
|
-
value = Function(...Object.keys(ctx), `return (${metric.formula})`)(...Object.values(ctx));
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
value = null;
|
|
62
|
-
}
|
|
63
|
-
values.push({ ...groupMap[key], value });
|
|
29
|
+
if (!metric.dataSetId || !metric.fieldName)
|
|
30
|
+
throw new Error('Metric 매핑 정보 누락');
|
|
31
|
+
await (0, finalize_data_collection_1.finalizeLatestDataCollection)(metric.dataSetId, context);
|
|
32
|
+
const summaries = await (0, shell_1.getRepository)(dataset_1.DataSummary).find({
|
|
33
|
+
where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },
|
|
34
|
+
order: { date: 'DESC', period: 'DESC' }
|
|
35
|
+
});
|
|
36
|
+
values = summaries
|
|
37
|
+
.map(summary => {
|
|
38
|
+
if (summary.summary && metric.fieldName in summary.summary) {
|
|
39
|
+
return {
|
|
40
|
+
date: summary.date,
|
|
41
|
+
period: summary.period,
|
|
42
|
+
value: summary.summary[metric.fieldName],
|
|
43
|
+
group: {
|
|
44
|
+
key01: summary.key01,
|
|
45
|
+
key02: summary.key02,
|
|
46
|
+
key03: summary.key03,
|
|
47
|
+
key04: summary.key04,
|
|
48
|
+
key05: summary.key05
|
|
49
|
+
}
|
|
50
|
+
};
|
|
64
51
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (!metric.dataSetId || !metric.fieldName)
|
|
69
|
-
throw new Error('Metric 매핑 정보 누락');
|
|
70
|
-
await (0, finalize_data_collection_1.finalizeLatestDataCollection)(metric.dataSetId, context);
|
|
71
|
-
// 4. 집계 결과(summary)에서 metric.fieldName 값 추출
|
|
72
|
-
const summaries = await (0, shell_1.getRepository)(dataset_1.DataSummary).find({
|
|
73
|
-
where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },
|
|
74
|
-
order: { date: 'DESC', period: 'DESC' }
|
|
75
|
-
});
|
|
76
|
-
values = summaries
|
|
77
|
-
.map(summary => {
|
|
78
|
-
if (summary.summary && metric.fieldName in summary.summary) {
|
|
79
|
-
return {
|
|
80
|
-
date: summary.date,
|
|
81
|
-
period: summary.period,
|
|
82
|
-
value: summary.summary[metric.fieldName],
|
|
83
|
-
group: {
|
|
84
|
-
key01: summary.key01,
|
|
85
|
-
key02: summary.key02,
|
|
86
|
-
key03: summary.key03,
|
|
87
|
-
key04: summary.key04,
|
|
88
|
-
key05: summary.key05
|
|
89
|
-
}
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
return null;
|
|
93
|
-
})
|
|
94
|
-
.filter(Boolean);
|
|
95
|
-
}
|
|
52
|
+
return null;
|
|
53
|
+
})
|
|
54
|
+
.filter(Boolean);
|
|
96
55
|
// 5. KPI Value로 저장 (metric 단위, KPI 단위 formula는 후속)
|
|
97
56
|
// metric이 속한 KPI 정보 조회 (여기서는 metric.name == kpi.name인 KPI를 임시로 매핑, 실제 연동 구조에 맞게 보완 필요)
|
|
98
57
|
const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } });
|
|
99
58
|
if (!kpi)
|
|
100
59
|
throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)');
|
|
101
|
-
// KPI Value version, valueDate,
|
|
60
|
+
// KPI Value version, valueDate, group 등 매핑
|
|
102
61
|
const savedValues = [];
|
|
103
62
|
for (const v of values) {
|
|
104
63
|
const valueDate = v.date;
|
|
105
|
-
const
|
|
106
|
-
const groupType = v.group?.key02;
|
|
64
|
+
const group = v.group;
|
|
107
65
|
const version = kpi.version || 1;
|
|
108
66
|
const value = v.value;
|
|
109
67
|
if (value == null || isNaN(value))
|
|
110
68
|
continue;
|
|
111
|
-
// upsert(동일 KPI, valueDate,
|
|
69
|
+
// upsert(동일 KPI, valueDate, group, version) 기준으로 저장
|
|
112
70
|
const repo = (0, shell_1.getRepository)(kpi_value_1.KpiValue, context.state?.tx);
|
|
113
71
|
const existing = await repo.findOne({
|
|
114
|
-
where: { kpi: { id: kpi.id }, valueDate,
|
|
72
|
+
where: { kpi: { id: kpi.id }, valueDate, group, version, domain: { id: domainId } }
|
|
115
73
|
});
|
|
116
74
|
let entity = existing || repo.create();
|
|
117
75
|
entity.kpi = kpi;
|
|
@@ -119,8 +77,7 @@ async function aggregateKpiMetricValue(metricId, domainId, context) {
|
|
|
119
77
|
entity.version = version;
|
|
120
78
|
entity.valueDate = valueDate;
|
|
121
79
|
entity.value = value;
|
|
122
|
-
entity.
|
|
123
|
-
entity.groupType = groupType;
|
|
80
|
+
entity.group = group;
|
|
124
81
|
entity.inputType = kpi_value_1.KpiValueInputType.AUTO;
|
|
125
82
|
entity.source = 'AUTO';
|
|
126
83
|
entity.domain = kpi.domain;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-kpi-metric.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/aggregate-kpi-metric.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { DataSummary } from '@things-factory/dataset'\nimport { finalizeLatestDataCollection } from '@things-factory/dataset/dist-server/controllers/finalize-data-collection'\nimport { KpiMetric } from './kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\n\n/**\n * KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)\n * @param metricId KPI-Metric ID\n * @param domainId 도메인 ID\n * @param context ResolverContext (state에 domain, user, tx 등 포함)\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiMetricValue(metricId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(KpiMetric).manager\n\n // 1. metric 정보 조회\n const metric = await getRepository(KpiMetric).findOne({\n where: { id: metricId, domain: { id: domainId } }\n })\n if (!metric) throw new Error('Metric 정보 없음')\n if (!metric.active) throw new Error('비활성화된 Metric')\n\n // 2. formula가 있으면 산식 계산, 없으면 dataset 집계\n let values: any[] = []\n if (metric.formula) {\n // formula 파싱 및 metric code별 값 계산\n const formulaService = new KpiFormulaService()\n const metricCodes = formulaService.extractMetricCodes(metric.formula)\n // code별 값 집계 (동일 기간/그룹 기준)\n const codeValueMap: Record<string, any[]> = {}\n for (const code of metricCodes) {\n const subMetric = await getRepository(KpiMetric).findOne({ where: { name: code, domain: { id: domainId } } })\n if (!subMetric) throw new Error(`Formula metric '${code}' not found`)\n codeValueMap[code] = await aggregateKpiMetricValue(subMetric.id, domainId, context)\n }\n // group/date/period별로 값 매핑\n // (여기서는 가장 최근 기간 기준, group key 조합으로 매핑)\n const groupKey = v =>\n [v.date, v.period, v.group?.key01, v.group?.key02, v.group?.key03, v.group?.key04, v.group?.key05].join('|')\n const groupMap: Record<string, any> = {}\n for (const code of metricCodes) {\n for (const v of codeValueMap[code]) {\n const key = groupKey(v)\n groupMap[key] = groupMap[key] || { ...v, _values: {} }\n groupMap[key]._values[code] = v.value\n }\n }\n // formula 계산 (js eval, 보안상 제한적 사용)\n for (const key in groupMap) {\n const ctx = groupMap[key]._values\n let value = null\n try {\n value = Function(...Object.keys(ctx), `return (${metric.formula})`)(...Object.values(ctx))\n } catch (e) {\n value = null\n }\n values.push({ ...groupMap[key], value })\n }\n } else {\n // 3. dataset 집계/마감 실행 (최신 기간 기준)\n if (!metric.dataSetId || !metric.fieldName) throw new Error('Metric 매핑 정보 누락')\n await finalizeLatestDataCollection(metric.dataSetId, context)\n // 4. 집계 결과(summary)에서 metric.fieldName 값 추출\n const summaries = await getRepository(DataSummary).find({\n where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },\n order: { date: 'DESC', period: 'DESC' }\n })\n values = summaries\n .map(summary => {\n if (summary.summary && metric.fieldName in summary.summary) {\n return {\n date: summary.date,\n period: summary.period,\n value: summary.summary[metric.fieldName],\n group: {\n key01: summary.key01,\n key02: summary.key02,\n key03: summary.key03,\n key04: summary.key04,\n key05: summary.key05\n }\n }\n }\n return null\n })\n .filter(Boolean)\n }\n\n // 5. KPI Value로 저장 (metric 단위, KPI 단위 formula는 후속)\n // metric이 속한 KPI 정보 조회 (여기서는 metric.name == kpi.name인 KPI를 임시로 매핑, 실제 연동 구조에 맞게 보완 필요)\n const kpi = await getRepository(Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)')\n\n // KPI Value version, valueDate, groupId, groupType 등 매핑\n const savedValues = []\n for (const v of values) {\n const valueDate = v.date\n const groupId = v.group?.key01\n const groupType = v.group?.key02\n const version = kpi.version || 1\n const value = v.value\n if (value == null || isNaN(value)) continue\n // upsert(동일 KPI, valueDate, groupId, groupType, version) 기준으로 저장\n const repo = getRepository(KpiValue, context.state?.tx)\n const existing = await repo.findOne({\n where: { kpi: { id: kpi.id }, valueDate, groupId, groupType, version, domain: { id: domainId } }\n })\n let entity = existing || repo.create()\n entity.kpi = kpi\n entity.kpiId = kpi.id\n entity.version = version\n entity.valueDate = valueDate\n entity.value = value\n entity.groupId = groupId\n entity.groupType = groupType\n entity.inputType = KpiValueInputType.AUTO\n entity.source = 'AUTO'\n entity.domain = kpi.domain\n entity.creator = context.state?.user\n entity.updater = context.state?.user\n entity = await repo.save(entity)\n savedValues.push(entity)\n }\n return savedValues\n}\n"]}
|
|
1
|
+
{"version":3,"file":"aggregate-kpi-metric.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/aggregate-kpi-metric.ts"],"names":[],"mappings":"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","sourcesContent":["import { getRepository } from '@things-factory/shell'\nimport { DataSummary } from '@things-factory/dataset'\nimport { finalizeLatestDataCollection } from '@things-factory/dataset/dist-server/controllers/finalize-data-collection'\nimport { KpiMetric } from './kpi-metric'\nimport { KpiValue, KpiValueInputType } from '../kpi-value/kpi-value'\nimport { Kpi } from '../kpi/kpi'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\n\n/**\n * KPI-Metric 집계/자동화 서비스 함수 (formula 지원, KPI Value 저장)\n * @param metricId KPI-Metric ID\n * @param domainId 도메인 ID\n * @param context ResolverContext (state에 domain, user, tx 등 포함)\n * @returns 저장된 KPI Value 배열\n */\nexport async function aggregateKpiMetricValue(metricId: string, domainId: string, context: ResolverContext) {\n const tx = context.state?.tx || getRepository(KpiMetric).manager\n\n // 1. metric 정보 조회\n const metric = await getRepository(KpiMetric).findOne({\n where: { id: metricId, domain: { id: domainId } }\n })\n if (!metric) throw new Error('Metric 정보 없음')\n if (!metric.active) throw new Error('비활성화된 Metric')\n\n // formula 분기 제거: metric은 항상 dataset 집계만 수행\n let values: any[] = []\n if (!metric.dataSetId || !metric.fieldName) throw new Error('Metric 매핑 정보 누락')\n await finalizeLatestDataCollection(metric.dataSetId, context)\n const summaries = await getRepository(DataSummary).find({\n where: { dataSet: { id: metric.dataSetId }, domain: { id: domainId } },\n order: { date: 'DESC', period: 'DESC' }\n })\n values = summaries\n .map(summary => {\n if (summary.summary && metric.fieldName in summary.summary) {\n return {\n date: summary.date,\n period: summary.period,\n value: summary.summary[metric.fieldName],\n group: {\n key01: summary.key01,\n key02: summary.key02,\n key03: summary.key03,\n key04: summary.key04,\n key05: summary.key05\n }\n }\n }\n return null\n })\n .filter(Boolean)\n\n // 5. KPI Value로 저장 (metric 단위, KPI 단위 formula는 후속)\n // metric이 속한 KPI 정보 조회 (여기서는 metric.name == kpi.name인 KPI를 임시로 매핑, 실제 연동 구조에 맞게 보완 필요)\n const kpi = await getRepository(Kpi).findOne({ where: { name: metric.name, domain: { id: domainId } } })\n if (!kpi) throw new Error('KPI 정보 없음 (metric.name과 동일한 KPI name 기준, 실제 연동 구조에 맞게 보완 필요)')\n\n // KPI Value version, valueDate, group 등 매핑\n const savedValues = []\n for (const v of values) {\n const valueDate = v.date\n const group = v.group\n const version = kpi.version || 1\n const value = v.value\n if (value == null || isNaN(value)) continue\n // upsert(동일 KPI, valueDate, group, version) 기준으로 저장\n const repo = getRepository(KpiValue, context.state?.tx)\n const existing = await repo.findOne({\n where: { kpi: { id: kpi.id }, valueDate, group, version, domain: { id: domainId } }\n })\n let entity = existing || repo.create()\n entity.kpi = kpi\n entity.kpiId = kpi.id\n entity.version = version\n entity.valueDate = valueDate\n entity.value = value\n entity.group = group\n entity.inputType = KpiValueInputType.AUTO\n entity.source = 'AUTO'\n entity.domain = kpi.domain\n entity.creator = context.state?.user\n entity.updater = context.state?.user\n entity = await repo.save(entity)\n savedValues.push(entity)\n }\n return savedValues\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KpiMetric } from './kpi-metric';
|
|
2
2
|
import { NewKpiMetric, KpiMetricPatch } from './kpi-metric-type';
|
|
3
3
|
export declare class KpiMetricMutation {
|
|
4
|
-
createKpiMetric(
|
|
4
|
+
createKpiMetric(kpiMetric: NewKpiMetric, context: ResolverContext): Promise<KpiMetric>;
|
|
5
5
|
updateKpiMetric(id: string, patch: KpiMetricPatch, context: ResolverContext): Promise<KpiMetric>;
|
|
6
6
|
updateMultipleKpiMetric(patches: KpiMetricPatch[], context: ResolverContext): Promise<KpiMetric[]>;
|
|
7
7
|
deleteKpiMetric(id: string, context: ResolverContext): Promise<boolean>;
|
|
@@ -9,32 +9,25 @@ const dataset_1 = require("@things-factory/dataset");
|
|
|
9
9
|
const attachment_base_1 = require("@things-factory/attachment-base");
|
|
10
10
|
const kpi_metric_1 = require("./kpi-metric");
|
|
11
11
|
const kpi_metric_type_1 = require("./kpi-metric-type");
|
|
12
|
-
const kpi_formula_service_1 = require("../kpi/kpi-formula.service");
|
|
13
12
|
const scheduler_client_1 = require("@things-factory/scheduler-client");
|
|
14
13
|
let KpiMetricMutation = class KpiMetricMutation {
|
|
15
|
-
async createKpiMetric(
|
|
14
|
+
async createKpiMetric(kpiMetric, context) {
|
|
16
15
|
const { domain, user, tx } = context.state;
|
|
17
|
-
let dataSet =
|
|
18
|
-
? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id:
|
|
16
|
+
let dataSet = kpiMetric.dataSetId
|
|
17
|
+
? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id: kpiMetric.dataSetId } })
|
|
19
18
|
: undefined;
|
|
20
|
-
|
|
21
|
-
const formulaService = new kpi_formula_service_1.KpiFormulaService();
|
|
22
|
-
const result = await formulaService.validateFormula(metric.formula);
|
|
23
|
-
if (!result.valid) {
|
|
24
|
-
throw new Error(result.errors.join('\n'));
|
|
25
|
-
}
|
|
26
|
-
}
|
|
19
|
+
// formula 관련 로직 완전 제거
|
|
27
20
|
const result = await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric, tx).save({
|
|
28
|
-
...
|
|
21
|
+
...kpiMetric,
|
|
29
22
|
dataSet,
|
|
30
23
|
domain,
|
|
31
24
|
creator: user,
|
|
32
25
|
updater: user
|
|
33
26
|
});
|
|
34
27
|
// 스케줄러 등록
|
|
35
|
-
if (
|
|
28
|
+
if (kpiMetric.schedule) {
|
|
36
29
|
const handle = await (0, scheduler_client_1.registerSchedule)({
|
|
37
|
-
name:
|
|
30
|
+
name: kpiMetric.name,
|
|
38
31
|
client: {
|
|
39
32
|
application: scheduler_client_1.Application,
|
|
40
33
|
group: `${domain.id}`,
|
|
@@ -43,8 +36,8 @@ let KpiMetricMutation = class KpiMetricMutation {
|
|
|
43
36
|
operation: 'aggregate'
|
|
44
37
|
},
|
|
45
38
|
type: 'cron',
|
|
46
|
-
schedule:
|
|
47
|
-
timezone:
|
|
39
|
+
schedule: kpiMetric.schedule,
|
|
40
|
+
timezone: kpiMetric.timezone,
|
|
48
41
|
task: {
|
|
49
42
|
type: 'rest',
|
|
50
43
|
connection: {
|
|
@@ -65,13 +58,13 @@ let KpiMetricMutation = class KpiMetricMutation {
|
|
|
65
58
|
}
|
|
66
59
|
});
|
|
67
60
|
result.scheduleId = handle;
|
|
68
|
-
result.timezone =
|
|
61
|
+
result.timezone = kpiMetric.timezone;
|
|
69
62
|
await (0, shell_1.getRepository)(kpi_metric_1.KpiMetric, tx).save(result);
|
|
70
63
|
}
|
|
71
|
-
if (
|
|
64
|
+
if (kpiMetric.thumbnail) {
|
|
72
65
|
await (0, attachment_base_1.createAttachment)(null, {
|
|
73
66
|
attachment: {
|
|
74
|
-
file:
|
|
67
|
+
file: kpiMetric.thumbnail,
|
|
75
68
|
refType: kpi_metric_1.KpiMetric.name,
|
|
76
69
|
refBy: result.id
|
|
77
70
|
}
|
|
@@ -88,13 +81,7 @@ let KpiMetricMutation = class KpiMetricMutation {
|
|
|
88
81
|
let dataSet = patch.dataSetId
|
|
89
82
|
? await (0, shell_1.getRepository)(dataset_1.DataSet).findOne({ where: { id: patch.dataSetId } })
|
|
90
83
|
: kpiMetric.dataSet;
|
|
91
|
-
|
|
92
|
-
const formulaService = new kpi_formula_service_1.KpiFormulaService();
|
|
93
|
-
const result = await formulaService.validateFormula(patch.formula);
|
|
94
|
-
if (!result.valid) {
|
|
95
|
-
throw new Error(result.errors.join('\n'));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
84
|
+
// formula 관련 로직 완전 제거
|
|
98
85
|
const result = await repository.save({
|
|
99
86
|
...kpiMetric,
|
|
100
87
|
...patch,
|
|
@@ -102,7 +89,7 @@ let KpiMetricMutation = class KpiMetricMutation {
|
|
|
102
89
|
updater: user
|
|
103
90
|
});
|
|
104
91
|
// 스케줄러 해제/등록 (변경 시)
|
|
105
|
-
if (kpiMetric.scheduleId && (patch.
|
|
92
|
+
if (kpiMetric.scheduleId && (patch.scheduleId !== kpiMetric.scheduleId || !patch.scheduleId)) {
|
|
106
93
|
await (0, scheduler_client_1.unregisterSchedule)(kpiMetric.scheduleId);
|
|
107
94
|
result.scheduleId = null;
|
|
108
95
|
}
|
|
@@ -237,7 +224,7 @@ exports.KpiMetricMutation = KpiMetricMutation;
|
|
|
237
224
|
tslib_1.__decorate([
|
|
238
225
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
239
226
|
(0, type_graphql_1.Mutation)(returns => kpi_metric_1.KpiMetric, { description: 'Create a new KPI metric with the provided details.' }),
|
|
240
|
-
tslib_1.__param(0, (0, type_graphql_1.Arg)('
|
|
227
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('kpiMetric', { description: 'Input object containing details for the new KPI metric.' })),
|
|
241
228
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
242
229
|
tslib_1.__metadata("design:type", Function),
|
|
243
230
|
tslib_1.__metadata("design:paramtypes", [kpi_metric_type_1.NewKpiMetric, Object]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-metric-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/kpi-metric-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAC5B,iDAAqD;AACrD,qDAAiD;AAEjD,qEAA0F;AAC1F,6CAAwC;AACxC,uDAAgE;AAChE,oEAA8D;AAC9D,uEAAkH;AAG3G,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAGtB,AAAN,KAAK,CAAC,eAAe,CACwE,MAAoB,EACxG,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS;YAC5B,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YAC3E,CAAC,CAAC,SAAS,CAAA;QAEb,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,cAAc,GAAG,IAAI,uCAAiB,EAAE,CAAA;YAC9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACnE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;YACrD,GAAG,MAAM;YACT,OAAO;YACP,MAAM;YACN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,UAAU;QACV,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAgB,EAAC;gBACpC,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,MAAM,EAAE;oBACN,WAAW,EAAE,8BAAW;oBACxB,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE;oBACrB,IAAI,EAAE,YAAY;oBAClB,GAAG,EAAE,MAAM,CAAC,EAAE;oBACd,SAAS,EAAE,WAAW;iBACvB;gBACD,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE;wBACV,IAAI,EAAE,GAAG,+BAAY,mCAAmC;wBACxD,OAAO,EAAE;4BACP,cAAc,EAAE,kBAAkB;4BAClC,MAAM,EAAE,KAAK;yBACd;qBACF;oBACD,IAAI,EAAE;wBACJ,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;qBACpB;oBACD,aAAa,EAAE,IAAI;oBACnB,aAAa,EAAE,WAAW;oBAC1B,eAAe,EAAE,CAAC;oBAClB,YAAY,EAAE,EAAE;iBACjB;aACF,CAAC,CAAA;YACF,MAAM,CAAC,UAAU,GAAG,MAAM,CAAA;YAC1B,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;YACjC,MAAM,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,MAAM,CAAC,SAAS;oBACtB,OAAO,EAAE,sBAAS,CAAC,IAAI;oBACvB,KAAK,EAAE,MAAM,CAAC,EAAE;iBACjB;aACF,EACD,OAAO,CACR,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAIK,AAAN,KAAK,CAAC,eAAe,CACR,EAAU,EACP,KAAqB,EAC5B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAA;QAC/C,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACzC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;SACzC,CAAC,CAAA;QAEF,IAAI,OAAO,GAAG,KAAK,CAAC,SAAS;YAC3B,CAAC,CAAC,MAAM,IAAA,qBAAa,EAAC,iBAAO,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;YAC1E,CAAC,CAAC,SAAS,CAAC,OAAO,CAAA;QAErB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,IAAI,uCAAiB,EAAE,CAAA;YAC9C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAC3C,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;YACnC,GAAG,SAAS;YACZ,GAAG,KAAK;YACR,OAAO;YACP,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,oBAAoB;QACpB,IAAI,SAAS,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvF,MAAM,IAAA,qCAAkB,EAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAC9C,MAAM,CAAC,UAAU,GAAG,IAAI,CAAA;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAgB,EAAC;gBACpC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI;gBAClC,MAAM,EAAE;oBACN,WAAW,EAAE,8BAAW;oBACxB,KAAK,EAAE,GAAG,MAAM,CAAC,EAAE,EAAE;oBACrB,IAAI,EAAE,YAAY;oBAClB,GAAG,EAAE,MAAM,CAAC,EAAE;oBACd,SAAS,EAAE,WAAW;iBACvB;gBACD,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE;oBACJ,IAAI,EAAE,MAAM;oBACZ,UAAU,EAAE;wBACV,IAAI,EAAE,GAAG,+BAAY,mCAAmC;wBACxD,OAAO,EAAE;4BACP,cAAc,EAAE,kBAAkB;4BAClC,MAAM,EAAE,KAAK;yBACd;qBACF;oBACD,IAAI,EAAE;wBACJ,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,QAAQ,EAAE,MAAM,CAAC,EAAE;qBACpB;oBACD,aAAa,EAAE,IAAI;oBACnB,aAAa,EAAE,WAAW;oBAC1B,eAAe,EAAE,CAAC;oBAClB,YAAY,EAAE,EAAE;iBACjB;aACF,CAAC,CAAA;YACF,MAAM,CAAC,UAAU,GAAG,MAAM,CAAA;YAC1B,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;YAChC,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;QAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;YACpE,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;gBACE,UAAU,EAAE;oBACV,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,OAAO,EAAE,sBAAS,CAAC,IAAI;oBACvB,KAAK,EAAE,MAAM,CAAC,EAAE;iBACjB;aACF,EACD,OAAO,CACR,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAIK,AAAN,KAAK,CAAC,uBAAuB,CACe,OAAyB,EAC5D,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,aAAa,GAAG,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAA;QAElD,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBAEnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;oBACtC,GAAG,SAAS;oBACZ,MAAM;oBACN,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;gBAEF,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;oBACxB,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;wBACE,UAAU,EAAE;4BACV,IAAI,EAAE,SAAS,CAAC,SAAS;4BACzB,OAAO,EAAE,sBAAS,CAAC,IAAI;4BACvB,KAAK,EAAE,MAAM,CAAC,EAAE;yBACjB;qBACF,EACD,OAAO,CACR,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBACtC,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;gBAExE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC;oBACtC,GAAG,SAAS;oBACZ,GAAG,YAAY;oBACf,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;gBAEF,IAAI,YAAY,CAAC,SAAS,EAAE,CAAC;oBAC3B,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;oBACpE,MAAM,IAAA,kCAAgB,EACpB,IAAI,EACJ;wBACE,UAAU,EAAE;4BACV,IAAI,EAAE,YAAY,CAAC,SAAS;4BAC5B,OAAO,EAAE,sBAAS,CAAC,IAAI;4BACvB,KAAK,EAAE,MAAM,CAAC,EAAE;yBACjB;qBACF,EACD,OAAO,CACR,CAAA;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAIK,AAAN,KAAK,CAAC,eAAe,CAAY,EAAU,EAAS,OAAwB;QAC1E,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QACpC,MAAM,IAAI,GAAG,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAC/E,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;YACvB,MAAM,IAAA,qCAAkB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAC7C,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QACpD,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAE7D,OAAO,IAAI,CAAA;IACb,CAAC;IAIK,AAAN,KAAK,CAAC,gBAAgB,CACU,GAAa,EACpC,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;YACxC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC;SACZ,CAAC,CAAA;QAEF,MAAM,IAAA,wCAAsB,EAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;QAE5D,OAAO,IAAI,CAAA;IACb,CAAC;IAIK,AAAN,KAAK,CAAC,gBAAgB,CACyB,UAA4B,EAClE,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,OAAO,CAAC,GAAG,CACf,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAyB,EAAE,EAAE;YACjD,MAAM,gBAAgB,GAAc,MAAM,IAAA,qBAAa,EAAC,sBAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC,CAAA;QACvG,CAAC,CAAC,CACH,CAAA;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AA7SY,8CAAiB;AAGtB;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAS,EAAE,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IAEnG,mBAAA,IAAA,kBAAG,EAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAAC,CAAA;IACzF,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAD6F,8BAAY;;wDA8EhH;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,sBAAS,EAAE,EAAE,WAAW,EAAE,iCAAiC,EAAE,CAAC;IAEhF,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IACT,mBAAA,IAAA,kBAAG,EAAC,OAAO,CAAC,CAAA;IACZ,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDADe,gCAAc;;wDAuFpC;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,sBAAS,CAAC,EAAE,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IAE7F,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,gCAAc,CAAC,CAAC,CAAA;IACxC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;gEAqEP;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;wDAWlD;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IAE5E,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5B,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yDAYP;AAIK;IAFL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,+BAA+B,EAAE,CAAC;IAE5E,mBAAA,IAAA,kBAAG,EAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,gCAAc,CAAC,CAAC,CAAA;IAC3C,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;yDAWP;4BA5SU,iBAAiB;IAD7B,IAAA,uBAAQ,EAAC,sBAAS,CAAC;GACP,iBAAiB,CA6S7B","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { DataSet } from '@things-factory/dataset'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { KpiMetric } from './kpi-metric'\nimport { NewKpiMetric, KpiMetricPatch } from './kpi-metric-type'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\nimport { registerSchedule, unregisterSchedule, CallbackBase, Application } from '@things-factory/scheduler-client'\n\n@Resolver(KpiMetric)\nexport class KpiMetricMutation {\n @Directive('@transaction')\n @Mutation(returns => KpiMetric, { description: 'Create a new KPI metric with the provided details.' })\n async createKpiMetric(\n @Arg('metric', { description: 'Input object containing details for the new KPI metric.' }) metric: NewKpiMetric,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n let dataSet = metric.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: metric.dataSetId } })\n : undefined\n\n if (metric.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(metric.formula)\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n const result = await getRepository(KpiMetric, tx).save({\n ...metric,\n dataSet,\n domain,\n creator: user,\n updater: user\n })\n\n // 스케줄러 등록\n if (metric.schedule) {\n const handle = await registerSchedule({\n name: metric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: metric.schedule,\n timezone: metric.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = metric.timezone\n await getRepository(KpiMetric, tx).save(result)\n }\n\n if (metric.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: metric.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => KpiMetric, { description: 'To modify KpiMetric information' })\n async updateKpiMetric(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetric, tx)\n const kpiMetric = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let dataSet = patch.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: patch.dataSetId } })\n : kpiMetric.dataSet\n\n if (patch.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(patch.formula)\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n const result = await repository.save({\n ...kpiMetric,\n ...patch,\n dataSet,\n updater: user\n })\n\n // 스케줄러 해제/등록 (변경 시)\n if (kpiMetric.scheduleId && (patch.schedule !== kpiMetric.schedule || !patch.schedule)) {\n await unregisterSchedule(kpiMetric.scheduleId)\n result.scheduleId = null\n }\n if (patch.schedule) {\n const handle = await registerSchedule({\n name: patch.name || kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: patch.schedule,\n timezone: patch.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = patch.timezone\n await repository.save(result)\n }\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => [KpiMetric], { description: \"To modify multiple KpiMetrics' information\" })\n async updateMultipleKpiMetric(\n @Arg('patches', type => [KpiMetricPatch]) patches: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiMetricRepo = getRepository(KpiMetric, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiMetricRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiMetric = await kpiMetricRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiMetricRepo.save({\n ...kpiMetric,\n ...updateRecord,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetric' })\n async deleteKpiMetric(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n const repo = getRepository(KpiMetric, tx)\n const metric = await repo.findOne({ where: { domain: { id: domain.id }, id } })\n if (metric?.scheduleId) {\n await unregisterSchedule(metric.scheduleId)\n }\n await repo.delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetrics' })\n async deleteKpiMetrics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiMetric, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetrics' })\n async importKpiMetrics(\n @Arg('kpiMetrics', type => [KpiMetricPatch]) kpiMetrics: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiMetrics.map(async (kpiMetric: KpiMetricPatch) => {\n const createdKpiMetric: KpiMetric = await getRepository(KpiMetric, tx).save({ domain, ...kpiMetric })\n })\n )\n\n return true\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-metric-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric/kpi-metric-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { In } from 'typeorm'\nimport { getRepository } from '@things-factory/shell'\nimport { DataSet } from '@things-factory/dataset'\n\nimport { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { KpiMetric } from './kpi-metric'\nimport { NewKpiMetric, KpiMetricPatch } from './kpi-metric-type'\nimport { KpiFormulaService } from '../kpi/kpi-formula.service'\nimport { registerSchedule, unregisterSchedule, CallbackBase, Application } from '@things-factory/scheduler-client'\n\n@Resolver(KpiMetric)\nexport class KpiMetricMutation {\n @Directive('@transaction')\n @Mutation(returns => KpiMetric, { description: 'Create a new KPI metric with the provided details.' })\n async createKpiMetric(\n @Arg('kpiMetric', { description: 'Input object containing details for the new KPI metric.' })\n kpiMetric: NewKpiMetric,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n let dataSet = kpiMetric.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: kpiMetric.dataSetId } })\n : undefined\n\n // formula 관련 로직 완전 제거\n\n const result = await getRepository(KpiMetric, tx).save({\n ...kpiMetric,\n dataSet,\n domain,\n creator: user,\n updater: user\n })\n\n // 스케줄러 등록\n if (kpiMetric.schedule) {\n const handle = await registerSchedule({\n name: kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: kpiMetric.schedule,\n timezone: kpiMetric.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = kpiMetric.timezone\n await getRepository(KpiMetric, tx).save(result)\n }\n\n if (kpiMetric.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: kpiMetric.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => KpiMetric, { description: 'To modify KpiMetric information' })\n async updateKpiMetric(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetric, tx)\n const kpiMetric = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let dataSet = patch.dataSetId\n ? await getRepository(DataSet).findOne({ where: { id: patch.dataSetId } })\n : kpiMetric.dataSet\n\n // formula 관련 로직 완전 제거\n\n const result = await repository.save({\n ...kpiMetric,\n ...patch,\n dataSet,\n updater: user\n })\n\n // 스케줄러 해제/등록 (변경 시)\n if (kpiMetric.scheduleId && (patch.scheduleId !== kpiMetric.scheduleId || !patch.scheduleId)) {\n await unregisterSchedule(kpiMetric.scheduleId)\n result.scheduleId = null\n }\n if (patch.schedule) {\n const handle = await registerSchedule({\n name: patch.name || kpiMetric.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi-metric',\n key: result.id,\n operation: 'aggregate'\n },\n type: 'cron',\n schedule: patch.schedule,\n timezone: patch.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi-metric`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n metricId: result.id\n },\n history_check: true,\n failed_policy: 'retry_dlq',\n max_retry_count: 3,\n retry_period: 60\n }\n })\n result.scheduleId = handle\n result.timezone = patch.timezone\n await repository.save(result)\n }\n\n if (patch.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: patch.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Mutation(returns => [KpiMetric], { description: \"To modify multiple KpiMetrics' information\" })\n async updateMultipleKpiMetric(\n @Arg('patches', type => [KpiMetricPatch]) patches: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetric[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const kpiMetricRepo = getRepository(KpiMetric, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await kpiMetricRepo.save({\n ...newRecord,\n domain,\n creator: user,\n updater: user\n })\n\n if (newRecord.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: newRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const kpiMetric = await kpiMetricRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiMetricRepo.save({\n ...kpiMetric,\n ...updateRecord,\n updater: user\n })\n\n if (updateRecord.thumbnail) {\n await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)\n await createAttachment(\n null,\n {\n attachment: {\n file: updateRecord.thumbnail,\n refType: KpiMetric.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetric' })\n async deleteKpiMetric(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n const repo = getRepository(KpiMetric, tx)\n const metric = await repo.findOne({ where: { domain: { id: domain.id }, id } })\n if (metric?.scheduleId) {\n await unregisterSchedule(metric.scheduleId)\n }\n await repo.delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetrics' })\n async deleteKpiMetrics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiMetric, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n await deleteAttachmentsByRef(null, { refBys: ids }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetrics' })\n async importKpiMetrics(\n @Arg('kpiMetrics', type => [KpiMetricPatch]) kpiMetrics: KpiMetricPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpiMetrics.map(async (kpiMetric: KpiMetricPatch) => {\n const createdKpiMetric: KpiMetric = await getRepository(KpiMetric, tx).save({ domain, ...kpiMetric })\n })\n )\n\n return true\n }\n}\n"]}
|