diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/data.xml index 0686abe70..fbb1ae3e8 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/data.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/data.xml @@ -463,6 +463,7 @@ + diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java index 01dbb950e..7e7ac687a 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/error/ClearingError.java @@ -28,6 +28,7 @@ public enum ClearingError implements IErrorEnumId { NewDealsNotFound(5423L), IdentifiedFundsExceedObligations(5424L), ObligationsAlreadyCalculated(5425L), + ActiveSessionIsPresent(5428L), //ошибки "перенесенные" из balance-service, CompanyNotFoundB(5211L), CurrencyNotFound(5213L), @@ -38,8 +39,6 @@ public enum ClearingError implements IErrorEnumId { BalanceInsufficient(5222L), TCRegistryNotFound(3022L), WrongField(5004L), - - ActiveSessionIsPresent(-1L), ; private final Long id; diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java index c6344e6ce..a4d10dff0 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/service/EventsReceiver.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.balance.StatementRequest; import ru.spcex.clearing.platform.messaging.domain.cud.clearing.CreateRegistryRequest; @@ -21,18 +22,23 @@ import ru.spcex.clearing.platform.messaging.domain.cud.registry.RegistrySplitDep import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; import ru.spcex.clearing.platform.messaging.domain.cud.utilities.STradesImportedRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.service.executors.Sdf06Executor; import ru.spcex.clearing.service.executors.Sdf10Executor; import ru.spcex.clearing.service.payment.PaymentInstructionOutboundService; import ru.spcex.clearing.session.stage.*; import ru.spcex.clearing.session.stage.impl.BalanceRevise; import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.error.ValidationException; import static ru.spcex.clearing.platform.messaging.domain.Consts.S_TRADES_IMPORTED; @Service public class EventsReceiver extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); + private final IMessageResolver errorResolver; private final ClearingService clearingService; private final RegistryService registryService; private final PrimaryAuctionBnSession primaryAuctionBnSession; @@ -51,6 +57,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { @Autowired public EventsReceiver(Consumer kafkaQueue, Producer kafkaResponseQueue, + IMessageResolver errorResolver, ClearingService clearingService, RegistryService registryService, PrimaryAuctionBnSession primaryAuctionBnSession, @@ -59,6 +66,7 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { Sdf06Executor sdf06Executor, Sdf10Executor sdf10Executor, BalanceRevise balanceRevise, Sdf05Sender sdf05Sender, PaymentInstructionOutboundService pmtOutboundService) { super(kafkaQueue, kafkaResponseQueue); + this.errorResolver = errorResolver; this.clearingService = clearingService; this.registryService = registryService; this.primaryAuctionBnSession = primaryAuctionBnSession; @@ -95,7 +103,14 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { .forDestination(Consts.CONTINUE_CLEARING, callbacks::put); callback(LauncherCommandRequest.class) - .setConsumer(sessionManager::defineAndStartSession) + .setFunction(r -> { + try { + sessionManager.defineAndStartSession(r); + } catch (ValidationException ve) { + return makeErrorResponse(r, ve); + } + return null; + }) .forDestination(Task.startOfClearing.topic(), callbacks::put); callback(PIClearingOutbondActionNewRequest.class) @@ -160,4 +175,14 @@ public class EventsReceiver extends QueueConsumer implements InitializingBean { .forDestination(Task.sdf05WithCode9Final.topic(), callbacks::put); init(); } + + RequestInfoUpdate makeErrorResponse(BaseRequest r, ValidationException ve) { + String errorText = errorResolver.resolve(ve.getEnumMsg()); + log.error("Error at {}: {}", r, errorText); + RequestInfoUpdate errorMsg = new RequestInfoUpdate(); + errorMsg.setId(r.getId()); + errorMsg.setStatus(Status.Error); + errorMsg.setMessage(errorText); + return errorMsg; + } } diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java index a9d6e99c4..7a4ea185b 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/session/stage/SessionManager.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.misc.Session; +import ru.spcex.clearing.error.ClearingError; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; @@ -13,6 +14,7 @@ import ru.spcex.platform.enumeration.SessionType; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.enumeration.IEnumKey; +import ru.spcex.platform.utils.error.ValidationException; import java.util.Map; @@ -46,7 +48,7 @@ public class SessionManager { sessionImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Session, Session.class); } - public void defineAndStartSession(BaseRequest r) { //task sclr section fond sessiontype trdt + public void defineAndStartSession(BaseRequest r) throws ValidationException { //task sclr section fond sessiontype trdt LauncherCommandRequest payload = r.getRequestPayload(); // Long sessionId = commandRequest.getSessionId(); SessionType sessionType = IEnumKey.getEnumByKey(SessionType.class, payload.getSessionType()); @@ -75,13 +77,13 @@ public class SessionManager { } } - protected void checkActiveSession() { + protected void checkActiveSession() throws ValidationException { Session existActiveSession = sessionImdg.getFirstObjectByFieldValues(Map.of( "workflowStatus", SessionStatus.ACTV.getKey() )); if (existActiveSession != null) { log.warn("Can not start new session, cause exist active session.id={}", existActiveSession.getId()); - throw new RuntimeException("ActiveSessionIsPresent " + existActiveSession); + throw new ValidationException(ClearingError.ActiveSessionIsPresent, String.valueOf(existActiveSession.getId())); } } } diff --git a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql index 092623992..7b4e4f753 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DATA.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DATA.sql @@ -896,6 +896,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5426, 'CLRN', 'Реж INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5427, 'CLRN', 'Найдено больше одной записи %s.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; +INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5428, 'CLRN', 'Активная клиринговая сессия уже существует.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; + INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5600, 'DBFI', 'Общая ошибка модуля dbf-importer.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME; INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (5800, 'DBFE', 'Общая ошибка модуля dbf-exporter.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;