@dssp/dkpi 1.0.0-alpha.50 → 1.0.0-alpha.51
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/dist-client/components/kpi-boxplot-chart.d.ts +24 -0
- package/dist-client/components/kpi-boxplot-chart.js +328 -0
- package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
- package/dist-client/components/kpi-radar-chart.d.ts +16 -0
- package/dist-client/components/kpi-radar-chart.js +139 -0
- package/dist-client/components/kpi-radar-chart.js.map +1 -0
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +3 -1
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +25 -12
- package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -1
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +6 -3
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +101 -92
- package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -1
- package/dist-client/pages/sv-project-complete.d.ts +0 -2
- package/dist-client/pages/sv-project-complete.js +14 -20
- package/dist-client/pages/sv-project-complete.js.map +1 -1
- package/dist-client/pages/sv-project-detail.d.ts +3 -0
- package/dist-client/pages/sv-project-detail.js +98 -34
- package/dist-client/pages/sv-project-detail.js.map +1 -1
- package/dist-client/shared/complete-api.d.ts +4 -1
- package/dist-client/shared/complete-api.js +68 -16
- package/dist-client/shared/complete-api.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +2 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +28 -20
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/schema.graphql +2 -2
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { KpiMetricValue, KpiMetricValuePatch } from '@things-factory/kpi';
|
|
2
|
+
import { Attachment, NewAttachment } from '@things-factory/attachment-base';
|
|
2
3
|
export declare class KpiMetricValueMutation {
|
|
3
4
|
updateKpiMetricValuesCumulative(patches: KpiMetricValuePatch[], context: ResolverContext): Promise<KpiMetricValue[]>;
|
|
4
5
|
updateKpiMetricValuesAssessment(patches: KpiMetricValuePatch[], context: ResolverContext): Promise<KpiMetricValue[]>;
|
|
5
|
-
updateKpiMetricValuesSentiment(
|
|
6
|
+
updateKpiMetricValuesSentiment(attachment: NewAttachment, context: ResolverContext): Promise<Attachment | null>;
|
|
6
7
|
finalizeProjectWithKpiRecalculation(projectId: string, context: ResolverContext): Promise<boolean>;
|
|
7
8
|
}
|
|
@@ -5,6 +5,8 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const type_graphql_1 = require("type-graphql");
|
|
6
6
|
const shell_1 = require("@things-factory/shell");
|
|
7
7
|
const kpi_1 = require("@things-factory/kpi");
|
|
8
|
+
const attachment_base_1 = require("@things-factory/attachment-base");
|
|
9
|
+
const project_1 = require("@dssp/project");
|
|
8
10
|
// import { ScalarObject } from '@things-factory/shell'
|
|
9
11
|
// import { getDefaultValueDate } from '@things-factory/kpi/utils/value-date-util'
|
|
10
12
|
let KpiMetricValueMutation = class KpiMetricValueMutation {
|
|
@@ -41,27 +43,33 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
|
|
|
41
43
|
return results;
|
|
42
44
|
}
|
|
43
45
|
/* 전문 감리사에 의 감리 최종 평가서의 긍부정을 텍스트 분석하는 감정 분석 기반 평가값을 수정 */
|
|
44
|
-
async updateKpiMetricValuesSentiment(
|
|
46
|
+
async updateKpiMetricValuesSentiment(attachment, context) {
|
|
45
47
|
const { domain, user, tx } = context.state;
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const result = await metricValueRepo.save(Object.assign(Object.assign({ domain }, patch), { metric, updater: user }));
|
|
56
|
-
results.push(result);
|
|
48
|
+
const projectRepo = (0, shell_1.getRepository)(project_1.Project, tx);
|
|
49
|
+
const projectId = attachment.refBy;
|
|
50
|
+
const attachmentRepo = (0, shell_1.getRepository)(attachment_base_1.Attachment, tx);
|
|
51
|
+
// 1. 기존 파일 삭제
|
|
52
|
+
await attachmentRepo.delete({ refBy: projectId, refType: attachment.refType });
|
|
53
|
+
projectRepo.update(projectId, { completeReport: null });
|
|
54
|
+
// 2. 새 파일 없으면 끝
|
|
55
|
+
if (!attachment.file) {
|
|
56
|
+
return null;
|
|
57
57
|
}
|
|
58
|
-
|
|
58
|
+
// 3. 새 파일 저장
|
|
59
|
+
const result = await (0, attachment_base_1.createAttachment)(null, { attachment }, context);
|
|
60
|
+
projectRepo.update(projectId, { completeReport: result });
|
|
61
|
+
// 4. pdf 파일 업로드를 처리
|
|
62
|
+
return result;
|
|
59
63
|
}
|
|
60
64
|
async finalizeProjectWithKpiRecalculation(projectId, context) {
|
|
61
65
|
const { domain, user, tx } = context.state;
|
|
62
|
-
const
|
|
63
|
-
const
|
|
64
|
-
|
|
66
|
+
const projectRepo = (0, shell_1.getRepository)(project_1.Project, tx);
|
|
67
|
+
const project = await projectRepo.findOne({ where: { id: projectId } });
|
|
68
|
+
console.log('project :', project);
|
|
69
|
+
if (!project) {
|
|
70
|
+
throw new Error(`Project not found: ${projectId}`);
|
|
71
|
+
}
|
|
72
|
+
projectRepo.save(Object.assign(Object.assign({}, project), { state: project_1.ProjectState.COMPLETED }));
|
|
65
73
|
return true;
|
|
66
74
|
}
|
|
67
75
|
};
|
|
@@ -89,18 +97,18 @@ tslib_1.__decorate([
|
|
|
89
97
|
tslib_1.__decorate([
|
|
90
98
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
91
99
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
92
|
-
(0, type_graphql_1.Mutation)(returns =>
|
|
93
|
-
tslib_1.__param(0, (0, type_graphql_1.Arg)('
|
|
100
|
+
(0, type_graphql_1.Mutation)(returns => attachment_base_1.Attachment, { nullable: true, description: "To modify multiple sentiment KpiMetricValues' value" }),
|
|
101
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('attachment', type => attachment_base_1.NewAttachment)),
|
|
94
102
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
95
103
|
tslib_1.__metadata("design:type", Function),
|
|
96
|
-
tslib_1.__metadata("design:paramtypes", [
|
|
104
|
+
tslib_1.__metadata("design:paramtypes", [attachment_base_1.NewAttachment, Object]),
|
|
97
105
|
tslib_1.__metadata("design:returntype", Promise)
|
|
98
106
|
], KpiMetricValueMutation.prototype, "updateKpiMetricValuesSentiment", null);
|
|
99
107
|
tslib_1.__decorate([
|
|
100
108
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
101
109
|
(0, type_graphql_1.Directive)('@privilege(category: "kpi", privilege: "mutation", domainOwnerGranted: true, superUserGranted: true)'),
|
|
102
110
|
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To finalize project with KPI recalculation' }),
|
|
103
|
-
tslib_1.__param(0, (0, type_graphql_1.Arg)('projectId'
|
|
111
|
+
tslib_1.__param(0, (0, type_graphql_1.Arg)('projectId')),
|
|
104
112
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
105
113
|
tslib_1.__metadata("design:type", Function),
|
|
106
114
|
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AAEtE,iDAAqD;AAErD,6CAAmG;
|
|
1
|
+
{"version":3,"file":"kpi-metric-value-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-metric-value/kpi-metric-value-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 { Float } from 'type-graphql'\nimport { KpiPeriodType, KpiMetric, KpiMetricValue, KpiMetricValuePatch } from '@things-factory/kpi'\nimport { Attachment, NewAttachment, createAttachment } from '@things-factory/attachment-base'\nimport { Project, ProjectState } from '@dssp/project'\n\n// import { ScalarObject } from '@things-factory/shell'\n// import { getDefaultValueDate } from '@things-factory/kpi/utils/value-date-util'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n /* 프로젝트 수행과정 중에 (시간, 비용, 발생 건수 등) 누적된 값을 반영하여 KPI Metric Value 값을 수정 - 예를 들면, 총 설계 변경 건수, 총 건설 폐기물 발생량, 공사비, 공사기간, 재해 건수 등 */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple cumulative KpiMetricValues' value\" })\n async updateKpiMetricValuesCumulative(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n const results = []\n for (const patch of patches) {\n const metric = await metricRepo.findOne({ where: { id: patch.metricId } })\n if (!metric) {\n throw new Error(`Metric not found: ${patch.metricId}`)\n }\n const result = await metricValueRepo.save({\n domain,\n ...patch,\n metric,\n updater: user\n } as any)\n\n results.push(result)\n }\n\n return results\n }\n\n /* 전문 감리사에 의해서 평가된 별점을 반영하여 KPI Metric Value 값을 수정 */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple assessment KpiMetricValues' value\" })\n async updateKpiMetricValuesAssessment(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n const metricRepo = getRepository(KpiMetric, tx)\n\n const results = []\n for (const patch of patches) {\n const metric = await metricRepo.findOne({ where: { id: patch.metricId } })\n if (!metric) {\n throw new Error(`Metric not found: ${patch.metricId}`)\n }\n const result = await metricValueRepo.save({\n domain,\n ...patch,\n metric,\n updater: user\n } as any)\n\n results.push(result)\n }\n\n return results\n }\n\n /* 전문 감리사에 의 감리 최종 평가서의 긍부정을 텍스트 분석하는 감정 분석 기반 평가값을 수정 */\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Attachment, { nullable: true, description: \"To modify multiple sentiment KpiMetricValues' value\" })\n async updateKpiMetricValuesSentiment(\n @Arg('attachment', type => NewAttachment) attachment: NewAttachment,\n @Ctx() context: ResolverContext\n ): Promise<Attachment | null> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n const projectId = attachment.refBy\n const attachmentRepo = getRepository(Attachment, tx)\n\n // 1. 기존 파일 삭제\n await attachmentRepo.delete({ refBy: projectId, refType: attachment.refType })\n projectRepo.update(projectId, { completeReport: null })\n\n // 2. 새 파일 없으면 끝\n if (!attachment.file) {\n return null\n }\n\n // 3. 새 파일 저장\n const result = await createAttachment(null, { attachment }, context)\n projectRepo.update(projectId, { completeReport: result })\n\n // 4. pdf 파일 업로드를 처리\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To finalize project with KPI recalculation' })\n async finalizeProjectWithKpiRecalculation(\n @Arg('projectId') projectId: string,\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n const projectRepo = getRepository(Project, tx)\n\n const project = await projectRepo.findOne({ where: { id: projectId } })\n\n console.log('project :', project)\n\n if (!project) {\n throw new Error(`Project not found: ${projectId}`)\n }\n\n projectRepo.save({\n ...project,\n state: ProjectState.COMPLETED\n })\n\n return true\n }\n}\n"]}
|