ialbert 2026-07-09 16:11:40 +03:00
parent 0e3cdcac4c
commit bd0237f129
5 changed files with 46 additions and 27 deletions

View file

@ -49,7 +49,9 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryChangeSt
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistryReturnDepositRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDepositActionRequest;
import ru.spcex.clearing.service.AssetTrio;
import ru.spcex.clearing.service.IsActiveSessionRunningService;
import ru.spcex.clearing.service.registry.AssetTBFProcessing;
import ru.spcex.clearing.service.validation.ActiveSessionIsPresentValidationRule;
import ru.spcex.clearing.service.validation.AnltAccLoad;
import ru.spcex.clearing.service.validation.ClrngValidationStored;
import ru.spcex.clearing.service.validation.CompanyByTradingCodeValidationRule;
@ -99,6 +101,8 @@ import ru.spcex.platform.utils.validation.ValidatorImpl;
@Configuration
public class ValidationConfig {
private final IsActiveSessionRunningService actionSessionChecker;
Imdg<Relation> imdgRelation;
Imdg<Company> imdgCompany;
Imdg<Currency> imdgCurrency;
@ -128,7 +132,8 @@ public class ValidationConfig {
ImdgProvider imdgProvider;
AssetTBFProcessing assetsMng;
public ValidationConfig(ImdgProvider imdgProvider, AssetTBFProcessing assetsMng) {
public ValidationConfig(IsActiveSessionRunningService actionSessionChecker, ImdgProvider imdgProvider, AssetTBFProcessing assetsMng) {
this.actionSessionChecker = actionSessionChecker;
this.imdgRelation = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class);
this.imdgCompany = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
this.imdgCurrency = imdgProvider.getImdg(IMDGDistributedNames.Map_Currency, Currency.class);
@ -303,7 +308,7 @@ public class ValidationConfig {
Sdf06NewValidationRule.CompanySymbolAndCompanyPresent,
Sdf06NewValidationRule.AccountPresent,
Sdf06NewValidationRule.CompanyAndAccountMatch,
Sdf06NewValidationRule.Session,
new ActiveSessionIsPresentValidationRule<>(actionSessionChecker),
Sdf06NewValidationRule.Balance,
Sdf06NewValidationRule.TcrPresent,
CurrencyCodeValidationRule.get(ClearingError.CompanyDebitCheck)
@ -333,7 +338,7 @@ public class ValidationConfig {
Sdf10ValidationRule.DepoAccountPresent,
CompanyByTradingCodeValidationRule.instance(SDf10::getDepoCode),
Sdf10ValidationRule.CompanyStatus,
Sdf06NewValidationRule.Session,
new ActiveSessionIsPresentValidationRule<>(actionSessionChecker),
Sdf10ValidationRule.TcrPresent,
SecurityBySecurityCodeValidationRule.instance(SDf10::getSecurityCode),
Sdf10ValidationRule.Balance

View file

@ -1,7 +1,6 @@
package ru.spcex.clearing.service;
import java.util.Collection;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@ -10,6 +9,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@Service
public class IsActiveSessionRunningService {
@ -21,9 +21,13 @@ public class IsActiveSessionRunningService {
}
public boolean isThereAnActiveSession() {
Collection<Session> activeSessions = ssnImdg.getCollectionObjectsByFieldValues(Map.of(
"workflowStatus", WorkflowStatus.Active.getKey()
));
ImdgPredicateBuilder pb = ssnImdg.predicateBuilder();
Collection<Session> activeSessions = ssnImdg.getCollectionObjectsByPredicate(
pb.or(
pb.equals("workflowStatus", WorkflowStatus.Active.getKey()),
pb.equals("workflowStatus", WorkflowStatus.Pause.getKey())
)
);
activeSessions.stream().findFirst().ifPresent(
session -> log.debug("found session.id {}", session.getId())
);

View file

@ -95,7 +95,7 @@ public class TasksDelayedBySessionServiceV2 implements ImdgEntryListener<Session
@Override
public void innerEntryUpdated(ImdgEntryEvent<Session> event) {
if (notSessionEndEvent(event.getOldValue(), event.getValue())) {
if (!sessionEndEvent(event.getOldValue(), event.getValue())) {
log.trace("not a session end event.");
return;
}
@ -106,7 +106,7 @@ public class TasksDelayedBySessionServiceV2 implements ImdgEntryListener<Session
}
}
private boolean notSessionEndEvent(Session sessionOldValue, Session sessionNewValue) {
private boolean sessionEndEvent(Session sessionOldValue, Session sessionNewValue) {
if (sessionOldValue == null || sessionNewValue == null) {
log.warn("old value null {}, new value null {}",
sessionOldValue == null, sessionNewValue == null);
@ -115,7 +115,9 @@ public class TasksDelayedBySessionServiceV2 implements ImdgEntryListener<Session
String oldWS = sessionOldValue.getWorkflowStatus();
String newWS = sessionNewValue.getWorkflowStatus();
log.trace("workflow statuses: {} -> {}", oldWS, newWS);
return !(WorkflowStatus.Active.equalsByKey(oldWS) && !WorkflowStatus.Active.equalsByKey(newWS));
return WorkflowStatus.Active.equalsByKey(oldWS)
&& !WorkflowStatus.Active.equalsByKey(newWS)
&& !WorkflowStatus.Pause.equalsByKey(newWS);
}
private void notifyEventReceiver(Long groupId) {

View file

@ -0,0 +1,25 @@
package ru.spcex.clearing.service.validation;
import java.util.Optional;
import ru.spcex.clearing.error.ClearingError;
import ru.spcex.clearing.service.IsActiveSessionRunningService;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.validation.IValidationRule;
import ru.spcex.platform.utils.validation.IValidatorContext;
public class ActiveSessionIsPresentValidationRule<T extends IValidatorContext>
implements IValidationRule<T> {
private final IsActiveSessionRunningService ssnChecker;
public ActiveSessionIsPresentValidationRule(IsActiveSessionRunningService ssnChecker) {
this.ssnChecker = ssnChecker;
}
@Override
public Optional<EnumMessage> validate(T context) {
if (ssnChecker.isThereAnActiveSession()) {
return of(ClearingError.ActiveSessionIsPresent);
}
return empty();
}
}

View file

@ -1,8 +1,6 @@
package ru.spcex.clearing.service.validation;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
@ -10,7 +8,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.clearing.classes.statics.data.account.Account;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.misc.Session;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
import ru.clearing.classes.statics.data.registry.TradingClearingRegistryList;
@ -23,7 +20,6 @@ import ru.spcex.platform.enumeration.AccountType;
import ru.spcex.platform.enumeration.InOutDirection;
import ru.spcex.platform.enumeration.RegistryStatus;
import ru.spcex.platform.enumeration.RegistryTradingParams;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicate;
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
@ -103,19 +99,6 @@ public enum Sdf06NewValidationRule implements IValidationRule<ImdgValidationCont
return empty();
}
},
Session() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {
Imdg<Session> sessionImdg = context.obtainMap(IMDGDistributedNames.Map_Session, Session.class);
Collection<Session> activeSessions = sessionImdg.getCollectionObjectsByFieldValues(Map.of(
"workflowStatus", WorkflowStatus.Active.getKey()
));
if (activeSessions.size() > 0) {
return of(ClearingError.ActiveSessionIsPresent);
}
return empty();
}
},
Balance() {
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<SDf06> context) {