diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/SessionController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/SessionController.java index 25f00e8a0..0c2d78f06 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/SessionController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/misc/SessionController.java @@ -4,10 +4,13 @@ import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import java.util.Collection; +import java.util.Map; import java.util.concurrent.ExecutionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -21,9 +24,6 @@ import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllRespo import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.IStateLoader; import ru.spcex.clearing.imdg.IMDGDistributedNames; - -import java.util.Collection; -import java.util.Map; import ru.spcex.clearing.platform.messaging.domain.Consts; @Controller @@ -50,21 +50,19 @@ public class SessionController extends AbstractQueueController { @ApiOperation(value = "Continue session") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) - @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(value = "/{event_type}", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public CudResponse repeatSession( @ApiParam(value = "Параметры команды в JSON формате.", required = true) + @PathVariable("event_type") String eventType, @RequestBody ContinueSessionAction continueSessionAction) throws ExecutionException, InterruptedException { - return processRequest(Consts.REPEAT_SESSION, continueSessionAction); + if ("REPT".equals(eventType)) { + return processRequest(Consts.REPEAT_SESSION, continueSessionAction); + } else if ("NEXT".equals(eventType)){ + return processRequest(Consts.CONTINUE_SESSION, continueSessionAction); + } else { + throw new UnsupportedOperationException("Unsupported event type: " + eventType); + } } - @ApiOperation(value = "Continue session") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) - @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) - @ResponseBody - public CudResponse continueSession( - @ApiParam(value = "Параметры команды в JSON формате.", required = true) - @RequestBody ContinueSessionAction continueSessionAction) throws ExecutionException, InterruptedException { - return processRequest(Consts.CONTINUE_SESSION, continueSessionAction); - } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/FormingPaymentInstructionAssetsAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/FormingPaymentInstructionAssetsAction.java index 68971038e..3c3d3f8e6 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/FormingPaymentInstructionAssetsAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/FormingPaymentInstructionAssetsAction.java @@ -424,7 +424,7 @@ public class FormingPaymentInstructionAssetsAction extends AbstractSessionAction Registry rgs = pair.getSecond(); Account account = accountImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_accountId()); Security security = securityImdg.getSingleObjectByID(paymentInstruction.getCreditLeg_securityId()); - if (SessionType.CURR.equals(sessionType) || (rgs != null + if (SessionType.CURR.equals(sessionType) || SessionType.PAYM.equals(sessionType) || (rgs != null && RegistryInstrumentType.M.equalsByKey(rgs.getRegistryInstrumentType()) && !CurrencyCode.isRub(rgs.getSecuritySymbol()))) { boolean madeStatements = statementsWereMade(paymentInstruction, rgs); diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InclusionToPoolAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InclusionToPoolAction.java index e43f8c48d..71310ced7 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InclusionToPoolAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/InclusionToPoolAction.java @@ -164,7 +164,7 @@ public class InclusionToPoolAction extends AbstractSessionActionForOkErrorHandli switch (ssnTpe) { case MEDM, FINL, XDEP -> execImdg = (Imdg) executionDepositImdg; case IPO0, IPOB, TRDT, IPOT -> execImdg = (Imdg) executionFondImdg; - case CURR -> execImdg = (Imdg) executionCurrImdg; + case CURR, PAYM -> execImdg = (Imdg) executionCurrImdg; default -> { //кейс для "общих" сессий (напр. UNIT) в которых сочетаются разные сделки //смотрим на секцию регистра. diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/RequirementAndObligationCreationAction.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/RequirementAndObligationCreationAction.java index 1efe76aa7..2c339fa04 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/RequirementAndObligationCreationAction.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/state/action/RequirementAndObligationCreationAction.java @@ -40,6 +40,7 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.service.TcrSearcher; import ru.spcex.clearing.session.stage.TaskType; import ru.spcex.clearing.session.stage.impl.IRegistryBuilder; +import ru.spcex.clearing.session.stage.impl.RegistryCkBuilder; import ru.spcex.clearing.session.stage.impl.RegistryCurrBuilder; import ru.spcex.clearing.session.stage.impl.RegistryDepoBuilder; import ru.spcex.clearing.session.stage.impl.RegistryFondBuilder; @@ -55,6 +56,8 @@ import ru.spcex.platform.enumeration.RegistryDesignation; import ru.spcex.platform.enumeration.RegistryInstrumentType; import ru.spcex.platform.enumeration.RegistryTradingParams; import ru.spcex.platform.enumeration.RegistryUnit; +import ru.spcex.platform.enumeration.Sender; +import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.enumeration.Side; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; @@ -69,6 +72,7 @@ import ru.spcex.platform.imdg.iml.hazelcast.adapter.CashV2ById; import ru.spcex.platform.imdg.iml.hazelcast.adapter.CashV2ByIdAndString; import ru.spcex.platform.imdg.iml.hazelcast.adapter.CashV2ByString; import ru.spcex.platform.utils.collection.Pair; +import ru.spcex.platform.utils.enumeration.IEnumKey; @Service("requirementAndObligationCreationAction") @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) @@ -94,6 +98,8 @@ public class RequirementAndObligationCreationAction extends AbstractSessionActio private final Imdg currImdg; private final TcrSearcher tcrSearcher; private final SecuritySelector secSelector; + private SessionType sessionType; + private TradingClearingRegistry ckTcr; @Autowired public RequirementAndObligationCreationAction(ImdgProvider imdgProvider) { @@ -141,6 +147,7 @@ public class RequirementAndObligationCreationAction extends AbstractSessionActio @SuppressWarnings("unchecked") List list = ctx.getExtendedState().get(DataEnum.dealsPrepared, List.class); Long sessionId = ctx.getExtendedState().get(DataEnum.sessionId, Long.class); + SessionType sessionType = ctx.getExtendedState().get(DataEnum.sessionType, SessionType.class); createRegisters(list, sessionId, null); } finally { doRgsSearch = null; @@ -148,6 +155,7 @@ public class RequirementAndObligationCreationAction extends AbstractSessionActio } protected void createRegisters(List data, Long sessionId, Map rgsStorage) { + this.ckTcr = null; data.sort(tradeTimeComparator.thenComparing(execIdComparator).thenComparing(execMarketComparator)); Map newRgss = rgsStorage != null ? rgsStorage : storageMap(data); //см. описание к #matchExecutions @@ -221,6 +229,12 @@ public class RequirementAndObligationCreationAction extends AbstractSessionActio findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.T, true); findAndUpdateOrCreate.accept(counterExec, RegistryDesignation.O, true); } + if (isCk()) { + createRegistryForCK(partyExec, RegistryDesignation.O, newRgss); + createRegistryForCK(partyExec, RegistryDesignation.T, newRgss); + createRegistryForCK(counterExec, RegistryDesignation.O, newRgss); + createRegistryForCK(counterExec, RegistryDesignation.T, newRgss); + } } if (rgsStorage == null) { log.info("batch insert {} registries into map", newRgss.size()); @@ -228,7 +242,48 @@ public class RequirementAndObligationCreationAction extends AbstractSessionActio } } + private boolean isCk() { + return IEnumKey.contains(sessionType, SessionType.PREP, SessionType.PAYM); + } + private void createRegistryForCK( + ExecutionCommon exec, + RegistryDesignation rgsDsgn, + Map newRgss + ) { + if (this.ckTcr == null) { + this.ckTcr = tcrImdg.getSingleObjectByPredicate( + tcrImdg.predicateBuilder().equals("companyId", Sender.CK.getId()) + ); + } + IRegistryBuilder registryBuilder = RegistryCkBuilder.builder(); + Registry newRegister = registryBuilder + //cashes + .dpAccCash(cash.dpAccCash) + .currCash(cash.currCash) + .clrAccCash(cash.clrAccCash) + //imdg + .cmpImdg(cmpImdg) + .tcrImdg(tcrImdg) + .accImdg(accImdg) + .ssnImdg(ssnImdg) + .clAccImdg(clAccImdg) + .dpAccImdg(dpAccImdg) + .currPairSecImdg(currPairSecImdg) + .currPairDictImdg(currPairDictImdg) + .currImdg(currImdg) + .tcrSearcher(tcrSearcher) + .secSelector(secSelector) + .imdg(imdgProvider) + .ckTcr(ckTcr) + .exec(exec) + .registryDesignation(rgsDsgn) + .returnDeposit(false) + .build(); + newRegister.setId(idGen.nextId()); + newRgss.put(newRegister.getId(), newRegister); + log.debug("execution id {}: created rgs.id={}", exec, newRegister.getId()); + } protected boolean searchForRegisters(Long sessionId) { if (sessionId == null) return true;