SDF56/51, UNIT session, registry#section
This commit is contained in:
parent
bebb114bea
commit
a52f135ee2
20 changed files with 640 additions and 37 deletions
|
|
@ -45,6 +45,7 @@ import ru.spcex.clearing.session.stage.SecondaryAuctionT0Session;
|
||||||
import ru.spcex.clearing.session.stage.SessionManager;
|
import ru.spcex.clearing.session.stage.SessionManager;
|
||||||
import ru.spcex.clearing.session.stage.SessionTerminator;
|
import ru.spcex.clearing.session.stage.SessionTerminator;
|
||||||
import ru.spcex.clearing.session.stage.TaskType;
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.clearing.session.stage.UnitedSession;
|
||||||
import ru.spcex.clearing.session.stage.impl.BalanceRevise;
|
import ru.spcex.clearing.session.stage.impl.BalanceRevise;
|
||||||
import ru.spcex.clearing.statement.StatementServiceV2;
|
import ru.spcex.clearing.statement.StatementServiceV2;
|
||||||
import ru.spcex.platform.enumeration.Task;
|
import ru.spcex.platform.enumeration.Task;
|
||||||
|
|
@ -65,6 +66,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
private final PrimaryAuctionB0Session primaryAuctionB0Session;
|
private final PrimaryAuctionB0Session primaryAuctionB0Session;
|
||||||
private final IntermediateMkrSession intermediateMkrSession;
|
private final IntermediateMkrSession intermediateMkrSession;
|
||||||
private final FinalMkrSession finalMkrSession;
|
private final FinalMkrSession finalMkrSession;
|
||||||
|
private final UnitedSession unitedSession;
|
||||||
private final ReturnDepositSession returnDepositSession;
|
private final ReturnDepositSession returnDepositSession;
|
||||||
private final SessionManager sessionManager;
|
private final SessionManager sessionManager;
|
||||||
private final Sdf06Executor sdf06Executor;
|
private final Sdf06Executor sdf06Executor;
|
||||||
|
|
@ -83,7 +85,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
PrimaryAuctionBnSession primaryAuctionBnSession,
|
PrimaryAuctionBnSession primaryAuctionBnSession,
|
||||||
SecondaryAuctionT0Session secondaryAuctionT0Session,
|
SecondaryAuctionT0Session secondaryAuctionT0Session,
|
||||||
CurrencySession currencySession,
|
CurrencySession currencySession,
|
||||||
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
|
PrimaryAuctionB0Session primaryAuctionB0Session, PrimaryAuctionT0Session primaryAuctionT0Session, IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, UnitedSession unitedSession, ReturnDepositSession returnDepositSession, SessionManager sessionManager,
|
||||||
Sdf06Executor sdf06Executor,
|
Sdf06Executor sdf06Executor,
|
||||||
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, SessionTerminator sessionTerminator, PaymentInstructionOutboundService pmtOutboundService) {
|
Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, StatementServiceV2 statementService, SessionTerminator sessionTerminator, PaymentInstructionOutboundService pmtOutboundService) {
|
||||||
super(kafkaQueue, kafkaResponseQueue);
|
super(kafkaQueue, kafkaResponseQueue);
|
||||||
|
|
@ -98,6 +100,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
this.primaryAuctionT0Session = primaryAuctionT0Session;
|
this.primaryAuctionT0Session = primaryAuctionT0Session;
|
||||||
this.intermediateMkrSession = intermediateMkrSession;
|
this.intermediateMkrSession = intermediateMkrSession;
|
||||||
this.finalMkrSession = finalMkrSession;
|
this.finalMkrSession = finalMkrSession;
|
||||||
|
this.unitedSession = unitedSession;
|
||||||
this.returnDepositSession = returnDepositSession;
|
this.returnDepositSession = returnDepositSession;
|
||||||
this.sessionManager = sessionManager;
|
this.sessionManager = sessionManager;
|
||||||
this.sdf06Executor = sdf06Executor;
|
this.sdf06Executor = sdf06Executor;
|
||||||
|
|
@ -153,6 +156,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
primaryAuctionB0Session.continueSession(req);
|
primaryAuctionB0Session.continueSession(req);
|
||||||
intermediateMkrSession.continueSession(req);
|
intermediateMkrSession.continueSession(req);
|
||||||
finalMkrSession.continueSession(req);
|
finalMkrSession.continueSession(req);
|
||||||
|
unitedSession.continueSession(req);
|
||||||
returnDepositSession.continueSession(req);
|
returnDepositSession.continueSession(req);
|
||||||
})
|
})
|
||||||
.forDestination(Consts.CONTINUE_SESSION_BN_FIRST_PART, callbacks::put);
|
.forDestination(Consts.CONTINUE_SESSION_BN_FIRST_PART, callbacks::put);
|
||||||
|
|
@ -207,7 +211,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean {
|
||||||
|
|
||||||
callback(LauncherCommandRequest.class)
|
callback(LauncherCommandRequest.class)
|
||||||
.setConsumer(task -> {
|
.setConsumer(task -> {
|
||||||
balanceRevise.submit(new ru.spcex.clearing.session.stage.Task<>(TaskType.StartRevise, null));
|
balanceRevise.submit(new ru.spcex.clearing.session.stage.Task<>(TaskType.SDF51, null));
|
||||||
})
|
})
|
||||||
.forDestination(Task.getVerification.topic(), callbacks::put);
|
.forDestination(Task.getVerification.topic(), callbacks::put);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -180,7 +180,7 @@ public class ExecutionCurrencyComponent {
|
||||||
eCurrency.setTradingDate(sTrades.getTradeDate());
|
eCurrency.setTradingDate(sTrades.getTradeDate());
|
||||||
eCurrency.setClearingDate(TimeUtil.toLocalDate(now));
|
eCurrency.setClearingDate(TimeUtil.toLocalDate(now));
|
||||||
eCurrency.setExchangeExecutionId(sTrades.getTradeNum());
|
eCurrency.setExchangeExecutionId(sTrades.getTradeNum());
|
||||||
eCurrency.setExchangeExecutionTime(sTrades.getTradeDateTime());
|
eCurrency.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs()));
|
||||||
eCurrency.setExchangeExecutionMicroseconds(sTrades.getTradeDateTime()); // todo проверить это дата+время или нет
|
eCurrency.setExchangeExecutionMicroseconds(sTrades.getTradeDateTime()); // todo проверить это дата+время или нет
|
||||||
eCurrency.setPartyTradingClearingRegistryId(rgstr.getId()); // setTradingClearingRegistryId
|
eCurrency.setPartyTradingClearingRegistryId(rgstr.getId()); // setTradingClearingRegistryId
|
||||||
eCurrency.setPartyTradingClearingRegistry(rgstr.getCode()); // todo уточнить rgstr.code/strades.account?
|
eCurrency.setPartyTradingClearingRegistry(rgstr.getCode()); // todo уточнить rgstr.code/strades.account?
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ public class ExecutionDepositComponent {
|
||||||
eDeposit.setTradingDate(sTrades.getTradeDate());
|
eDeposit.setTradingDate(sTrades.getTradeDate());
|
||||||
eDeposit.setClearingDate(TimeUtil.toLocalDate(now));
|
eDeposit.setClearingDate(TimeUtil.toLocalDate(now));
|
||||||
eDeposit.setExchangeExecutionId(sTrades.getTradeNum());
|
eDeposit.setExchangeExecutionId(sTrades.getTradeNum());
|
||||||
eDeposit.setExchangeExecutionTime(sTrades.getTradeDateTime());
|
eDeposit.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs()));
|
||||||
eDeposit.setTradingClearingRegistryId(rgstr.getId());
|
eDeposit.setTradingClearingRegistryId(rgstr.getId());
|
||||||
eDeposit.setMarket(sTrades.getClassCode());
|
eDeposit.setMarket(sTrades.getClassCode());
|
||||||
eDeposit.setPrice(sTrades.getPrice());
|
eDeposit.setPrice(sTrades.getPrice());
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ public class ExecutionFondComponent {
|
||||||
eFond.setTradingDate(sTrades.getTradeDate());
|
eFond.setTradingDate(sTrades.getTradeDate());
|
||||||
eFond.setClearingDate(TimeUtil.toLocalDate(now));
|
eFond.setClearingDate(TimeUtil.toLocalDate(now));
|
||||||
eFond.setExchangeExecutionId(sTrades.getTradeNum());
|
eFond.setExchangeExecutionId(sTrades.getTradeNum());
|
||||||
eFond.setExchangeExecutionTime(sTrades.getTradeDateTime());
|
eFond.setExchangeExecutionTime(TimeUtil.instPlusMicros(sTrades.getTradeDateTime(), sTrades.getTradeTimeMs()));
|
||||||
eFond.setTradingClearingRegistryId(rgstr.getId());
|
eFond.setTradingClearingRegistryId(rgstr.getId());
|
||||||
|
|
||||||
//todo можем ли просто переложить sTrades.getClassCode() или все такие искать, одно и тоже же
|
//todo можем ли просто переложить sTrades.getClassCode() или все такие искать, одно и тоже же
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,7 @@ public class SessionManager {
|
||||||
private final IntermediateMkrSession intermediateMkrSession;
|
private final IntermediateMkrSession intermediateMkrSession;
|
||||||
private final FinalMkrSession finalMkrSession;
|
private final FinalMkrSession finalMkrSession;
|
||||||
private final ReturnDepositSession returnDepositSession;
|
private final ReturnDepositSession returnDepositSession;
|
||||||
|
private final UnitedSession unitedSession;
|
||||||
private final TradingTimeService time;
|
private final TradingTimeService time;
|
||||||
|
|
||||||
public SessionManager(ImdgProvider imdgProvider,
|
public SessionManager(ImdgProvider imdgProvider,
|
||||||
|
|
@ -45,7 +46,7 @@ public class SessionManager {
|
||||||
PrimaryAuctionBnSession primaryAuctionBnSession,
|
PrimaryAuctionBnSession primaryAuctionBnSession,
|
||||||
PrimaryAuctionB0Session primaryAuctionB0Session,
|
PrimaryAuctionB0Session primaryAuctionB0Session,
|
||||||
SecondaryAuctionT0Session secondaryAuctionT0Session, CurrencySession currencySession,
|
SecondaryAuctionT0Session secondaryAuctionT0Session, CurrencySession currencySession,
|
||||||
IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, TradingTimeService time) {
|
IntermediateMkrSession intermediateMkrSession, FinalMkrSession finalMkrSession, ReturnDepositSession returnDepositSession, UnitedSession unitedSession, TradingTimeService time) {
|
||||||
this.notification = notification;
|
this.notification = notification;
|
||||||
this.msgs = msgs;
|
this.msgs = msgs;
|
||||||
this.primaryAuctionT0Session = primaryAuctionT0Session;
|
this.primaryAuctionT0Session = primaryAuctionT0Session;
|
||||||
|
|
@ -58,6 +59,7 @@ public class SessionManager {
|
||||||
this.returnDepositSession = returnDepositSession;
|
this.returnDepositSession = returnDepositSession;
|
||||||
|
|
||||||
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class);
|
||||||
|
this.unitedSession = unitedSession;
|
||||||
this.time = time;
|
this.time = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,6 +120,7 @@ public class SessionManager {
|
||||||
case MEDM -> session = intermediateMkrSession;
|
case MEDM -> session = intermediateMkrSession;
|
||||||
case FINL -> session = finalMkrSession;
|
case FINL -> session = finalMkrSession;
|
||||||
case XDEP -> session = returnDepositSession;
|
case XDEP -> session = returnDepositSession;
|
||||||
|
case UNIT -> session = unitedSession;
|
||||||
}
|
}
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ public enum TaskType implements IEnumKey {
|
||||||
StartRevise("CLR0"),
|
StartRevise("CLR0"),
|
||||||
ContinueRevise("CLR 0_0"),
|
ContinueRevise("CLR 0_0"),
|
||||||
StartRevisePart1("С0_1"),
|
StartRevisePart1("С0_1"),
|
||||||
|
SDF51("SDF51"),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* step 1
|
* step 1
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,331 @@
|
||||||
|
package ru.spcex.clearing.session.stage;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.beans.factory.ObjectFactory;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionFond;
|
||||||
|
import ru.clearing.classes.statics.data.misc.Session;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.BalanceRevise;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.DealsPrepare;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.EndStageNotification;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.FinishingSession;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.FormingPaymentInstructionAssets;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.FormingRegistersOnOS;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.InclusionObligations;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.InspectionObligations;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.InspectionObligationsDepositReturn;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.ObligationAdmission;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.RequirementsAndObligationCreationCompound;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.UnlockResources;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.compound.CompoundStageDealsPrepare;
|
||||||
|
import ru.spcex.clearing.session.stage.monitor.SessionMonitor;
|
||||||
|
import ru.spcex.clearing.session.stage.monitor.SessionMonitorFactory;
|
||||||
|
import ru.spcex.clearing.session.stage.task.DealsPreparePayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.EndStageNotificationPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.FinishingSessionPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.FormingRegistersOnOSPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.InclusionToPoolPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.RequirementsAndObligationCreationCompoundPayload;
|
||||||
|
import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
|
import ru.spcex.platform.enumeration.Section;
|
||||||
|
import ru.spcex.platform.enumeration.SessionStatus;
|
||||||
|
import ru.spcex.platform.enumeration.SessionType;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
//todo эта сессия
|
||||||
|
public class UnitedSession extends AbstractSession implements InitializingBean {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final BalanceRevise balanceRevise;
|
||||||
|
private final DealsPrepare dealsPrepareCurrency;
|
||||||
|
private final DealsPrepare dealsPrepareTRDT;
|
||||||
|
private final DealsPrepare dealsPrepareFinal;
|
||||||
|
private final RequirementsAndObligationCreationCompound requirementsAndObligationCreation;
|
||||||
|
private final ObligationAdmission obligationsAdmission;
|
||||||
|
|
||||||
|
private final InclusionObligations inclusionObligations;
|
||||||
|
private final InspectionObligationsDepositReturn inspectionObligationsReturn;
|
||||||
|
private final InspectionObligations inspectionObligations;
|
||||||
|
|
||||||
|
private final FormingRegistersOnOS formingRegistersOnOS;
|
||||||
|
private final FormingPaymentInstructionAssets formingPaymentInstructionAssets;
|
||||||
|
private final UnlockResources unlockResources;
|
||||||
|
private final FinishingSession finishingSession;
|
||||||
|
private final EndStageNotification endStageNotification;
|
||||||
|
|
||||||
|
private final Imdg<ExecutionFond> executionFondImdg;
|
||||||
|
private final Supplier<List<String>> marketCodesTrdt;
|
||||||
|
private final Supplier<List<String>> marketCodesCurr;
|
||||||
|
private SessionMonitor firstReviseMonitor;
|
||||||
|
private SessionMonitor afterPaymentsSdf4And13Monitor;
|
||||||
|
private SessionMonitor afterPaymentsReviseMonitor;
|
||||||
|
private SessionMonitor afterReviseErrorMonitor;
|
||||||
|
|
||||||
|
|
||||||
|
public UnitedSession(
|
||||||
|
ImdgProvider imdgProvider,
|
||||||
|
BalanceRevise balanceRevise,
|
||||||
|
ObjectFactory<DealsPrepare> deals,
|
||||||
|
RequirementsAndObligationCreationCompound requirementsAndObligationCreation,
|
||||||
|
ObligationAdmission obligationsAdmission,
|
||||||
|
InclusionObligations inclusionObligations, InspectionObligationsDepositReturn inspectionObligationsReturn,
|
||||||
|
FormingRegistersOnOS formingRegistersOnOS,
|
||||||
|
FormingPaymentInstructionAssets formingPaymentInstructionAssets,
|
||||||
|
UnlockResources unlockResources,
|
||||||
|
FinishingSession finishingSession,
|
||||||
|
EndStageNotification endStageNotification,
|
||||||
|
IMessageResolver messageResolver,
|
||||||
|
InspectionObligations inspectionObligations,
|
||||||
|
@Qualifier("marketCodesForCurr") Supplier<List<String>> marketCodesCurr,
|
||||||
|
@Qualifier("marketCodesForT0") Supplier<List<String>> marketCodesTrdt) {
|
||||||
|
super(imdgProvider, messageResolver);
|
||||||
|
this.balanceRevise = balanceRevise;
|
||||||
|
this.dealsPrepareCurrency = deals.getObject();
|
||||||
|
this.dealsPrepareTRDT = deals.getObject();
|
||||||
|
this.dealsPrepareFinal = deals.getObject();
|
||||||
|
this.requirementsAndObligationCreation = requirementsAndObligationCreation;
|
||||||
|
this.obligationsAdmission = obligationsAdmission;
|
||||||
|
this.inclusionObligations = inclusionObligations;
|
||||||
|
this.inspectionObligationsReturn = inspectionObligationsReturn;
|
||||||
|
this.formingRegistersOnOS = formingRegistersOnOS;
|
||||||
|
this.formingPaymentInstructionAssets = formingPaymentInstructionAssets;
|
||||||
|
this.unlockResources = unlockResources;
|
||||||
|
this.finishingSession = finishingSession;
|
||||||
|
this.endStageNotification = endStageNotification;
|
||||||
|
this.executionFondImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ExecutionFond, ExecutionFond.class);
|
||||||
|
this.inspectionObligations = inspectionObligations;
|
||||||
|
this.marketCodesTrdt = marketCodesTrdt;
|
||||||
|
this.marketCodesCurr = marketCodesCurr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() throws Exception {
|
||||||
|
{
|
||||||
|
dealsPrepareCurrency.searchForExecutions(ExecutionType.ExecutionCurrency);
|
||||||
|
ImdgPredicateBuilder pb = executionFondImdg.predicateBuilder();
|
||||||
|
dealsPrepareCurrency.addExecutionFondCondition(pb.regex("settlementCode", "^T0.*$"));
|
||||||
|
dealsPrepareCurrency.addExecutionFondCondition(pb.in("market", marketCodesCurr.get().toArray(new String[0])));
|
||||||
|
|
||||||
|
dealsPrepareTRDT.searchForExecutions(ExecutionType.ExecutionFond);
|
||||||
|
ImdgPredicateBuilder execFondPb = executionFondImdg.predicateBuilder();
|
||||||
|
dealsPrepareTRDT.addExecutionFondCondition(execFondPb.regex("settlementCode", "^T0.*$"));
|
||||||
|
dealsPrepareTRDT.addExecutionFondCondition(execFondPb.in("market", marketCodesTrdt.get().toArray(new String[0])));
|
||||||
|
|
||||||
|
dealsPrepareFinal.searchForExecutions(ExecutionType.ExecutionDeposit);
|
||||||
|
dealsPrepareFinal.addExecutionDepositCondition(pb.regex("firstLegSettlementCode", "^T0.*$"));
|
||||||
|
}
|
||||||
|
//1 шаг deals prepare вызываем 3 раза с разными параметрами объединяемых сессий
|
||||||
|
inclusionObligations.setSessionType(sessionType());
|
||||||
|
inspectionObligationsReturn.setSessionType(sessionType());
|
||||||
|
inspectionObligations.setSection(section());
|
||||||
|
inspectionObligations.setSessionType(sessionType());
|
||||||
|
finishingSession.setSection(section());
|
||||||
|
finishingSession.setSessionType(sessionType());
|
||||||
|
imdgProvider.waitAvailable();
|
||||||
|
initSessionIfPresent();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void runSession(BaseRequest<?> req) {
|
||||||
|
if (!startSession()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
StageResult<?> submit = balanceRevise.submit(new Task<>(TaskType.StartRevise, null));
|
||||||
|
if (!submit.success) {
|
||||||
|
log.error("stage {} error={}", balanceRevise.getClass().getSimpleName(), messageResolver.resolve(submit.error));
|
||||||
|
endSession();
|
||||||
|
} else {
|
||||||
|
log.info("stage BalanceRevise success, waiting for a response from kafka");
|
||||||
|
this.firstReviseMonitor = SessionMonitorFactory.waitRevise();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void continueSession(BaseRequest<?> req) {
|
||||||
|
try {
|
||||||
|
if (!isRunning()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log.info("session is running, stage {}, monitors: {}",
|
||||||
|
currStage.get(),
|
||||||
|
logMonitors(firstReviseMonitor, afterPaymentsSdf4And13Monitor, afterPaymentsReviseMonitor));
|
||||||
|
if (firstReviseMonitor != null && isMonitorPassed(firstReviseMonitor, req.getRequestPayload())) {
|
||||||
|
firstReviseMonitor = null;
|
||||||
|
firstPart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (afterPaymentsSdf4And13Monitor != null && isMonitorPassed(afterPaymentsSdf4And13Monitor, req.getRequestPayload())) {
|
||||||
|
afterPaymentsSdf4And13Monitor = null;
|
||||||
|
checkStageAndThrow(TaskType.FormingPaymentInstruction);
|
||||||
|
finishPart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (afterReviseErrorMonitor != null && isMonitorPassed(afterReviseErrorMonitor, req.getRequestPayload())) {
|
||||||
|
afterReviseErrorMonitor = null;
|
||||||
|
finishPart();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//if (afterPaymentsReviseMonitor != null && isMonitorPassed(afterPaymentsReviseMonitor, req.getRequestPayload())) {
|
||||||
|
// afterPaymentsReviseMonitor = null;
|
||||||
|
// finishPart();
|
||||||
|
//}
|
||||||
|
} catch (StageException e) {
|
||||||
|
//already logged
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void firstPart() {
|
||||||
|
try {
|
||||||
|
if (!checkStage(TaskType.StartRevise)) {
|
||||||
|
log.error("cannot continue session, current stage is {}", currStage.get());
|
||||||
|
throw new StageException();
|
||||||
|
}
|
||||||
|
runStage(TaskType.StartRevisePart1, currSession.getId(), balanceRevise);
|
||||||
|
//stage 1
|
||||||
|
StageResult<DealsPrepareCompoundResult> dealsPreparationResult;
|
||||||
|
{
|
||||||
|
DealsPreparePayload payload = new DealsPreparePayload();
|
||||||
|
payload.setSessionId(currSession.getId());
|
||||||
|
dealsPreparationResult = runStage(TaskType.DealsPrepare, payload, new CompoundStageDealsPrepare(
|
||||||
|
dealsPrepareTRDT, dealsPrepareCurrency, dealsPrepareFinal
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
//stage 2
|
||||||
|
{
|
||||||
|
RequirementsAndObligationCreationCompoundPayload p;
|
||||||
|
p = RequirementsAndObligationCreationCompoundPayload.create(dealsPreparationResult.getStageResult());
|
||||||
|
runStage(TaskType.RequirementsAndObligationsCreate, p, requirementsAndObligationCreation);
|
||||||
|
}
|
||||||
|
|
||||||
|
//stage 3
|
||||||
|
runStage(TaskType.ObligationsAdmission, currSession.getId(), obligationsAdmission);
|
||||||
|
//stage 4
|
||||||
|
{
|
||||||
|
InclusionToPoolPayload inclusionToPoolPayload = new InclusionToPoolPayload();
|
||||||
|
inclusionToPoolPayload.setSessionType(currSession.getSessionType());
|
||||||
|
inclusionToPoolPayload.setSessionId(currSession.getId());
|
||||||
|
runStage(TaskType.InclusionToPool, inclusionToPoolPayload, inclusionObligations);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
InspectionPoolPayload companyIdPayload = new InspectionPoolPayload();
|
||||||
|
companyIdPayload.setSessionId(currSession.getId());
|
||||||
|
companyIdPayload.setProcessedCompanyId(currSession.getCompanyId());
|
||||||
|
//fixme checks inside the stages
|
||||||
|
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligationsReturn);
|
||||||
|
runStage(TaskType.InspectionObligations, companyIdPayload, inspectionObligations);
|
||||||
|
}
|
||||||
|
|
||||||
|
//stage 6
|
||||||
|
{
|
||||||
|
FormingRegistersOnOSPayload payload = new FormingRegistersOnOSPayload();
|
||||||
|
payload.setSessionId(currSession.getId());
|
||||||
|
runStage(TaskType.FormingRegistersOnOS, payload, formingRegistersOnOS); //returns Collection<Registry>
|
||||||
|
}
|
||||||
|
//stage 7
|
||||||
|
//fixmeStageResult<PaymentInfo> paymentResult = null;
|
||||||
|
//fixme {
|
||||||
|
//fixme FormingPaymentInstructionPayload payload = new FormingPaymentInstructionPayload();
|
||||||
|
//fixme payload.setSessionId(currSession.getId());
|
||||||
|
//fixme paymentResult = runStage(TaskType.FormingPaymentInstruction, payload, formingPaymentInstructionAssets);
|
||||||
|
//fixme }
|
||||||
|
//fixme if (paymentResult.getStageResult().getPaymentInstructions().isEmpty()) {
|
||||||
|
//fixme log.info("no payment instructions were created");
|
||||||
|
//fixme finishPart();
|
||||||
|
//fixme } else {
|
||||||
|
//fixme this.afterPaymentsSdf4And13Monitor = SessionMonitorFactory.waitStep7(section());
|
||||||
|
//fixme log.info("created {} PaymentInstructions, waiting for {}",
|
||||||
|
//fixme paymentResult.getStageResult().getPaymentInstructions().size(),
|
||||||
|
//fixme this.afterPaymentsSdf4And13Monitor.allConditions());
|
||||||
|
//fixme }
|
||||||
|
} catch (StageException e) {
|
||||||
|
//already logged
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void finishPart() {
|
||||||
|
try {
|
||||||
|
//stage 9 continue revision
|
||||||
|
{
|
||||||
|
StageResult<Object> reviseRes = runStage(TaskType.AgainRevise, currSession.getId(), balanceRevise, false);
|
||||||
|
if (!reviseRes.isSuccess()) {
|
||||||
|
this.afterReviseErrorMonitor = SessionMonitorFactory.waitReviseError(section());
|
||||||
|
log.warn("{} stage error, created monitor for {}",
|
||||||
|
TaskType.AgainRevise,
|
||||||
|
afterReviseErrorMonitor.allConditions());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//stage 10
|
||||||
|
{
|
||||||
|
FinishingSessionPayload payload = new FinishingSessionPayload();
|
||||||
|
payload.setSessionId(currSession.getId());
|
||||||
|
payload.setPr("1");
|
||||||
|
runStage(TaskType.FinishingSession, payload, finishingSession);
|
||||||
|
}
|
||||||
|
//stage 11
|
||||||
|
{
|
||||||
|
EndStageNotificationPayload payload = new EndStageNotificationPayload();
|
||||||
|
payload.setSection(currSession.getSection());
|
||||||
|
payload.setSessionId(currSession.getId());
|
||||||
|
runStage(TaskType.EndStageNotification, payload, endStageNotification);
|
||||||
|
endSession();
|
||||||
|
}
|
||||||
|
} catch (StageException e) {
|
||||||
|
//already logged
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sendSdf56() {
|
||||||
|
runStage(TaskType.FormingPaymentInstruction, balanceRevise);
|
||||||
|
this.afterPaymentsReviseMonitor = SessionMonitorFactory.waitRevise();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean startSession() {
|
||||||
|
synchronized (this.currStage) {
|
||||||
|
if (this.currStage.get() != null) {
|
||||||
|
log.info("already running session.id={}", this.currSession.getId());
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
TaskType startStatus = TaskType.StartRevise;
|
||||||
|
Session newSession = new Session();
|
||||||
|
newSession.setSection(section().getKey());
|
||||||
|
newSession.setSessionType(sessionType().getKey());
|
||||||
|
newSession.setSessionStatus(startStatus.getKey());
|
||||||
|
newSession.setWorkflowStatus(SessionStatus.ACTV.getKey());
|
||||||
|
newSession.setClearingDate(LocalDate.now());
|
||||||
|
newSession.setCreated(Instant.now());
|
||||||
|
|
||||||
|
//todo companyId/securityId/userId передается из сообщения очереди
|
||||||
|
sessionImdg.insert(newSession);
|
||||||
|
currSession = newSession;
|
||||||
|
log.info("started new session.id={}", this.currSession.getId());
|
||||||
|
currStage.set(TaskType.StartRevise);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Section section() {
|
||||||
|
return Section.FOND;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected SessionType sessionType() {
|
||||||
|
return SessionType.UNIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -77,6 +77,9 @@ public class BalanceRevise implements ISessionStage {
|
||||||
@Override
|
@Override
|
||||||
public StageResult<?> submit(Task<?> task) {
|
public StageResult<?> submit(Task<?> task) {
|
||||||
switch (task.getTaskType()) {
|
switch (task.getTaskType()) {
|
||||||
|
case SDF51 -> {
|
||||||
|
return sendSdfs51();
|
||||||
|
}
|
||||||
case StartRevise, FormingPaymentInstruction -> {
|
case StartRevise, FormingPaymentInstruction -> {
|
||||||
LocalTime fromTime = null;
|
LocalTime fromTime = null;
|
||||||
if (task.getData() instanceof LocalTime) {
|
if (task.getData() instanceof LocalTime) {
|
||||||
|
|
|
||||||
|
|
@ -123,7 +123,7 @@ public class InspectionObligations implements ISessionStage {
|
||||||
boolean isUncovered = false;
|
boolean isUncovered = false;
|
||||||
List<CheckResult> checkResults = new ArrayList<>();
|
List<CheckResult> checkResults = new ArrayList<>();
|
||||||
for (Registry obligation : obligationsInGroup) {
|
for (Registry obligation : obligationsInGroup) {
|
||||||
if ((SessionType.FINL.equals(sessionType) || SessionType.MEDM.equals(sessionType)) && RegistryInstrumentType.S.equalsByKey(obligation.getRegistryInstrumentType())) {
|
if ((SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType) || SessionType.MEDM.equals(sessionType)) && RegistryInstrumentType.S.equalsByKey(obligation.getRegistryInstrumentType())) {
|
||||||
checkResults.add(new CheckResult(obligation, false));
|
checkResults.add(new CheckResult(obligation, false));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
package ru.spcex.clearing.session.stage.impl;
|
package ru.spcex.clearing.session.stage.impl;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
|
@ -18,21 +25,19 @@ import ru.spcex.clearing.session.stage.ISessionStage;
|
||||||
import ru.spcex.clearing.session.stage.StageResult;
|
import ru.spcex.clearing.session.stage.StageResult;
|
||||||
import ru.spcex.clearing.session.stage.Task;
|
import ru.spcex.clearing.session.stage.Task;
|
||||||
import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
|
import ru.spcex.clearing.session.stage.task.InspectionPoolPayload;
|
||||||
import ru.spcex.platform.enumeration.*;
|
import ru.spcex.platform.enumeration.ClearingCategory;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryCapacity;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryTradingParams;
|
||||||
|
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||||
|
import ru.spcex.platform.enumeration.SessionType;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
import ru.spcex.platform.imdg.api.predicate.specific.RegistryCodeSqlBuilder;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static ru.spcex.platform.enumeration.RegistryTradingParams.*;
|
|
||||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -205,7 +210,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SessionType.FINL.equals(sessionType)
|
if ((SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType))
|
||||||
&& amfBalance.compareTo(omtBalance) >= 0
|
&& amfBalance.compareTo(omtBalance) >= 0
|
||||||
&& initiatorV(omtRgs) && gatewayIfNeeded(omtRgs)) {
|
&& initiatorV(omtRgs) && gatewayIfNeeded(omtRgs)) {
|
||||||
log.debug("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. " +
|
log.debug("OM*T.id={} -> no DM*X/DM*T(INFO/CLRN) registry found. " +
|
||||||
|
|
@ -262,7 +267,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryStatus registryStatusFailed() {
|
private RegistryStatus registryStatusFailed() {
|
||||||
if (SessionType.FINL.equals(sessionType)) {
|
if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) {
|
||||||
return RegistryStatus.FAIL;
|
return RegistryStatus.FAIL;
|
||||||
} else {
|
} else {
|
||||||
return RegistryStatus.MNG;
|
return RegistryStatus.MNG;
|
||||||
|
|
@ -270,7 +275,7 @@ public class InspectionObligationsDepositReturn implements ISessionStage {
|
||||||
}
|
}
|
||||||
|
|
||||||
private RegistryStatus registryStatusFailed(Registry registry) {
|
private RegistryStatus registryStatusFailed(Registry registry) {
|
||||||
if (SessionType.FINL.equals(sessionType)) {
|
if (SessionType.FINL.equals(sessionType) || SessionType.UNIT.equals(sessionType)) {
|
||||||
if (equalByRgs(OM_T, registry)) {
|
if (equalByRgs(OM_T, registry)) {
|
||||||
return RegistryStatus.UNCV;
|
return RegistryStatus.UNCV;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||||
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||||
import ru.spcex.platform.enumeration.RegistryStatus;
|
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||||
import ru.spcex.platform.enumeration.RegistryUnit;
|
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||||
|
import ru.spcex.platform.enumeration.Section;
|
||||||
import ru.spcex.platform.enumeration.Side;
|
import ru.spcex.platform.enumeration.Side;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
@ -195,6 +196,7 @@ public class RegistryCurrBuilder implements IRegistryBuilder {
|
||||||
reg.setGroupId(groupId());
|
reg.setGroupId(groupId());
|
||||||
reg.setSessionId(exec.getSessionId());
|
reg.setSessionId(exec.getSessionId());
|
||||||
reg.setSessionType(sessionType());
|
reg.setSessionType(sessionType());
|
||||||
|
reg.setSection(Section.CURR.getKey());
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,8 @@
|
||||||
package ru.spcex.clearing.session.stage.impl;
|
package ru.spcex.clearing.session.stage.impl;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Map;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
import ru.clearing.classes.statics.data.account.ClearingAccount;
|
import ru.clearing.classes.statics.data.account.ClearingAccount;
|
||||||
import ru.clearing.classes.statics.data.account.DepoAccount;
|
import ru.clearing.classes.statics.data.account.DepoAccount;
|
||||||
|
|
@ -15,14 +18,20 @@ import ru.clearing.classes.statics.data.registry.TradingClearingRegistry;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
||||||
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
import ru.spcex.platform.enumeration.*;
|
import ru.spcex.platform.enumeration.AccountType;
|
||||||
|
import ru.spcex.platform.enumeration.BalanceDimension;
|
||||||
|
import ru.spcex.platform.enumeration.ISide;
|
||||||
|
import ru.spcex.platform.enumeration.MoneyFlowSide;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryCapacity;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||||
|
import ru.spcex.platform.enumeration.Section;
|
||||||
|
import ru.spcex.platform.enumeration.Side;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
public class RegistryDepoBuilder implements IRegistryBuilder {
|
public class RegistryDepoBuilder implements IRegistryBuilder {
|
||||||
private Imdg<Company> companyImdg;
|
private Imdg<Company> companyImdg;
|
||||||
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
private Imdg<TradingClearingRegistry> tradingClearingRegistryImdg;
|
||||||
|
|
@ -148,6 +157,7 @@ public class RegistryDepoBuilder implements IRegistryBuilder {
|
||||||
reg.setGroupId(groupId());
|
reg.setGroupId(groupId());
|
||||||
reg.setSessionId(exec.getSessionId());
|
reg.setSessionId(exec.getSessionId());
|
||||||
reg.setSessionType(sessionType());
|
reg.setSessionType(sessionType());
|
||||||
|
reg.setSection(Section.MKR.getKey());
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
package ru.spcex.clearing.session.stage.impl;
|
package ru.spcex.clearing.session.stage.impl;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.Map;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
import ru.clearing.classes.statics.data.account.ClearingAccount;
|
import ru.clearing.classes.statics.data.account.ClearingAccount;
|
||||||
import ru.clearing.classes.statics.data.account.DepoAccount;
|
import ru.clearing.classes.statics.data.account.DepoAccount;
|
||||||
|
|
@ -16,17 +21,21 @@ import ru.clearing.classes.statics.data.security.Security;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
import ru.spcex.clearing.session.stage.util.RegistryUtil;
|
||||||
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
import ru.spcex.platform.enumeration.*;
|
import ru.spcex.platform.enumeration.AccountType;
|
||||||
|
import ru.spcex.platform.enumeration.BalanceDimension;
|
||||||
|
import ru.spcex.platform.enumeration.ISide;
|
||||||
|
import ru.spcex.platform.enumeration.InstrumentType;
|
||||||
|
import ru.spcex.platform.enumeration.MoneyFlowSide;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryCapacity;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryDesignation;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryInstrumentType;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryStatus;
|
||||||
|
import ru.spcex.platform.enumeration.RegistryUnit;
|
||||||
|
import ru.spcex.platform.enumeration.Section;
|
||||||
|
import ru.spcex.platform.enumeration.Side;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
import ru.spcex.platform.imdg.api.predicate.specific.SecuritySelector;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.RoundingMode;
|
|
||||||
import java.time.Instant;
|
|
||||||
import java.time.LocalDate;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD;
|
||||||
|
|
||||||
public class RegistryFondBuilder implements IRegistryBuilder {
|
public class RegistryFondBuilder implements IRegistryBuilder {
|
||||||
|
|
@ -162,6 +171,7 @@ public class RegistryFondBuilder implements IRegistryBuilder {
|
||||||
reg.setGroupId(groupId());
|
reg.setGroupId(groupId());
|
||||||
reg.setSessionId(exec.getSessionId());
|
reg.setSessionId(exec.getSessionId());
|
||||||
reg.setSessionType(sessionType());
|
reg.setSessionType(sessionType());
|
||||||
|
reg.setSection(Section.FOND.getKey());
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ public class RequirementsAndObligationCreation implements ISessionStage {
|
||||||
throw new IllegalStateException("Unknown task type: " + task.getTaskType());
|
throw new IllegalStateException("Unknown task type: " + task.getTaskType());
|
||||||
}
|
}
|
||||||
|
|
||||||
private StageResult<?> createRegisters(List<ExecutionCommon> data) {
|
protected StageResult<?> createRegisters(List<ExecutionCommon> data) {
|
||||||
data.sort(Comparator.comparing(ExecutionCommon::getExchangeExecutionId));
|
data.sort(Comparator.comparing(ExecutionCommon::getExchangeExecutionId));
|
||||||
//см. описание к #matchExecutions
|
//см. описание к #matchExecutions
|
||||||
for (int i = 0; i < data.size(); ) {
|
for (int i = 0; i < data.size(); ) {
|
||||||
|
|
@ -219,7 +219,7 @@ public class RequirementsAndObligationCreation implements ISessionStage {
|
||||||
* если это не так, передалать на коллекцию Long executionId в правильном порядке
|
* если это не так, передалать на коллекцию Long executionId в правильном порядке
|
||||||
* и для каждого искать мэтч отдельно в Imdg, с сохранением уже обработанных для избежания дублирования
|
* и для каждого искать мэтч отдельно в Imdg, с сохранением уже обработанных для избежания дублирования
|
||||||
*/
|
*/
|
||||||
private Pair<ExecutionCommon, ExecutionCommon> matchExecutions(List<ExecutionCommon> data, int i) {
|
protected Pair<ExecutionCommon, ExecutionCommon> matchExecutions(List<ExecutionCommon> data, int i) {
|
||||||
//if the last execution, then no match
|
//if the last execution, then no match
|
||||||
if (i >= data.size() - 1) {
|
if (i >= data.size() - 1) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
package ru.spcex.clearing.session.stage.impl;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
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.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
import ru.spcex.clearing.session.stage.StageResult;
|
||||||
|
import ru.spcex.clearing.session.stage.Task;
|
||||||
|
import ru.spcex.clearing.session.stage.TaskType;
|
||||||
|
import ru.spcex.clearing.session.stage.task.RequirementsAndObligationCreationCompoundPayload;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.ExecutionType;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.collection.Pair;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* LiabilitiesAndClaims
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||||
|
public class RequirementsAndObligationCreationCompound extends RequirementsAndObligationCreation {
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private static final Comparator<ExecutionCommon> tradeTimeComparator
|
||||||
|
= Comparator.comparing(ExecutionCommon::getExchangeExecutionTime);
|
||||||
|
|
||||||
|
private static final Comparator<ExecutionCommon> execIdComparator
|
||||||
|
= Comparator.comparing(ExecutionCommon::getExchangeExecutionId);
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public RequirementsAndObligationCreationCompound(ImdgProvider imdgProvider) {
|
||||||
|
super(imdgProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public StageResult<?> submit(Task<?> task) {
|
||||||
|
if (task.getTaskType() == TaskType.RequirementsAndObligationsCreate) {
|
||||||
|
return mergeReqsAndClaims((RequirementsAndObligationCreationCompoundPayload) task.getData());
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Unknown task type: " + task.getTaskType());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private StageResult<?> mergeReqsAndClaims(RequirementsAndObligationCreationCompoundPayload data) {
|
||||||
|
List<ExecutionCommon> tmpList = new ArrayList<>(Arrays.asList(new ExecutionCommon[2]));
|
||||||
|
List<ExecutionCommon> executionFond = data.getExecutionsTrdt();
|
||||||
|
List<ExecutionCommon> executionCurrency = data.getExecutionsCurrency();
|
||||||
|
List<ExecutionCommon> executionDeposit = data.getExecutionsFinal();
|
||||||
|
Stream.of(executionFond, executionCurrency, executionDeposit).forEach(c -> c.sort(execIdComparator));
|
||||||
|
|
||||||
|
int efs = executionFond.size();
|
||||||
|
int eds = executionDeposit.size();
|
||||||
|
int ecs = executionCurrency.size();
|
||||||
|
|
||||||
|
int[] ief= {0}, ied= {0}, iec= {0};
|
||||||
|
while (ief[0] < efs || ied[0] < eds || iec[0] < ecs) {
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> pair = getMinTimeExecutions(
|
||||||
|
safeMatch(executionFond, ief),
|
||||||
|
safeMatch(executionDeposit, ied),
|
||||||
|
safeMatch(executionCurrency, iec)
|
||||||
|
);
|
||||||
|
if (pair == null) continue;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionFond)) ief[0] += 2;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionDeposit)) ied[0] += 2;
|
||||||
|
if (pair.getFirst().type().equals(ExecutionType.ExecutionCurrency)) iec[0] += 2;
|
||||||
|
pair.map(f -> tmpList.set(0, f), s -> tmpList.set(1, s));
|
||||||
|
createRegisters(tmpList);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new StageResult<>(null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<ExecutionCommon, ExecutionCommon> safeMatch(List<ExecutionCommon> l, int[] i) {
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> pair = matchExecutions(l, i[0]);
|
||||||
|
if (pair == null) {
|
||||||
|
i[0]++;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// i[0] += 2;
|
||||||
|
return pair;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<ExecutionCommon, ExecutionCommon> getMinTimeExecutions(
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> fond,
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> deposit,
|
||||||
|
Pair<ExecutionCommon, ExecutionCommon> currency) {
|
||||||
|
|
||||||
|
return Stream.of(fond, deposit, currency)
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.max((p1, p2) -> tradeTimeComparator.compare(p1.getFirst(), p2.getFirst())).orElse(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package ru.spcex.clearing.session.stage.impl.compound;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import ru.spcex.clearing.session.stage.ISessionStage;
|
||||||
|
import ru.spcex.clearing.session.stage.StageResult;
|
||||||
|
import ru.spcex.clearing.session.stage.Task;
|
||||||
|
|
||||||
|
public abstract class CompoundStage<T> implements ISessionStage {
|
||||||
|
|
||||||
|
private final List<ISessionStage> stages;
|
||||||
|
|
||||||
|
public CompoundStage(ISessionStage... stages) {
|
||||||
|
this.stages = new ArrayList<>();
|
||||||
|
this.stages.addAll(List.of(stages));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract Object mapper(List<T> results);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StageResult<?> submit(Task<?> task) {
|
||||||
|
List<Object> innerResults = new ArrayList<>();
|
||||||
|
for (ISessionStage stage : stages) {
|
||||||
|
StageResult<?> submit = stage.submit(task);
|
||||||
|
if (!submit.isSuccess()) {
|
||||||
|
return submit;
|
||||||
|
}
|
||||||
|
innerResults.add(submit.getStageResult());
|
||||||
|
}
|
||||||
|
StageResult<Object> result = new StageResult<>(null, true);
|
||||||
|
result.setStageResult(mapper((List<T>) innerResults));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
package ru.spcex.clearing.session.stage.impl.compound;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
import ru.spcex.clearing.session.stage.impl.DealsPrepare;
|
||||||
|
import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult;
|
||||||
|
|
||||||
|
public class CompoundStageDealsPrepare extends CompoundStage<List<ExecutionCommon>> {
|
||||||
|
|
||||||
|
public CompoundStageDealsPrepare(DealsPrepare... stages) {
|
||||||
|
super(stages);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object mapper(List<List<ExecutionCommon>> results) {
|
||||||
|
DealsPrepareCompoundResult res = new DealsPrepareCompoundResult();
|
||||||
|
res.setExecutionsTrdt(results.get(0));
|
||||||
|
res.setExecutionsCurrency(results.get(1));
|
||||||
|
res.setExecutionsFinal(results.get(2));
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package ru.spcex.clearing.session.stage.task;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
import ru.spcex.clearing.session.stage.task.result.DealsPrepareCompoundResult;
|
||||||
|
|
||||||
|
public class RequirementsAndObligationCreationCompoundPayload {
|
||||||
|
private List<ExecutionCommon> executionsTrdt;
|
||||||
|
private List<ExecutionCommon> executionsCurrency;
|
||||||
|
private List<ExecutionCommon> executionsFinal;
|
||||||
|
|
||||||
|
public static RequirementsAndObligationCreationCompoundPayload create(DealsPrepareCompoundResult stageResult) {
|
||||||
|
RequirementsAndObligationCreationCompoundPayload p = new RequirementsAndObligationCreationCompoundPayload();
|
||||||
|
p.setExecutionsTrdt(stageResult.getExecutionsTrdt());
|
||||||
|
p.setExecutionsCurrency(stageResult.getExecutionsCurrency());
|
||||||
|
p.setExecutionsFinal(stageResult.getExecutionsFinal());
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsTrdt() {
|
||||||
|
return executionsTrdt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsTrdt(List<ExecutionCommon> executionsTrdt) {
|
||||||
|
this.executionsTrdt = executionsTrdt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsCurrency() {
|
||||||
|
return executionsCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsCurrency(List<ExecutionCommon> executionsCurrency) {
|
||||||
|
this.executionsCurrency = executionsCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsFinal() {
|
||||||
|
return executionsFinal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsFinal(List<ExecutionCommon> executionsFinal) {
|
||||||
|
this.executionsFinal = executionsFinal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
package ru.spcex.clearing.session.stage.task.result;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||||
|
|
||||||
|
public class DealsPrepareCompoundResult {
|
||||||
|
private List<ExecutionCommon> executionsTrdt;
|
||||||
|
private List<ExecutionCommon> executionsCurrency;
|
||||||
|
private List<ExecutionCommon> executionsFinal;
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsTrdt() {
|
||||||
|
return executionsTrdt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsTrdt(List<ExecutionCommon> executionsTrdt) {
|
||||||
|
this.executionsTrdt = executionsTrdt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsCurrency() {
|
||||||
|
return executionsCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsCurrency(List<ExecutionCommon> executionsCurrency) {
|
||||||
|
this.executionsCurrency = executionsCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ExecutionCommon> getExecutionsFinal() {
|
||||||
|
return executionsFinal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExecutionsFinal(List<ExecutionCommon> executionsFinal) {
|
||||||
|
this.executionsFinal = executionsFinal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
public enum SessionType implements IEnumKey {
|
public enum SessionType implements IEnumKey {
|
||||||
IPOB("IPOB"), IPO0("IPO0"), IPOT("IPOT"), TRDT("TRDT"),
|
IPOB("IPOB"), IPO0("IPO0"), IPOT("IPOT"), TRDT("TRDT"),
|
||||||
MEDM("MEDM"), FINL("FINL"), XDEP("XDEP"), LIQU("LIQU"),
|
MEDM("MEDM"), FINL("FINL"), XDEP("XDEP"), LIQU("LIQU"),
|
||||||
CURR("CURR")
|
CURR("CURR"), UNIT("UNIT"),
|
||||||
;
|
;
|
||||||
|
|
||||||
SessionType(String key) {
|
SessionType(String key) {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue