From eaa1c855d985e8f717bcbfc8d2fc37922ab01137 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Fri, 30 Oct 2026 17:18:18 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=BD=D0=B8=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3:=20=D0=BB=D0=BE=D0=B3=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D1=8F=D0=B2?= =?UTF-8?q?=D0=BE=D0=BA,=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=20=D1=80=D0=B5?= =?UTF-8?q?=D1=88=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=83=D1=8E=D1=89=D0=B8=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit saveRequestItem — «Создана заявка» (тип, id, код); writeRoute/writeApprovers — «Заявка отправлена на согласование» (статус, число согласующих и исполнителей); ApproverService.decide — «Заявка согласована / возвращена / отклонена / выполнена исполнителем» (новый статус, строка маршрута, комментарий до 500 символов). Пользователь — из токена мониторинга. Co-Authored-By: Claude Opus 5.5 --- .../approval/approvalSubmission.service.ts | 12 ++++++++++++ .../shared/approval/approverDecision.service.ts | 17 +++++++++++++++++ src/webparts/requestPortal/shared/dataList.ts | 4 ++++ 3 files changed, 33 insertions(+) diff --git a/src/webparts/requestPortal/shared/approval/approvalSubmission.service.ts b/src/webparts/requestPortal/shared/approval/approvalSubmission.service.ts index 974b663..a7edf90 100644 --- a/src/webparts/requestPortal/shared/approval/approvalSubmission.service.ts +++ b/src/webparts/requestPortal/shared/approval/approvalSubmission.service.ts @@ -1,4 +1,5 @@ import { WebPartContext } from '@microsoft/sp-webpart-base'; +import { log } from '@tnsu/monitoring-web'; import { resolveRoute } from './approvalRoute.service'; import { ApprovalListService, IApproverToWrite } from './approvalList.service'; import { IMatrixRow } from './models/IMatrixRow'; @@ -68,6 +69,11 @@ export async function writeApprovers( await approval.createSteps(requestId, approvers, rowStatus, APPROVAL_PHASE.approval, 1); if (submitted) { await approval.activateNextQueued(requestId); + log.info('Заявка отправлена на согласование', { + 'request.id': requestId, + 'request.status': status, + 'route.approvers': approvers.length, + }); } } @@ -138,5 +144,11 @@ export async function writeRoute( if (submitted) { await approval.activateNextQueued(requestId); + log.info('Заявка отправлена на согласование', { + 'request.id': requestId, + 'request.status': status, + 'route.approvers': approvers.length, + 'route.executors': executors.length, + }); } } diff --git a/src/webparts/requestPortal/shared/approval/approverDecision.service.ts b/src/webparts/requestPortal/shared/approval/approverDecision.service.ts index bfba56e..b19e9aa 100644 --- a/src/webparts/requestPortal/shared/approval/approverDecision.service.ts +++ b/src/webparts/requestPortal/shared/approval/approverDecision.service.ts @@ -1,3 +1,4 @@ +import { log } from '@tnsu/monitoring-web'; import { getSP } from '../pnp/pnpjs'; import '@pnp/sp/webs'; import '@pnp/sp/lists'; @@ -25,6 +26,14 @@ export interface IPendingRow extends IApprovalRow { isDelegator: boolean; } +// Решение → текст события в логах мониторинга. +const DECISION_MESSAGE: Record = { + approve: 'Заявка согласована', + return: 'Заявка возвращена на доработку', + reject: 'Заявка отклонена', + execute: 'Заявка выполнена исполнителем', +}; + // Решение → статус его строки в списке согласования. const ROW_STATUS: Record = { approve: REQUEST_STATUS.approved, @@ -336,6 +345,14 @@ export class ApproverService { const rows = await this.approval.getForRequest(requestId); const requestStatus = this.computeRequestStatus(rows); await this.updateRequestStatus(requestId, requestStatus); + log.info(DECISION_MESSAGE[decision], { + 'request.id': requestId, + 'request.list': this.dataListRef, + 'request.status': requestStatus, + 'approval.decision': decision, + 'approval.rowId': rowId, + 'approval.comment': comment.slice(0, 500), + }); emitRequestsChanged(); return requestStatus; } diff --git a/src/webparts/requestPortal/shared/dataList.ts b/src/webparts/requestPortal/shared/dataList.ts index 97620e5..1ba49b7 100644 --- a/src/webparts/requestPortal/shared/dataList.ts +++ b/src/webparts/requestPortal/shared/dataList.ts @@ -2,6 +2,7 @@ import '@pnp/sp/webs'; import '@pnp/sp/lists'; import '@pnp/sp/items'; import { IList } from '@pnp/sp/lists'; +import { log } from '@tnsu/monitoring-web'; import { getSP } from './pnp/pnpjs'; import { buildRequestUniqueCode } from './requestCode'; import { dataListTitle } from './listTitles'; @@ -58,5 +59,8 @@ export async function saveRequestItem( // Код известен только после создания элемента (нужен его Id). const code = buildRequestUniqueCode(codePrefix, id, new Date()); await list.items.getById(id).update({ RequestUniqueCode: code }); + // Событие для мониторинга: кто (пользователь — из токена) и какую заявку создал. Отправка на согласование + // и решения пишутся отдельно — approvalSubmission.service.ts и approverDecision.service.ts. + log.info('Создана заявка', { 'request.type': formId, 'request.id': id, 'request.code': code }); return { id, code }; }