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 }; }