diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/PrecSessionStateMachineConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/PrecSessionStateMachineConfig.java index 7912a5a04..32e3cc0fd 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/PrecSessionStateMachineConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/state_machine_2/specific/PrecSessionStateMachineConfig.java @@ -34,6 +34,7 @@ import ru.spcex.clearing.session.state.action.RequirementAndObligationCreationAc import ru.spcex.clearing.session.state.action.ReviseStage1Action; import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndContinueAction; import ru.spcex.clearing.session.state.action.SaveRegistriesAndContinueAction; +import ru.spcex.clearing.session.state.action.SendNotificationAction; import ru.spcex.clearing.session.state.action.UpdateWorkflowStatusAction; import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard; import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard; @@ -60,6 +61,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda private final InspectionObligationsPrecAction inspectionObligationsV2Action; private final SaveRegistriesAndContinueAction obligationAdmissionContinueAction; private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction; + private final SendNotificationAction sendNotificationAction; private final DiscardRegistriesAction discardOblAdmStash = new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs); private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction( @@ -91,13 +93,14 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda @Qualifier("marketCodesForCurr") Supplier> marketCodes, SaveRegistriesAndContinueAction obligationAdmissionContinueAction, - SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, + SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, SendNotificationAction sendNotificationAction, @Qualifier("pauseWorkflowStatusAction") UpdateWorkflowStatusAction pauseWsAction, @Qualifier("activeWorkflowStatusAction") UpdateWorkflowStatusAction activeWsAction) { this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction; + this.sendNotificationAction = sendNotificationAction; this.pauseWsAction = pauseWsAction; this.activeWsAction = activeWsAction; Imdg executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class); @@ -193,6 +196,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda .source(TaskType.InspectionObligations).target(TaskType.FinishingSession) .guard(invert(inspErrGuard)) .action(saveRegistriesAfterInspectionAndContinueAction) + .action(sendNotificationAction) .action(finishAction); } @@ -219,6 +223,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda .source(TaskType.PSEUDO_waitAfterInspectionError).target(TaskType.FinishingSession) .action(activeWsAction) .action(saveRegistriesAfterInspectionAndContinueAction) + .action(sendNotificationAction) .action(finishAction) .event(SsnEvent.CONTINUE); for (var taskType : List.of(TaskType.PSEUDO_waitAfterInspectionError, TaskType.PSEUDO_waitAfterInspectionRestore)) { diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/DataEnum.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/DataEnum.java index 66ca3bc14..a5af86a72 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/DataEnum.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/DataEnum.java @@ -12,6 +12,7 @@ public enum DataEnum { counterPartyId, //Long obligationAdmissionStashedRgs, //Map inspectionObligationStashedRgs, //Map + notificationMessage, erroneousRegistries, //List paymentInstructionReturnMkr, //List paymentInstructionSecurity, //List diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsPrecAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsPrecAction.java index dcc997209..332dd32c9 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsPrecAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InspectionObligationsPrecAction.java @@ -187,6 +187,7 @@ public class InspectionObligationsPrecAction extends ReviseStage1Action { } setGroupStatus.accept(group); } + final StringBuilder[] notificationMessage = {null}; assetsByTcrAndSec.forEach((key, trio) -> { Registry dm_t = trio.dm_t; Registry am_t = trio.am_t; @@ -209,7 +210,14 @@ public class InspectionObligationsPrecAction extends ReviseStage1Action { newPm_t.setSessionType(sessionType.getKey()); newPm_t.setBalance(difference); rgssToStore.put(newPm_t.getId(), newPm_t); + if (notificationMessage[0] == null) { + notificationMessage[0] = new StringBuilder("Сформированы PM*T регистры:"); + } + notificationMessage[0].append("\nдля компании %s – регистр %d;".formatted(newPm_t.getShortName(), newPm_t.getId())); }); + if (notificationMessage[0] != null) { + ctx.getExtendedState().getVariables().put(DataEnum.notificationMessage, notificationMessage[0].toString()); + } ctx.getExtendedState().getVariables().put(DataEnum.erroneousRegistries, errs); ctx.getExtendedState().getVariables().put(DataEnum.inspectionObligationStashedRgs, rgssToStore); } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SendNotificationAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SendNotificationAction.java new file mode 100644 index 000000000..a85c325bb --- /dev/null +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/SendNotificationAction.java @@ -0,0 +1,39 @@ +package ru.spcex.clearing.session.state.action; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.statemachine.StateContext; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.notification.NotificationSender; +import ru.spcex.clearing.session.stage.TaskType; +import ru.spcex.clearing.session.state.DataEnum; +import ru.spcex.clearing.session.state.SsnEvent; +import ru.spcex.platform.enumeration.ObjectType; +import ru.spcex.platform.enumeration.Priority; + +@Service +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class SendNotificationAction extends AbstractSessionActionForOkErrorHandling { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final NotificationSender notificationSender; + + @Autowired + public SendNotificationAction(NotificationSender notificationSender) { + this.notificationSender = notificationSender; + + } + + @Override + protected void actualExecute(StateContext ctx) { + String msg = ctx.getExtendedState().get(DataEnum.notificationMessage, String.class); + if (msg != null) { + log.info("sending notification, msg length {}...", msg.length()); + notificationSender.sendNotification(ObjectType.rgst, msg, Priority.HIGH); + ctx.getExtendedState().getVariables().remove(DataEnum.notificationMessage); + } + } + +}