ialbert 2026-04-15 15:18:27 +03:00
parent a461d55366
commit 5b6eb04345
4 changed files with 54 additions and 1 deletions

View file

@ -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.ReviseStage1Action;
import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndContinueAction; import ru.spcex.clearing.session.state.action.SaveRegistriesAfterInspectionAndContinueAction;
import ru.spcex.clearing.session.state.action.SaveRegistriesAndContinueAction; 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.action.UpdateWorkflowStatusAction;
import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard; import ru.spcex.clearing.session.state.guard.ErroneousRegistriesPresentGuard;
import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard; import ru.spcex.clearing.session.state.guard.StashedRegistriesPresentGuard;
@ -60,6 +61,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda
private final InspectionObligationsPrecAction inspectionObligationsV2Action; private final InspectionObligationsPrecAction inspectionObligationsV2Action;
private final SaveRegistriesAndContinueAction obligationAdmissionContinueAction; private final SaveRegistriesAndContinueAction obligationAdmissionContinueAction;
private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction; private final SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction;
private final SendNotificationAction sendNotificationAction;
private final DiscardRegistriesAction discardOblAdmStash = private final DiscardRegistriesAction discardOblAdmStash =
new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs); new DiscardRegistriesAction(DataEnum.obligationAdmissionStashedRgs);
private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction( private final DiscardRegistriesAction discardInspOblStash = new DiscardRegistriesAction(
@ -91,13 +93,14 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda
@Qualifier("marketCodesForCurr") @Qualifier("marketCodesForCurr")
Supplier<List<String>> marketCodes, Supplier<List<String>> marketCodes,
SaveRegistriesAndContinueAction obligationAdmissionContinueAction, SaveRegistriesAndContinueAction obligationAdmissionContinueAction,
SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, SaveRegistriesAfterInspectionAndContinueAction saveRegistriesAfterInspectionAndContinueAction, SendNotificationAction sendNotificationAction,
@Qualifier("pauseWorkflowStatusAction") @Qualifier("pauseWorkflowStatusAction")
UpdateWorkflowStatusAction pauseWsAction, UpdateWorkflowStatusAction pauseWsAction,
@Qualifier("activeWorkflowStatusAction") @Qualifier("activeWorkflowStatusAction")
UpdateWorkflowStatusAction activeWsAction) { UpdateWorkflowStatusAction activeWsAction) {
this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); this.sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction; this.saveRegistriesAfterInspectionAndContinueAction = saveRegistriesAfterInspectionAndContinueAction;
this.sendNotificationAction = sendNotificationAction;
this.pauseWsAction = pauseWsAction; this.pauseWsAction = pauseWsAction;
this.activeWsAction = activeWsAction; this.activeWsAction = activeWsAction;
Imdg<ExecutionCurrency> executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class); Imdg<ExecutionCurrency> executionCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionCurrency, ExecutionCurrency.class);
@ -193,6 +196,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda
.source(TaskType.InspectionObligations).target(TaskType.FinishingSession) .source(TaskType.InspectionObligations).target(TaskType.FinishingSession)
.guard(invert(inspErrGuard)) .guard(invert(inspErrGuard))
.action(saveRegistriesAfterInspectionAndContinueAction) .action(saveRegistriesAfterInspectionAndContinueAction)
.action(sendNotificationAction)
.action(finishAction); .action(finishAction);
} }
@ -219,6 +223,7 @@ public class PrecSessionStateMachineConfig extends EnumStateMachineConfigurerAda
.source(TaskType.PSEUDO_waitAfterInspectionError).target(TaskType.FinishingSession) .source(TaskType.PSEUDO_waitAfterInspectionError).target(TaskType.FinishingSession)
.action(activeWsAction) .action(activeWsAction)
.action(saveRegistriesAfterInspectionAndContinueAction) .action(saveRegistriesAfterInspectionAndContinueAction)
.action(sendNotificationAction)
.action(finishAction) .action(finishAction)
.event(SsnEvent.CONTINUE); .event(SsnEvent.CONTINUE);
for (var taskType : List.of(TaskType.PSEUDO_waitAfterInspectionError, TaskType.PSEUDO_waitAfterInspectionRestore)) { for (var taskType : List.of(TaskType.PSEUDO_waitAfterInspectionError, TaskType.PSEUDO_waitAfterInspectionRestore)) {

View file

@ -12,6 +12,7 @@ public enum DataEnum {
counterPartyId, //Long counterPartyId, //Long
obligationAdmissionStashedRgs, //Map<Long, Registry> obligationAdmissionStashedRgs, //Map<Long, Registry>
inspectionObligationStashedRgs, //Map<Long, Registry> inspectionObligationStashedRgs, //Map<Long, Registry>
notificationMessage,
erroneousRegistries, //List<RgsErr> erroneousRegistries, //List<RgsErr>
paymentInstructionReturnMkr, //List<PaymentInstruction> paymentInstructionReturnMkr, //List<PaymentInstruction>
paymentInstructionSecurity, //List<PaymentInstruction> paymentInstructionSecurity, //List<PaymentInstruction>

View file

@ -187,6 +187,7 @@ public class InspectionObligationsPrecAction extends ReviseStage1Action {
} }
setGroupStatus.accept(group); setGroupStatus.accept(group);
} }
final StringBuilder[] notificationMessage = {null};
assetsByTcrAndSec.forEach((key, trio) -> { assetsByTcrAndSec.forEach((key, trio) -> {
Registry dm_t = trio.dm_t; Registry dm_t = trio.dm_t;
Registry am_t = trio.am_t; Registry am_t = trio.am_t;
@ -209,7 +210,14 @@ public class InspectionObligationsPrecAction extends ReviseStage1Action {
newPm_t.setSessionType(sessionType.getKey()); newPm_t.setSessionType(sessionType.getKey());
newPm_t.setBalance(difference); newPm_t.setBalance(difference);
rgssToStore.put(newPm_t.getId(), newPm_t); 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.erroneousRegistries, errs);
ctx.getExtendedState().getVariables().put(DataEnum.inspectionObligationStashedRgs, rgssToStore); ctx.getExtendedState().getVariables().put(DataEnum.inspectionObligationStashedRgs, rgssToStore);
} }

View file

@ -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<TaskType, SsnEvent> 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);
}
}
}