@things-factory/kpi 10.0.2 → 10.0.4
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-server/service/kpi/kpi-mutation.js +6 -1
- package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -1
- package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
- package/dist-server/service/kpi-scope/kpi-scope-mutation.js +6 -1
- package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -1
- package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +6 -1
- package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js +6 -1
- package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -5
|
@@ -218,7 +218,12 @@ let KpiMutation = class KpiMutation {
|
|
|
218
218
|
if (_updateRecords.length > 0) {
|
|
219
219
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
220
220
|
const updateRecord = _updateRecords[i];
|
|
221
|
-
const kpi = await kpiRepo.
|
|
221
|
+
const kpi = await kpiRepo.findOne({
|
|
222
|
+
where: { domain: { id: domain.id }, id: updateRecord.id }
|
|
223
|
+
});
|
|
224
|
+
if (!kpi) {
|
|
225
|
+
throw new Error(`failed to find kpi to update: ${updateRecord.id}`);
|
|
226
|
+
}
|
|
222
227
|
const result = await kpiRepo.save({
|
|
223
228
|
...kpi,
|
|
224
229
|
...updateRecord,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-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 { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { Kpi } from './kpi'\nimport { NewKpi, KpiPatch } from './kpi-type'\nimport { KpiHistory } from './kpi-history'\nimport { KpiFormulaService } from './kpi-formula.service'\nimport { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope'\nimport { Between } from 'typeorm'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiMetricValue } from '../kpi-metric-value/kpi-metric-value'\nimport { parseFormula } from '../../calculator/parser'\nimport { evaluateFormula } from '../../calculator/evaluator'\nimport { builtinFunctions } from '../../calculator/functions'\nimport { KpiMetricValueProvider } from '../../controllers/kpi-metric-value-provider'\n\n@Resolver(Kpi)\nexport class KpiMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Create a new KPI with the provided details.' })\n async createKpi(\n @Arg('kpi', { description: 'Input object containing details for the new KPI.' }) kpi: NewKpi,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain, user, tx } = context.state\n\n let parent = kpi.parent\n ? await getRepository(Kpi).findOne({ where: { id: kpi.parent.id, domain: { id: domain.id } } })\n : undefined\n\n // 순환 참조 검사\n if (parent) {\n const formulaService = new KpiFormulaService()\n const hasCircular = await formulaService.hasCircularReference(parent.id, parent.id)\n if (hasCircular) {\n throw new Error('Circular reference detected in KPI hierarchy')\n }\n }\n\n const result = await getRepository(Kpi, tx).save({\n ...kpi,\n parent,\n domain,\n creator: user,\n updater: user\n })\n\n if (kpi.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: kpi.thumbnail,\n refType: Kpi.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n if (kpi.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(kpi.formula)\n if (result.warnings?.length) {\n console.warn(`[KPI formula 경고] ${kpi.name}:\\n` + result.warnings.join('\\n'))\n }\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n // KPI 스케줄러 등록\n if (kpi.schedule) {\n const handle = await registerSchedule({\n name: result.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi',\n key: result.id,\n operation: 'schedule'\n },\n type: 'cron',\n schedule: kpi.schedule,\n timezone: kpi.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n kpiId: 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 await getRepository(Kpi, tx).save(result)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'To modify Kpi information' })\n async updateKpi(@Arg('id') id: string, @Arg('patch') patch: KpiPatch, @Ctx() context: ResolverContext): Promise<Kpi> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(Kpi, tx)\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let parent = patch.parent\n ? await getRepository(Kpi).findOne({ where: { id: patch.parent.id, domain: { id: domain.id } } })\n : patch.parent === null ? null : kpi.parent\n\n // 순환 참조 검사 (parent가 변경되는 경우)\n if (parent && parent.id !== kpi.parentId) {\n const formulaService = new KpiFormulaService()\n const hasCircular = await formulaService.hasCircularReference(kpi.id, parent.id)\n if (hasCircular) {\n throw new Error('Circular reference detected in KPI hierarchy')\n }\n }\n\n const result = await repository.save({\n ...kpi,\n ...patch,\n parent,\n updater: user\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: Kpi.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n if (patch.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(patch.formula)\n if (result.warnings?.length) {\n console.warn(`[KPI formula 경고] ${patch.name || patch.id}:\\n` + result.warnings.join('\\n'))\n }\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n // KPI 스케줄러 등록/해제 갱신\n if (patch.schedule) {\n // 기존 스케줄러 해제\n if (kpi.scheduleId) {\n await unregisterSchedule(kpi.scheduleId)\n }\n // 새 스케줄러 등록\n const handle = await registerSchedule({\n name: result.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi',\n key: result.id,\n operation: 'schedule'\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`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n kpiId: 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 await repository.save(result)\n } else if (patch.schedule === null && kpi.scheduleId) {\n // 스케줄 해제 요청\n await unregisterSchedule(kpi.scheduleId)\n result.scheduleId = null\n await repository.save(result)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [Kpi], { description: \"To modify multiple Kpis' information\" })\n async updateMultipleKpi(\n @Arg('patches', type => [KpiPatch]) patches: KpiPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\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 kpiRepo = getRepository(Kpi, 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 kpiRepo.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: Kpi.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 kpi = await kpiRepo.findOneBy({ id: updateRecord.id })\n\n const result = await kpiRepo.save({\n ...kpi,\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: Kpi.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 @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Kpi' })\n async deleteKpi(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n const kpi = await getRepository(Kpi, tx).findOne({ where: { domain: { id: domain.id }, id } })\n if (kpi && kpi.scheduleId) {\n await unregisterSchedule(kpi.scheduleId)\n }\n\n await getRepository(Kpi, tx).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Kpis' })\n async deleteKpis(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(Kpi, 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 @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Kpis' })\n async importKpis(\n @Arg('kpis', type => [KpiPatch]) kpis: KpiPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpis.map(async (kpi: KpiPatch) => {\n const createdKpi: Kpi = await getRepository(Kpi, tx).save({ domain, ...kpi })\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Release a KPI and create a version history.' })\n async releaseKpi(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Kpi> {\n const { domain, user, tx } = context.state\n const repository = getRepository(Kpi, tx)\n const historyRepository = getRepository(KpiHistory, tx)\n\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n if (!kpi) throw `KPI given id(${id}) is not found`\n if (kpi.state == 'RELEASE') throw `KPI given id(${id}) is already released`\n\n // 히스토리에서 max version 가져오기\n const maxHistory = await historyRepository\n .createQueryBuilder('history')\n .select('MAX(history.version)', 'max')\n .where('history.originalId = :id', { id: kpi.id })\n .getRawOne()\n const nextVersion = maxHistory?.max ? Number(maxHistory.max) + 1 : 1\n\n const updated = await repository.save({\n ...kpi,\n version: nextVersion,\n state: 'RELEASE',\n updater: user\n } as any)\n return updated\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Revert a KPI to a specific historical version.' })\n async revertKpiVersion(\n @Arg('id') id: string,\n @Arg('version') version: number,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain, user, tx } = context.state\n const repository = getRepository(Kpi, tx)\n const historyRepository = getRepository(KpiHistory, tx)\n\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n if (!kpi) throw `KPI with id(${id}) is not found`\n\n const kpiHistory = await historyRepository.findOne({\n where: { domain: { id: domain.id }, originalId: id, version },\n order: { version: 'DESC' }\n })\n if (!kpiHistory) throw `KPI with id:version(${id}:${version}) is not found`\n\n const updated = await repository.save({\n ...kpi,\n name: kpiHistory.name,\n description: kpiHistory.description,\n formula: kpiHistory.formula,\n active: kpiHistory.active,\n state: 'DRAFT',\n thumbnail: kpiHistory.thumbnail,\n updater: user\n } as any)\n return updated\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiValue, { description: 'KPI 기준으로 formula 계산 및 KPI Value upsert' })\n async calculateKpiValue(\n @Arg('kpiId') kpiId: string,\n @Arg('valueDate', { nullable: true }) valueDate: string,\n @Arg('org', { nullable: true }) org: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiValue> {\n const { domain, user, tx } = context.state\n const kpiRepo = getRepository(Kpi, tx)\n const metricRepo = getRepository<KpiMetric>(require('../kpi-metric/kpi-metric').KpiMetric, tx)\n const metricValueRepo = getRepository<KpiMetricValue>(\n require('../kpi-metric-value/kpi-metric-value').KpiMetricValue,\n tx\n )\n const kpiValueRepo = getRepository<KpiValue>(KpiValue, tx)\n const { KpiPeriodType } = require('./kpi')\n const { getDefaultValueDate } = require('../utils/value-date-util')\n\n // 1. KPI 정보 조회\n const kpi = await kpiRepo.findOne({ where: { id: kpiId, domain: { id: domain.id } } })\n if (!kpi) throw new Error('KPI 정보 없음')\n if (!kpi.formula) throw new Error('KPI formula 없음')\n const periodType = kpi.periodType || KpiPeriodType.DAY\n const valueDateToUse = valueDate || getDefaultValueDate(periodType, 'last')\n\n // 2. formula에서 metric code 추출\n const metricCodes = (kpi.formula.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) || []).filter(\n code => code !== 'null' && code !== 'undefined'\n )\n const metricMap: Record<string, any> = {}\n for (const code of metricCodes) {\n const metric = await metricRepo.findOne({ where: { name: code, domain: { id: domain.id } } })\n if (!metric) throw new Error(`KPI formula metric '${code}' not found`)\n metricMap[code] = metric\n }\n\n // 3. metric 값 집계 (periodType 변환/집계)\n const metricValues: Record<string, number> = {}\n for (const code of metricCodes) {\n const metric = metricMap[code]\n let value = null\n if (metric.periodType === periodType) {\n const mv = await metricValueRepo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate: valueDateToUse,\n periodType,\n org: org ?? '',\n domain: { id: domain.id }\n }\n })\n value = mv?.value ?? null\n } else {\n let startDate: string, endDate: string\n if (periodType === KpiPeriodType.MONTH && metric.periodType === KpiPeriodType.DAY) {\n startDate = valueDateToUse + '-01'\n endDate = valueDateToUse + '-31'\n const mvs = await metricValueRepo.find({\n where: {\n metric: { id: metric.id },\n valueDate: Between(startDate, endDate),\n periodType: metric.periodType,\n org: org ?? '',\n domain: { id: domain.id }\n }\n })\n value = mvs.reduce((sum, mv) => sum + (mv.value ?? 0), 0)\n } else {\n throw new Error('KPI/Metric periodType 조합 집계 미지원')\n }\n }\n if (value == null) throw new Error(`Metric '${code}' 값 없음`)\n metricValues[code] = value\n }\n\n // 4. formula 계산 (calculator 기반)\n const ast = parseFormula(kpi.formula)\n const provider = new KpiMetricValueProvider({\n valueDate: valueDateToUse,\n org,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n const kpiValueResult = await evaluateFormula(ast, evalContext)\n\n // 5. KpiOrgScope 처리\n let kpiOrgScope: KpiOrgScope | null = null\n if (org) {\n kpiOrgScope = await getRepository(KpiOrgScope, tx).findOne({\n where: { org: org, domain: { id: domain.id } }\n })\n if (!kpiOrgScope) {\n // 새 KpiOrgScope 생성\n kpiOrgScope = await getRepository(KpiOrgScope, tx).save({\n entityType: 'KpiCalculation',\n entityId: `calc-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n entityName: org,\n org: org,\n domain,\n creator: user,\n updater: user\n })\n }\n }\n\n // 6. KPI Value upsert\n let kpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: kpi.id },\n valueDate: valueDateToUse,\n kpiOrgScope: kpiOrgScope ? { id: kpiOrgScope.id } : null,\n version: kpi.version,\n domain: { id: domain.id }\n }\n })\n if (kpiValue) {\n kpiValue.value = kpiValueResult\n kpiValue.updater = user\n } else {\n const createData: any = {\n kpi,\n kpiId: kpi.id,\n version: kpi.version,\n valueDate: valueDateToUse,\n value: kpiValueResult,\n domain,\n creator: user,\n updater: user\n }\n if (kpiOrgScope) {\n createData.kpiOrgScope = kpiOrgScope\n createData.kpiOrgScopeId = kpiOrgScope.id\n }\n kpiValue = Object.assign(new KpiValue(), createData)\n }\n return await kpiValueRepo.save(kpiValue)\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi/kpi-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 { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'\nimport { Kpi } from './kpi'\nimport { NewKpi, KpiPatch } from './kpi-type'\nimport { KpiHistory } from './kpi-history'\nimport { KpiFormulaService } from './kpi-formula.service'\nimport { Application, CallbackBase, registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'\nimport { KpiValue } from '../kpi-value/kpi-value'\nimport { KpiOrgScope } from '../kpi-org-scope/kpi-org-scope'\nimport { Between } from 'typeorm'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { KpiMetricValue } from '../kpi-metric-value/kpi-metric-value'\nimport { parseFormula } from '../../calculator/parser'\nimport { evaluateFormula } from '../../calculator/evaluator'\nimport { builtinFunctions } from '../../calculator/functions'\nimport { KpiMetricValueProvider } from '../../controllers/kpi-metric-value-provider'\n\n@Resolver(Kpi)\nexport class KpiMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Create a new KPI with the provided details.' })\n async createKpi(\n @Arg('kpi', { description: 'Input object containing details for the new KPI.' }) kpi: NewKpi,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain, user, tx } = context.state\n\n let parent = kpi.parent\n ? await getRepository(Kpi).findOne({ where: { id: kpi.parent.id, domain: { id: domain.id } } })\n : undefined\n\n // 순환 참조 검사\n if (parent) {\n const formulaService = new KpiFormulaService()\n const hasCircular = await formulaService.hasCircularReference(parent.id, parent.id)\n if (hasCircular) {\n throw new Error('Circular reference detected in KPI hierarchy')\n }\n }\n\n const result = await getRepository(Kpi, tx).save({\n ...kpi,\n parent,\n domain,\n creator: user,\n updater: user\n })\n\n if (kpi.thumbnail) {\n await createAttachment(\n null,\n {\n attachment: {\n file: kpi.thumbnail,\n refType: Kpi.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n if (kpi.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(kpi.formula)\n if (result.warnings?.length) {\n console.warn(`[KPI formula 경고] ${kpi.name}:\\n` + result.warnings.join('\\n'))\n }\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n // KPI 스케줄러 등록\n if (kpi.schedule) {\n const handle = await registerSchedule({\n name: result.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi',\n key: result.id,\n operation: 'schedule'\n },\n type: 'cron',\n schedule: kpi.schedule,\n timezone: kpi.timezone,\n task: {\n type: 'rest',\n connection: {\n host: `${CallbackBase}/callback-schedule-for-kpi`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n kpiId: 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 await getRepository(Kpi, tx).save(result)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'To modify Kpi information' })\n async updateKpi(@Arg('id') id: string, @Arg('patch') patch: KpiPatch, @Ctx() context: ResolverContext): Promise<Kpi> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(Kpi, tx)\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let parent = patch.parent\n ? await getRepository(Kpi).findOne({ where: { id: patch.parent.id, domain: { id: domain.id } } })\n : patch.parent === null ? null : kpi.parent\n\n // 순환 참조 검사 (parent가 변경되는 경우)\n if (parent && parent.id !== kpi.parentId) {\n const formulaService = new KpiFormulaService()\n const hasCircular = await formulaService.hasCircularReference(kpi.id, parent.id)\n if (hasCircular) {\n throw new Error('Circular reference detected in KPI hierarchy')\n }\n }\n\n const result = await repository.save({\n ...kpi,\n ...patch,\n parent,\n updater: user\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: Kpi.name,\n refBy: result.id\n }\n },\n context\n )\n }\n\n if (patch.formula) {\n const formulaService = new KpiFormulaService()\n const result = await formulaService.validateFormula(patch.formula)\n if (result.warnings?.length) {\n console.warn(`[KPI formula 경고] ${patch.name || patch.id}:\\n` + result.warnings.join('\\n'))\n }\n if (!result.valid) {\n throw new Error(result.errors.join('\\n'))\n }\n }\n\n // KPI 스케줄러 등록/해제 갱신\n if (patch.schedule) {\n // 기존 스케줄러 해제\n if (kpi.scheduleId) {\n await unregisterSchedule(kpi.scheduleId)\n }\n // 새 스케줄러 등록\n const handle = await registerSchedule({\n name: result.name,\n client: {\n application: Application,\n group: `${domain.id}`,\n type: 'kpi',\n key: result.id,\n operation: 'schedule'\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`,\n headers: {\n 'Content-Type': 'application/json',\n accept: '*/*'\n }\n },\n data: {\n domainId: domain.id,\n kpiId: 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 await repository.save(result)\n } else if (patch.schedule === null && kpi.scheduleId) {\n // 스케줄 해제 요청\n await unregisterSchedule(kpi.scheduleId)\n result.scheduleId = null\n await repository.save(result)\n }\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [Kpi], { description: \"To modify multiple Kpis' information\" })\n async updateMultipleKpi(\n @Arg('patches', type => [KpiPatch]) patches: KpiPatch[],\n @Ctx() context: ResolverContext\n ): Promise<Kpi[]> {\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 kpiRepo = getRepository(Kpi, 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 kpiRepo.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: Kpi.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 kpi = await kpiRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!kpi) {\n throw new Error(`failed to find kpi to update: ${updateRecord.id}`)\n }\n\n const result = await kpiRepo.save({\n ...kpi,\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: Kpi.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 @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Kpi' })\n async deleteKpi(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n const kpi = await getRepository(Kpi, tx).findOne({ where: { domain: { id: domain.id }, id } })\n if (kpi && kpi.scheduleId) {\n await unregisterSchedule(kpi.scheduleId)\n }\n\n await getRepository(Kpi, tx).delete({ domain: { id: domain.id }, id })\n await deleteAttachmentsByRef(null, { refBys: [id] }, context)\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple Kpis' })\n async deleteKpis(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(Kpi, 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 @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple Kpis' })\n async importKpis(\n @Arg('kpis', type => [KpiPatch]) kpis: KpiPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await Promise.all(\n kpis.map(async (kpi: KpiPatch) => {\n const createdKpi: Kpi = await getRepository(Kpi, tx).save({ domain, ...kpi })\n })\n )\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Release a KPI and create a version history.' })\n async releaseKpi(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Kpi> {\n const { domain, user, tx } = context.state\n const repository = getRepository(Kpi, tx)\n const historyRepository = getRepository(KpiHistory, tx)\n\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n if (!kpi) throw `KPI given id(${id}) is not found`\n if (kpi.state == 'RELEASE') throw `KPI given id(${id}) is already released`\n\n // 히스토리에서 max version 가져오기\n const maxHistory = await historyRepository\n .createQueryBuilder('history')\n .select('MAX(history.version)', 'max')\n .where('history.originalId = :id', { id: kpi.id })\n .getRawOne()\n const nextVersion = maxHistory?.max ? Number(maxHistory.max) + 1 : 1\n\n const updated = await repository.save({\n ...kpi,\n version: nextVersion,\n state: 'RELEASE',\n updater: user\n } as any)\n return updated\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Kpi, { description: 'Revert a KPI to a specific historical version.' })\n async revertKpiVersion(\n @Arg('id') id: string,\n @Arg('version') version: number,\n @Ctx() context: ResolverContext\n ): Promise<Kpi> {\n const { domain, user, tx } = context.state\n const repository = getRepository(Kpi, tx)\n const historyRepository = getRepository(KpiHistory, tx)\n\n const kpi = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n if (!kpi) throw `KPI with id(${id}) is not found`\n\n const kpiHistory = await historyRepository.findOne({\n where: { domain: { id: domain.id }, originalId: id, version },\n order: { version: 'DESC' }\n })\n if (!kpiHistory) throw `KPI with id:version(${id}:${version}) is not found`\n\n const updated = await repository.save({\n ...kpi,\n name: kpiHistory.name,\n description: kpiHistory.description,\n formula: kpiHistory.formula,\n active: kpiHistory.active,\n state: 'DRAFT',\n thumbnail: kpiHistory.thumbnail,\n updater: user\n } as any)\n return updated\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiValue, { description: 'KPI 기준으로 formula 계산 및 KPI Value upsert' })\n async calculateKpiValue(\n @Arg('kpiId') kpiId: string,\n @Arg('valueDate', { nullable: true }) valueDate: string,\n @Arg('org', { nullable: true }) org: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiValue> {\n const { domain, user, tx } = context.state\n const kpiRepo = getRepository(Kpi, tx)\n const metricRepo = getRepository<KpiMetric>(require('../kpi-metric/kpi-metric').KpiMetric, tx)\n const metricValueRepo = getRepository<KpiMetricValue>(\n require('../kpi-metric-value/kpi-metric-value').KpiMetricValue,\n tx\n )\n const kpiValueRepo = getRepository<KpiValue>(KpiValue, tx)\n const { KpiPeriodType } = require('./kpi')\n const { getDefaultValueDate } = require('../utils/value-date-util')\n\n // 1. KPI 정보 조회\n const kpi = await kpiRepo.findOne({ where: { id: kpiId, domain: { id: domain.id } } })\n if (!kpi) throw new Error('KPI 정보 없음')\n if (!kpi.formula) throw new Error('KPI formula 없음')\n const periodType = kpi.periodType || KpiPeriodType.DAY\n const valueDateToUse = valueDate || getDefaultValueDate(periodType, 'last')\n\n // 2. formula에서 metric code 추출\n const metricCodes = (kpi.formula.match(/[a-zA-Z_][a-zA-Z0-9_]*/g) || []).filter(\n code => code !== 'null' && code !== 'undefined'\n )\n const metricMap: Record<string, any> = {}\n for (const code of metricCodes) {\n const metric = await metricRepo.findOne({ where: { name: code, domain: { id: domain.id } } })\n if (!metric) throw new Error(`KPI formula metric '${code}' not found`)\n metricMap[code] = metric\n }\n\n // 3. metric 값 집계 (periodType 변환/집계)\n const metricValues: Record<string, number> = {}\n for (const code of metricCodes) {\n const metric = metricMap[code]\n let value = null\n if (metric.periodType === periodType) {\n const mv = await metricValueRepo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate: valueDateToUse,\n periodType,\n org: org ?? '',\n domain: { id: domain.id }\n }\n })\n value = mv?.value ?? null\n } else {\n let startDate: string, endDate: string\n if (periodType === KpiPeriodType.MONTH && metric.periodType === KpiPeriodType.DAY) {\n startDate = valueDateToUse + '-01'\n endDate = valueDateToUse + '-31'\n const mvs = await metricValueRepo.find({\n where: {\n metric: { id: metric.id },\n valueDate: Between(startDate, endDate),\n periodType: metric.periodType,\n org: org ?? '',\n domain: { id: domain.id }\n }\n })\n value = mvs.reduce((sum, mv) => sum + (mv.value ?? 0), 0)\n } else {\n throw new Error('KPI/Metric periodType 조합 집계 미지원')\n }\n }\n if (value == null) throw new Error(`Metric '${code}' 값 없음`)\n metricValues[code] = value\n }\n\n // 4. formula 계산 (calculator 기반)\n const ast = parseFormula(kpi.formula)\n const provider = new KpiMetricValueProvider({\n valueDate: valueDateToUse,\n org,\n domainId: domain.id,\n tx\n })\n const evalContext = { functions: builtinFunctions, provider }\n const kpiValueResult = await evaluateFormula(ast, evalContext)\n\n // 5. KpiOrgScope 처리\n let kpiOrgScope: KpiOrgScope | null = null\n if (org) {\n kpiOrgScope = await getRepository(KpiOrgScope, tx).findOne({\n where: { org: org, domain: { id: domain.id } }\n })\n if (!kpiOrgScope) {\n // 새 KpiOrgScope 생성\n kpiOrgScope = await getRepository(KpiOrgScope, tx).save({\n entityType: 'KpiCalculation',\n entityId: `calc-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n entityName: org,\n org: org,\n domain,\n creator: user,\n updater: user\n })\n }\n }\n\n // 6. KPI Value upsert\n let kpiValue = await kpiValueRepo.findOne({\n where: {\n kpi: { id: kpi.id },\n valueDate: valueDateToUse,\n kpiOrgScope: kpiOrgScope ? { id: kpiOrgScope.id } : null,\n version: kpi.version,\n domain: { id: domain.id }\n }\n })\n if (kpiValue) {\n kpiValue.value = kpiValueResult\n kpiValue.updater = user\n } else {\n const createData: any = {\n kpi,\n kpiId: kpi.id,\n version: kpi.version,\n valueDate: valueDateToUse,\n value: kpiValueResult,\n domain,\n creator: user,\n updater: user\n }\n if (kpiOrgScope) {\n createData.kpiOrgScope = kpiOrgScope\n createData.kpiOrgScopeId = kpiOrgScope.id\n }\n kpiValue = Object.assign(new KpiValue(), createData)\n }\n return await kpiValueRepo.save(kpiValue)\n }\n}\n"]}
|
|
@@ -136,7 +136,12 @@ let KpiMetricValueMutation = class KpiMetricValueMutation {
|
|
|
136
136
|
if (_updateRecords.length > 0) {
|
|
137
137
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
138
138
|
const updateRecord = _updateRecords[i];
|
|
139
|
-
const metricValue = await metricValueRepo.
|
|
139
|
+
const metricValue = await metricValueRepo.findOne({
|
|
140
|
+
where: { domain: { id: domain.id }, id: updateRecord.id }
|
|
141
|
+
});
|
|
142
|
+
if (!metricValue) {
|
|
143
|
+
throw new Error(`failed to find metricValue to update: ${updateRecord.id}`);
|
|
144
|
+
}
|
|
140
145
|
if (!updateRecord.metricId) {
|
|
141
146
|
throw new Error('metricId is required for updating value');
|
|
142
147
|
}
|
|
@@ -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":"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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 } from '../kpi/kpi'\n\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { NewKpiMetricValue, KpiMetricValuePatch } from './kpi-metric-value-type'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { ScalarObject } from '@things-factory/shell'\nimport { getDefaultValueDate } from '../utils/value-date-util'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Create a new metric value with the provided details.' })\n async createKpiMetricValue(\n @Arg('metricValue', { description: 'Input object containing details for the new metric value.' })\n metricValue: NewKpiMetricValue,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n let metric = metricValue.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: metricValue.metricId } })\n : undefined\n\n // valueDate 자동 생성/보정 로직 추가\n let periodType = metricValue.periodType\n if (!periodType && metric) {\n periodType = metric.periodType\n }\n if (!periodType) {\n periodType = KpiPeriodType.DAY\n }\n // periodType을 string으로 변환 후 KpiPeriodType으로 강제 변환\n periodType = KpiPeriodType[String(periodType) as keyof typeof KpiPeriodType]\n let valueDate = metricValue.valueDate\n if (!valueDate || !isValueDateValidForPeriodType(valueDate, periodType)) {\n valueDate = getDefaultValueDate(periodType)\n }\n\n const entity: Partial<KpiMetricValue> = {\n metric,\n metricId: metricValue.metricId,\n valueDate,\n periodType,\n value: metricValue.value,\n org: metricValue.org,\n unit: metricValue.unit,\n meta: metricValue.meta,\n domain: domain,\n creator: user,\n updater: user\n }\n\n return await getRepository(KpiMetricValue, tx).save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and org.' })\n async recordKpiMetricValue(\n @Arg('metricName', { description: 'Metric code/name.' }) metricName: string,\n @Arg('value', type => Float, { nullable: true, description: 'Metric value (number).' }) value: number | null,\n @Arg('meta', type => ScalarObject, { nullable: true, description: 'Extended or non-numeric information (JSON).' })\n meta: any,\n @Arg('org', { nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org: string | null,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n const metric = await getRepository(KpiMetric).findOne({ where: { name: metricName, domain: { id: domain.id } } })\n if (!metric) throw new Error(`Metric not found: ${metricName}`)\n const periodType = metric.periodType || KpiPeriodType.DAY\n const valueDate = getDefaultValueDate(periodType)\n if (value == null && meta == null) {\n throw new Error('Either value or meta must be provided.')\n }\n const repo = getRepository(KpiMetricValue, tx)\n let entity = await repo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n periodType,\n org,\n domain: { id: domain.id }\n }\n })\n if (entity) {\n entity.value = value\n entity.meta = meta\n entity.updater = user\n } else {\n entity = repo.create({\n metric,\n metricId: metric.id,\n value,\n meta,\n valueDate,\n periodType,\n org,\n domain,\n creator: user,\n updater: user\n })\n }\n return await repo.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'To modify KpiMetricValue information' })\n async updateKpiMetricValue(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricValuePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetricValue, tx)\n const metricValue = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let metric = patch.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: patch.metricId } })\n : metricValue.metric\n\n const entity: any = {\n ...metricValue,\n ...patch,\n metric,\n updater: user\n }\n\n return await repository.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple KpiMetricValues' information\" })\n async updateMultipleKpiMetricValue(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === 'M')\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n if (!newRecord.metricId) {\n throw new Error('metricId is required for creating new metric value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: newRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${newRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...newRecord,\n metric,\n domain,\n creator: user,\n updater: user\n } as any)\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 metricValue = await metricValueRepo.findOneBy({ id: updateRecord.id })\n\n if (!updateRecord.metricId) {\n throw new Error('metricId is required for updating value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: updateRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${updateRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...metricValue,\n ...updateRecord,\n metric,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetricValue' })\n async deleteKpiMetricValue(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetricValues' })\n async deleteKpiMetricValues(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetricValues' })\n async importKpiMetricValues(\n @Arg('metricValues', type => [KpiMetricValuePatch]) metricValues: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await Promise.all(\n metricValues.map(async (metricValue: KpiMetricValuePatch) => {\n await getRepository(KpiMetricValue, tx).save({ domain, ...metricValue } as any)\n })\n )\n return true\n }\n}\n\n// valueDate와 periodType의 일치 여부를 검사하는 유틸리티 함수(임시, 아래에 추가)\nfunction isValueDateValidForPeriodType(valueDate: string, periodType: KpiPeriodType): boolean {\n if (!valueDate) return false\n switch (periodType) {\n case KpiPeriodType.DAY:\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.MONTH:\n return /^\\d{4}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.QUARTER:\n return /^\\d{4}-Q[1-4]$/.test(valueDate)\n case KpiPeriodType.WEEK:\n return /^\\d{4}-W\\d{1,2}$/.test(valueDate)\n case KpiPeriodType.ALLTIME:\n return valueDate === 'ALLTIME'\n default:\n return true\n }\n}\n"]}
|
|
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 } from '../kpi/kpi'\n\nimport { KpiMetricValue } from './kpi-metric-value'\nimport { NewKpiMetricValue, KpiMetricValuePatch } from './kpi-metric-value-type'\nimport { KpiMetric } from '../kpi-metric/kpi-metric'\nimport { ScalarObject } from '@things-factory/shell'\nimport { getDefaultValueDate } from '../utils/value-date-util'\n\n@Resolver(KpiMetricValue)\nexport class KpiMetricValueMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Create a new metric value with the provided details.' })\n async createKpiMetricValue(\n @Arg('metricValue', { description: 'Input object containing details for the new metric value.' })\n metricValue: NewKpiMetricValue,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n let metric = metricValue.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: metricValue.metricId } })\n : undefined\n\n // valueDate 자동 생성/보정 로직 추가\n let periodType = metricValue.periodType\n if (!periodType && metric) {\n periodType = metric.periodType\n }\n if (!periodType) {\n periodType = KpiPeriodType.DAY\n }\n // periodType을 string으로 변환 후 KpiPeriodType으로 강제 변환\n periodType = KpiPeriodType[String(periodType) as keyof typeof KpiPeriodType]\n let valueDate = metricValue.valueDate\n if (!valueDate || !isValueDateValidForPeriodType(valueDate, periodType)) {\n valueDate = getDefaultValueDate(periodType)\n }\n\n const entity: Partial<KpiMetricValue> = {\n metric,\n metricId: metricValue.metricId,\n valueDate,\n periodType,\n value: metricValue.value,\n org: metricValue.org,\n unit: metricValue.unit,\n meta: metricValue.meta,\n domain: domain,\n creator: user,\n updater: user\n }\n\n return await getRepository(KpiMetricValue, tx).save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'Record a metric value by metric name, value, meta, and org.' })\n async recordKpiMetricValue(\n @Arg('metricName', { description: 'Metric code/name.' }) metricName: string,\n @Arg('value', type => Float, { nullable: true, description: 'Metric value (number).' }) value: number | null,\n @Arg('meta', type => ScalarObject, { nullable: true, description: 'Extended or non-numeric information (JSON).' })\n meta: any,\n @Arg('org', { nullable: true, description: 'Organizational unit for this value (project, department, company, employee, etc.)' })\n org: string | null,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n const metric = await getRepository(KpiMetric).findOne({ where: { name: metricName, domain: { id: domain.id } } })\n if (!metric) throw new Error(`Metric not found: ${metricName}`)\n const periodType = metric.periodType || KpiPeriodType.DAY\n const valueDate = getDefaultValueDate(periodType)\n if (value == null && meta == null) {\n throw new Error('Either value or meta must be provided.')\n }\n const repo = getRepository(KpiMetricValue, tx)\n let entity = await repo.findOne({\n where: {\n metric: { id: metric.id },\n valueDate,\n periodType,\n org,\n domain: { id: domain.id }\n }\n })\n if (entity) {\n entity.value = value\n entity.meta = meta\n entity.updater = user\n } else {\n entity = repo.create({\n metric,\n metricId: metric.id,\n value,\n meta,\n valueDate,\n periodType,\n org,\n domain,\n creator: user,\n updater: user\n })\n }\n return await repo.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiMetricValue, { description: 'To modify KpiMetricValue information' })\n async updateKpiMetricValue(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiMetricValuePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiMetricValue, tx)\n const metricValue = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n let metric = patch.metricId\n ? await getRepository(KpiMetric).findOne({ where: { id: patch.metricId } })\n : metricValue.metric\n\n const entity: any = {\n ...metricValue,\n ...patch,\n metric,\n updater: user\n }\n\n return await repository.save(entity)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiMetricValue], { description: \"To modify multiple KpiMetricValues' information\" })\n async updateMultipleKpiMetricValue(\n @Arg('patches', type => [KpiMetricValuePatch]) patches: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiMetricValue[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag && patch.cuFlag.toUpperCase() === 'M')\n const metricValueRepo = getRepository(KpiMetricValue, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n if (!newRecord.metricId) {\n throw new Error('metricId is required for creating new metric value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: newRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${newRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...newRecord,\n metric,\n domain,\n creator: user,\n updater: user\n } as any)\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 metricValue = await metricValueRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!metricValue) {\n throw new Error(`failed to find metricValue to update: ${updateRecord.id}`)\n }\n\n if (!updateRecord.metricId) {\n throw new Error('metricId is required for updating value')\n }\n\n const metric = await getRepository(KpiMetric).findOne({\n where: { domain: { id: domain.id }, id: updateRecord.metricId }\n })\n\n if (!metric) {\n throw new Error(`Metric not found: ${updateRecord.metricId}`)\n }\n\n const result = await metricValueRepo.save({\n ...metricValue,\n ...updateRecord,\n metric,\n updater: user\n } as any)\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiMetricValue' })\n async deleteKpiMetricValue(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({ domain: { id: domain.id }, id })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiMetricValues' })\n async deleteKpiMetricValues(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await getRepository(KpiMetricValue, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import multiple KpiMetricValues' })\n async importKpiMetricValues(\n @Arg('metricValues', type => [KpiMetricValuePatch]) metricValues: KpiMetricValuePatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n await Promise.all(\n metricValues.map(async (metricValue: KpiMetricValuePatch) => {\n await getRepository(KpiMetricValue, tx).save({ domain, ...metricValue } as any)\n })\n )\n return true\n }\n}\n\n// valueDate와 periodType의 일치 여부를 검사하는 유틸리티 함수(임시, 아래에 추가)\nfunction isValueDateValidForPeriodType(valueDate: string, periodType: KpiPeriodType): boolean {\n if (!valueDate) return false\n switch (periodType) {\n case KpiPeriodType.DAY:\n return /^\\d{4}-\\d{2}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.MONTH:\n return /^\\d{4}-\\d{2}$/.test(valueDate)\n case KpiPeriodType.QUARTER:\n return /^\\d{4}-Q[1-4]$/.test(valueDate)\n case KpiPeriodType.WEEK:\n return /^\\d{4}-W\\d{1,2}$/.test(valueDate)\n case KpiPeriodType.ALLTIME:\n return valueDate === 'ALLTIME'\n default:\n return true\n }\n}\n"]}
|
|
@@ -52,7 +52,12 @@ let KpiScopeMutation = class KpiScopeMutation {
|
|
|
52
52
|
if (_updateRecords.length > 0) {
|
|
53
53
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
54
54
|
const updateRecord = _updateRecords[i];
|
|
55
|
-
const kpiScope = await kpiScopeRepo.
|
|
55
|
+
const kpiScope = await kpiScopeRepo.findOne({
|
|
56
|
+
where: { domain: { id: domain.id }, id: updateRecord.id }
|
|
57
|
+
});
|
|
58
|
+
if (!kpiScope) {
|
|
59
|
+
throw new Error(`failed to find kpiScope to update: ${updateRecord.id}`);
|
|
60
|
+
}
|
|
56
61
|
const result = await kpiScopeRepo.save({
|
|
57
62
|
...kpiScope,
|
|
58
63
|
...updateRecord,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-scope-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/kpi-scope-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,qCAA4B;AAC5B,iDAAqD;AAGrD,2CAAsC;AACtC,qDAA6D;AAGtD,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAIrB,AAAN,KAAK,CAAC,cAAc,CACD,QAAqB,EAC/B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,oBAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC;YACpD,GAAG,QAAQ;YACX,MAAM;YACN,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAKK,AAAN,KAAK,CAAC,cAAc,CACP,EAAU,EACP,KAAoB,EAC3B,OAAwB;QAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,UAAU,GAAG,IAAA,qBAAa,EAAC,oBAAQ,EAAE,EAAE,CAAC,CAAA;QAC9C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YACxC,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE;SACzC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;YACnC,GAAG,QAAQ;YACX,GAAG,KAAK;YACR,OAAO,EAAE,IAAI;SACd,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAKK,AAAN,KAAK,CAAC,sBAAsB,CACe,OAAwB,EAC1D,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,YAAY,GAAG,IAAA,qBAAa,EAAC,oBAAQ,EAAE,EAAE,CAAC,CAAA;QAEhD,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,YAAY,CAAC,IAAI,CAAC;oBACrC,GAAG,SAAS;oBACZ,MAAM;oBACN,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI;iBACd,CAAC,CAAA;gBAEF,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,QAAQ,GAAG,MAAM,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"kpi-scope-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-scope/kpi-scope-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 type ResolverContext from '@things-factory/auth-base'\n\nimport { KpiScope } from './kpi-scope'\nimport { NewKpiScope, KpiScopePatch } from './kpi-scope-type'\n\n@Resolver(KpiScope)\nexport class KpiScopeMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Create a new scope dimension definition' })\n async createKpiScope(\n @Arg('kpiScope') kpiScope: NewKpiScope,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const result = await getRepository(KpiScope, tx).save({\n ...kpiScope,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiScope, { description: 'Update a scope dimension definition' })\n async updateKpiScope(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiScopePatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiScope> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiScope, tx)\n const kpiScope = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n const result = await repository.save({\n ...kpiScope,\n ...patch,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiScope], { description: \"Update multiple scope dimension definitions\" })\n async updateMultipleKpiScope(\n @Arg('patches', type => [KpiScopePatch]) patches: KpiScopePatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiScope[]> {\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 kpiScopeRepo = getRepository(KpiScope, 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 kpiScopeRepo.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 kpiScope = await kpiScopeRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!kpiScope) {\n throw new Error(`failed to find kpiScope to update: ${updateRecord.id}`)\n }\n\n const result = await kpiScopeRepo.save({\n ...kpiScope,\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 @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete a scope dimension definition' })\n async deleteKpiScope(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'Delete multiple scope dimension definitions' })\n async deleteKpiScopes(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiScope, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n}"]}
|
|
@@ -79,7 +79,12 @@ let KpiStatisticMutation = class KpiStatisticMutation {
|
|
|
79
79
|
if (_updateRecords.length > 0) {
|
|
80
80
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
81
81
|
const updateRecord = _updateRecords[i];
|
|
82
|
-
const kpiStatistic = await kpiStatisticRepo.
|
|
82
|
+
const kpiStatistic = await kpiStatisticRepo.findOne({
|
|
83
|
+
where: { domain: { id: domain.id }, id: updateRecord.id }
|
|
84
|
+
});
|
|
85
|
+
if (!kpiStatistic) {
|
|
86
|
+
throw new Error(`failed to find kpiStatistic to update: ${updateRecord.id}`);
|
|
87
|
+
}
|
|
83
88
|
// 메타데이터 업데이트
|
|
84
89
|
const updatedMetadata = {
|
|
85
90
|
...kpiStatistic.metadata,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kpi-statistic-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-statistic/kpi-statistic-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 type ResolverContext from '@things-factory/auth-base'\n\nimport { KpiStatistic } from './kpi-statistic.js'\nimport { NewKpiStatistic, KpiStatisticPatch } from './kpi-statistic-type.js'\nimport { KpiStatisticCalculationService } from './kpi-statistic-calculation.service.js'\nimport { KpiPeriodType } from '../kpi/kpi.js'\n\n@Resolver(KpiStatistic)\nexport class KpiStatisticMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiStatistic, { description: 'To create new KpiStatistic' })\n async createKpiStatistic(\n @Arg('kpiStatistic') kpiStatistic: NewKpiStatistic,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic> {\n const { domain, user, tx } = context.state\n\n // 메타데이터 자동 설정\n const enrichedKpiStatistic = {\n ...kpiStatistic,\n metadata: {\n calculationMethod: kpiStatistic.metadata?.calculationMethod || 'manual',\n lastCalculated: new Date(),\n dataCount: kpiStatistic.count || 0\n }\n }\n\n const result = await getRepository(KpiStatistic, tx).save({\n ...enrichedKpiStatistic,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiStatistic, { description: 'To modify KpiStatistic information' })\n async updateKpiStatistic(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiStatisticPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiStatistic, tx)\n const kpiStatistic = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n // 메타데이터 업데이트\n const updatedMetadata = {\n ...kpiStatistic.metadata,\n ...patch.metadata,\n lastCalculated: new Date()\n }\n\n const result = await repository.save({\n ...kpiStatistic,\n ...patch,\n metadata: updatedMetadata,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { description: \"To modify multiple KpiStatistics' information\" })\n async updateMultipleKpiStatistic(\n @Arg('patches', type => [KpiStatisticPatch]) patches: KpiStatisticPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\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 kpiStatisticRepo = getRepository(KpiStatistic, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n // 메타데이터 자동 설정\n const enrichedRecord = {\n ...newRecord,\n metadata: {\n calculationMethod: newRecord.metadata?.calculationMethod || 'manual',\n lastCalculated: new Date(),\n dataCount: newRecord.count || 0\n }\n }\n\n const result = await kpiStatisticRepo.save({\n ...enrichedRecord,\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 kpiStatistic = await kpiStatisticRepo.findOneBy({ id: updateRecord.id })\n\n // 메타데이터 업데이트\n const updatedMetadata = {\n ...kpiStatistic.metadata,\n ...updateRecord.metadata,\n lastCalculated: new Date()\n }\n\n const result = await kpiStatisticRepo.save({\n ...kpiStatistic,\n ...updateRecord,\n metadata: updatedMetadata,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiStatistic' })\n async deleteKpiStatistic(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiStatistic, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiStatistics' })\n async deleteKpiStatistics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiStatistic, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import KpiStatistics' })\n async importKpiStatistics(\n @Arg('kpiStatistics', type => [KpiStatisticPatch]) kpiStatistics: KpiStatisticPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n\n for (const kpiStatistic of kpiStatistics) {\n // 메타데이터 자동 설정\n const enrichedKpiStatistic = {\n ...kpiStatistic,\n metadata: {\n calculationMethod: kpiStatistic.metadata?.calculationMethod || 'import',\n lastCalculated: new Date(),\n dataCount: kpiStatistic.count || 0\n }\n }\n\n await getRepository(KpiStatistic, tx).save({\n ...enrichedKpiStatistic,\n domain,\n creator: user,\n updater: user\n })\n }\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Calculate statistics for a specific KPI and period from KpiValue data' \n })\n async calculateKpiStatistics(\n @Arg('kpiId') kpiId: string,\n @Arg('periodType', type => KpiPeriodType) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const overallStats = await KpiStatisticCalculationService.calculateKpiStatistics(\n kpiId,\n periodType,\n valueDate,\n null, // 전체 통계\n context\n )\n\n const scopedStats = await KpiStatisticCalculationService.calculateScopedStatistics(\n kpiId,\n periodType,\n valueDate,\n context\n )\n\n return [overallStats, ...scopedStats].filter(Boolean)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Calculate statistics for all KPIs in a specific period from KpiValue data' \n })\n async calculateAllKpiStatistics(\n @Arg('periodType', type => KpiPeriodType) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n return await KpiStatisticCalculationService.calculateAllStatistics(\n periodType,\n valueDate,\n context\n )\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Recalculate statistics for dashboard regions (scope02-based statistics)' \n })\n async calculateRegionalStatistics(\n @Arg('periodType', type => KpiPeriodType, { defaultValue: KpiPeriodType.MONTH }) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const { domain, user, tx } = context.state\n \n // 지역별(scope02) 통계만 계산\n const kpiStatistics = await getRepository(KpiStatistic, tx)\n .createQueryBuilder('stat')\n .leftJoinAndSelect('stat.kpiOrgScope', 'orgScope')\n .leftJoinAndSelect('stat.kpi', 'kpi')\n .where('stat.domain = :domainId', { domainId: domain.id })\n .andWhere('stat.periodType = :periodType', { periodType })\n .andWhere('stat.valueDate = :valueDate', { valueDate })\n .andWhere('orgScope.scope02 IS NOT NULL') // 지역 정보가 있는 것만\n .getMany()\n\n // 계산 결과가 없으면 새로 계산\n if (kpiStatistics.length === 0) {\n return await KpiStatisticCalculationService.calculateAllStatistics(\n periodType,\n valueDate,\n context\n )\n }\n\n // 기존 통계 재계산\n const results: KpiStatistic[] = []\n for (const stat of kpiStatistics) {\n const recalculated = await KpiStatisticCalculationService.calculateKpiStatistics(\n stat.kpiId,\n periodType,\n valueDate,\n stat.kpiOrgScope,\n context\n )\n if (recalculated) results.push(recalculated)\n }\n\n return results\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"kpi-statistic-mutation.js","sourceRoot":"","sources":["../../../server/service/kpi-statistic/kpi-statistic-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 type ResolverContext from '@things-factory/auth-base'\n\nimport { KpiStatistic } from './kpi-statistic.js'\nimport { NewKpiStatistic, KpiStatisticPatch } from './kpi-statistic-type.js'\nimport { KpiStatisticCalculationService } from './kpi-statistic-calculation.service.js'\nimport { KpiPeriodType } from '../kpi/kpi.js'\n\n@Resolver(KpiStatistic)\nexport class KpiStatisticMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiStatistic, { description: 'To create new KpiStatistic' })\n async createKpiStatistic(\n @Arg('kpiStatistic') kpiStatistic: NewKpiStatistic,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic> {\n const { domain, user, tx } = context.state\n\n // 메타데이터 자동 설정\n const enrichedKpiStatistic = {\n ...kpiStatistic,\n metadata: {\n calculationMethod: kpiStatistic.metadata?.calculationMethod || 'manual',\n lastCalculated: new Date(),\n dataCount: kpiStatistic.count || 0\n }\n }\n\n const result = await getRepository(KpiStatistic, tx).save({\n ...enrichedKpiStatistic,\n domain,\n creator: user,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => KpiStatistic, { description: 'To modify KpiStatistic information' })\n async updateKpiStatistic(\n @Arg('id') id: string,\n @Arg('patch') patch: KpiStatisticPatch,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(KpiStatistic, tx)\n const kpiStatistic = await repository.findOne({\n where: { domain: { id: domain.id }, id }\n })\n\n // 메타데이터 업데이트\n const updatedMetadata = {\n ...kpiStatistic.metadata,\n ...patch.metadata,\n lastCalculated: new Date()\n }\n\n const result = await repository.save({\n ...kpiStatistic,\n ...patch,\n metadata: updatedMetadata,\n updater: user\n })\n\n return result\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { description: \"To modify multiple KpiStatistics' information\" })\n async updateMultipleKpiStatistic(\n @Arg('patches', type => [KpiStatisticPatch]) patches: KpiStatisticPatch[],\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\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 kpiStatisticRepo = getRepository(KpiStatistic, tx)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n // 메타데이터 자동 설정\n const enrichedRecord = {\n ...newRecord,\n metadata: {\n calculationMethod: newRecord.metadata?.calculationMethod || 'manual',\n lastCalculated: new Date(),\n dataCount: newRecord.count || 0\n }\n }\n\n const result = await kpiStatisticRepo.save({\n ...enrichedRecord,\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 kpiStatistic = await kpiStatisticRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!kpiStatistic) {\n throw new Error(`failed to find kpiStatistic to update: ${updateRecord.id}`)\n }\n\n // 메타데이터 업데이트\n const updatedMetadata = {\n ...kpiStatistic.metadata,\n ...updateRecord.metadata,\n lastCalculated: new Date()\n }\n\n const result = await kpiStatisticRepo.save({\n ...kpiStatistic,\n ...updateRecord,\n metadata: updatedMetadata,\n updater: user\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete KpiStatistic' })\n async deleteKpiStatistic(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiStatistic, tx).delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple KpiStatistics' })\n async deleteKpiStatistics(\n @Arg('ids', type => [String]) ids: string[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, tx } = context.state\n\n await getRepository(KpiStatistic, tx).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => Boolean, { description: 'To import KpiStatistics' })\n async importKpiStatistics(\n @Arg('kpiStatistics', type => [KpiStatisticPatch]) kpiStatistics: KpiStatisticPatch[],\n @Ctx() context: ResolverContext\n ): Promise<boolean> {\n const { domain, user, tx } = context.state\n\n for (const kpiStatistic of kpiStatistics) {\n // 메타데이터 자동 설정\n const enrichedKpiStatistic = {\n ...kpiStatistic,\n metadata: {\n calculationMethod: kpiStatistic.metadata?.calculationMethod || 'import',\n lastCalculated: new Date(),\n dataCount: kpiStatistic.count || 0\n }\n }\n\n await getRepository(KpiStatistic, tx).save({\n ...enrichedKpiStatistic,\n domain,\n creator: user,\n updater: user\n })\n }\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Calculate statistics for a specific KPI and period from KpiValue data' \n })\n async calculateKpiStatistics(\n @Arg('kpiId') kpiId: string,\n @Arg('periodType', type => KpiPeriodType) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const overallStats = await KpiStatisticCalculationService.calculateKpiStatistics(\n kpiId,\n periodType,\n valueDate,\n null, // 전체 통계\n context\n )\n\n const scopedStats = await KpiStatisticCalculationService.calculateScopedStatistics(\n kpiId,\n periodType,\n valueDate,\n context\n )\n\n return [overallStats, ...scopedStats].filter(Boolean)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Calculate statistics for all KPIs in a specific period from KpiValue data' \n })\n async calculateAllKpiStatistics(\n @Arg('periodType', type => KpiPeriodType) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n return await KpiStatisticCalculationService.calculateAllStatistics(\n periodType,\n valueDate,\n context\n )\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"kpi\", privilege: \"mutation\", domainOwnerGranted: true, superUserGranted: true)')\n @Mutation(returns => [KpiStatistic], { \n description: 'Recalculate statistics for dashboard regions (scope02-based statistics)' \n })\n async calculateRegionalStatistics(\n @Arg('periodType', type => KpiPeriodType, { defaultValue: KpiPeriodType.MONTH }) periodType: KpiPeriodType,\n @Arg('valueDate') valueDate: string,\n @Ctx() context: ResolverContext\n ): Promise<KpiStatistic[]> {\n const { domain, user, tx } = context.state\n \n // 지역별(scope02) 통계만 계산\n const kpiStatistics = await getRepository(KpiStatistic, tx)\n .createQueryBuilder('stat')\n .leftJoinAndSelect('stat.kpiOrgScope', 'orgScope')\n .leftJoinAndSelect('stat.kpi', 'kpi')\n .where('stat.domain = :domainId', { domainId: domain.id })\n .andWhere('stat.periodType = :periodType', { periodType })\n .andWhere('stat.valueDate = :valueDate', { valueDate })\n .andWhere('orgScope.scope02 IS NOT NULL') // 지역 정보가 있는 것만\n .getMany()\n\n // 계산 결과가 없으면 새로 계산\n if (kpiStatistics.length === 0) {\n return await KpiStatisticCalculationService.calculateAllStatistics(\n periodType,\n valueDate,\n context\n )\n }\n\n // 기존 통계 재계산\n const results: KpiStatistic[] = []\n for (const stat of kpiStatistics) {\n const recalculated = await KpiStatisticCalculationService.calculateKpiStatistics(\n stat.kpiId,\n periodType,\n valueDate,\n stat.kpiOrgScope,\n context\n )\n if (recalculated) results.push(recalculated)\n }\n\n return results\n }\n}\n"]}
|
|
@@ -203,7 +203,12 @@ let KpiValueMutation = class KpiValueMutation {
|
|
|
203
203
|
if (_updateRecords.length > 0) {
|
|
204
204
|
for (let i = 0; i < _updateRecords.length; i++) {
|
|
205
205
|
const updateRecord = _updateRecords[i];
|
|
206
|
-
const kpiValue = await kpiValueRepo.
|
|
206
|
+
const kpiValue = await kpiValueRepo.findOne({
|
|
207
|
+
where: { domain: { id: domain.id }, id: updateRecord.id }
|
|
208
|
+
});
|
|
209
|
+
if (!kpiValue) {
|
|
210
|
+
throw new Error(`failed to find kpiValue to update: ${updateRecord.id}`);
|
|
211
|
+
}
|
|
207
212
|
const kpi = await (0, shell_1.getRepository)(kpi_1.Kpi, tx).findOne({
|
|
208
213
|
where: { domain: { id: domain.id }, id: updateRecord.kpiId }
|
|
209
214
|
});
|