From fd7ee9a9896ef769629106fa0b84540998ed3b7a Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 20 Dec 2022 17:57:00 +0300 Subject: [PATCH 1/9] http://jira.mfd.msk:8088/browse/CLS-16 --- .../MoneyMarketSecurityNewAction.java | 24 +++- .../MoneyMarketSecurityUpdateAction.java | 27 +++++ .../system/RequestStatusController.java | 1 + .../service/RequestInfoAccepter.java | 1 + .../validation/ActionValidationProvider.java | 26 +++-- .../service/validation/rules/PresentById.java | 28 ----- .../config/MessageResolverConfig.java | 8 +- .../securities/component/ListingBuilder.java | 24 ++++ .../config/ErrorResolverConfig.java | 14 +++ .../securities/errors/SecuritiesError.java | 21 ++++ .../cud/MoneyMarketSecurityService.java | 105 +++++++++++++++--- .../validation/ValidationProvider.java | 66 +++++++++++ .../validation/rule/EndDtAfterStartDt.java | 28 +++++ .../validation/rule/MmsNewValidationRule.java | 37 ++++++ .../rule/MmsUpdateValidationRule.java | 32 ++++++ .../MoneyMarketSecurityServiceDisabled.java | 5 +- .../classes/base/interfaces/WithEndDt.java | 7 ++ .../base/interfaces/WithSecuritySymbol.java | 5 + .../classes/base/interfaces/WithStartDt.java | 7 ++ .../ru/spcex/platform/enumeration/Market.java | 18 +++ .../iml/hazelcast/adapter/ImdgHazelcast.java | 1 + .../java/ru/spcex/platform/imdg/api/Imdg.java | 4 + .../validation/ImdgValidationContext.java | 3 + .../platform/imdg/validation/Stored.java | 11 ++ .../imdg/validation/rule/PresentById.java | 43 +++++++ .../MoneyMarketSecurityNewRequest.java | 4 +- .../MoneyMarketSecurityUpdateRequest.java | 4 +- .../messaging/service/RequestInfoUpdate.java | 24 +++- .../enumeration/SimpleMessageResolver.java | 11 ++ 29 files changed, 524 insertions(+), 65 deletions(-) delete mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java create mode 100644 clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java create mode 100644 platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java create mode 100644 platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java create mode 100644 platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java create mode 100644 platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java index 69059d4d1..f96db5e09 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java @@ -9,14 +9,17 @@ import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; +import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -public class MoneyMarketSecurityNewAction implements IAction { +public class MoneyMarketSecurityNewAction implements IAction, WithSecuritySymbol { @ApiModelProperty(value = "Дата начала действия", example = "2022-01-20") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") @JsonDeserialize(using = LocalDateDeserializer.class) @@ -48,9 +51,24 @@ public class MoneyMarketSecurityNewAction implements IAction validate() { + List errors = new ArrayList<>(); if (this.startDate == null) - return List.of(new EnumMessage(BackEndError.ValidationError, "startDate")); - else return Collections.emptyList(); + errors.add(new EnumMessage(BackEndError.ValidationError, "startDate")); + if (this.endDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "endDate")); + if (this.nominalValue == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue")); + if (TextUtil.isEmpty(nominalCurrency)) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency")); + if (TextUtil.isEmpty(instrumentType)) + errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType")); + if (TextUtil.isEmpty(fullName)) + errors.add(new EnumMessage(BackEndError.ValidationError, "fullName")); + if (TextUtil.isEmpty(securitySymbol)) + errors.add(new EnumMessage(BackEndError.ValidationError, "securitySymbol")); + if (this.lotSize == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize")); + return errors.size() > 0 ? errors : Collections.emptyList(); } @Override diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java index 3928e8198..cc1eb8461 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java @@ -5,12 +5,19 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import io.swagger.annotations.ApiModelProperty; import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; public class MoneyMarketSecurityUpdateAction implements IAction, WithId { @ApiModelProperty(hidden = true) @@ -56,6 +63,26 @@ public class MoneyMarketSecurityUpdateAction implements IAction validate() { + List errors = new ArrayList<>(); + if (this.startDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "startDate")); + if (this.endDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "endDate")); + if (this.nominalValue == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue")); + if (TextUtil.isEmpty(nominalCurrency)) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency")); + if (TextUtil.isEmpty(instrumentType)) + errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType")); + if (TextUtil.isEmpty(fullName)) + errors.add(new EnumMessage(BackEndError.ValidationError, "fullName")); + if (this.lotSize == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize")); + return errors.size() > 0 ? errors : Collections.emptyList(); + } + @ApiModelProperty(hidden = true) @Override public ActionType getActionType() { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java index cebfc2d57..31cfce2c9 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java @@ -43,6 +43,7 @@ public class RequestStatusController { } RequestInfoResponse response = new RequestInfoResponse(); response.setStatus(singleObjectByID.getStatus()); + response.setMessage(singleObjectByID.getMessage()); return response; } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java index a1eaff115..698d281a6 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java @@ -43,6 +43,7 @@ public class RequestInfoAccepter extends QueueConsumer implements InitializingBe return; } requestInfo.setStatus(statusInfo.getStatus()); + requestInfo.setMessage(statusInfo.getMessage()); requestInfoImdg.update(requestInfo); } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java index 87152db3e..d0a6cf9a5 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java @@ -5,8 +5,8 @@ import org.springframework.stereotype.Component; import ru.clearing.platform.dictionary.AbstractDictionary; import ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew; import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.backendapi.service.validation.rules.LauncherNewValidationRule; -import ru.spcex.clearing.backendapi.service.validation.rules.PresentById; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -14,9 +14,11 @@ import ru.spcex.platform.classes.base.interfaces.WithId; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.rule.PresentById; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -35,10 +37,6 @@ public class ActionValidationProvider implements InitializingBean { @Override public void afterPropertiesSet() { - getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); - getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class); - getImdg(IMDGDistributedNames.Map_Relation, SpcexObjectBase.class); - validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); validators.put(Consts.DESTINATION_RELATION_UPDATE, idPresent(IMDGDistributedNames.Map_Relation)); @@ -53,21 +51,35 @@ public class ActionValidationProvider implements InitializingBean { return null; } + + + private > Function defaultConstructor(Class clazz, Imdg... imdgs) { + return iAcc -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(iAcc); + Arrays.stream(imdgs).forEach(imdg -> ctx.addImdg(imdg.getMapName(), imdg)); + return new ValidatorImpl<>(ctx); + }; + } + private & WithId> Function idPresent(String mapName) { + Imdg targetMap = getImdg(mapName, SpcexObjectBase.class); return iAction -> { ImdgValidationContext ctx = new ImdgValidationContext<>(); ctx.setValidatedObject(iAction); + ctx.addImdg(mapName, targetMap); ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); - iValidator.addRule(new PresentById(getImdg(mapName, SpcexObjectBase.class))); + iValidator.addRule(new PresentById(mapName, BackEndError.ResourceNotFound)); return iValidator; }; } private Function taskRunnerNew() { + Imdg tskDctnrImdg = getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); return taskRunnerNew -> { ImdgValidationContext ctx = new ImdgValidationContext<>(); ctx.setValidatedObject(taskRunnerNew); - ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class)); + ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, tskDctnrImdg); ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); iValidator.addRule(LauncherNewValidationRule.knownTaskDictionary); return iValidator; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java deleted file mode 100644 index 032767967..000000000 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.spcex.clearing.backendapi.service.validation.rules; -import ru.spcex.clearing.backendapi.errors.BackEndError; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.classes.base.interfaces.WithId; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Optional; - -public class PresentById implements IValidationRule> { - private final Imdg map; - - public PresentById(Imdg map) { - this.map = map; - } - - @Override - public Optional validate(ImdgValidationContext context) { - WithId actionById = context.getValidatedObject(); - if (map.getSingleObjectByID(actionById.getId()) == null) { - return of(BackEndError.ResourceNotFound, actionById.getId()); - } else { - return empty(); - } - } -} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java index 09157e14d..6ef39cec8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java @@ -3,16 +3,12 @@ package ru.spcex.clearing.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; - -import java.util.Arrays; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; @Configuration public class MessageResolverConfig { @Bean public IMessageResolver messageResolver() { - return errorMessage -> { - if (errorMessage == null) return "null"; - return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs())); - }; + return new SimpleMessageResolver(); } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java new file mode 100644 index 000000000..812556ee3 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.securities.component; + +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.platform.enumeration.Market; +import ru.spcex.platform.enumeration.Status; + +import java.math.BigDecimal; + +public class ListingBuilder { + public Listing byNewMms(MoneyMarketSecurity mms, MoneyMarketSecurityNewRequest mmsReq) { + Listing listing = new Listing(); + listing.setCreated(mms.getCreated()); + listing.setSecurityId(mms.getId()); + listing.setLotSize(BigDecimal.valueOf(mmsReq.getLotSize())); + listing.setMarket(Market.mkrs.getKey()); + listing.setSymbolCode(mms.getSecuritySymbol()); + listing.setSymbolName(mms.getFullName()); + listing.setTradingCurrency(mms.getNominalCurrency()); + listing.setWorkflowStatus(Status.Active.getKey()); + return listing; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java new file mode 100644 index 000000000..38d1bdd66 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.securities.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +@Configuration +public class ErrorResolverConfig { + @Bean + public IMessageResolver messageResolver() { + return new SimpleMessageResolver(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java new file mode 100644 index 000000000..5b26bbe62 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.securities.errors; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum SecuritiesError implements IEnumId { + WrongFieldValue(1004L), + InstrumentAlreadyExists(1010L), + InstrumentNotActive(1012L), + InstrumentNotFound(1011L), + ; + private final Long id; + + SecuritiesError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java index 18029734e..37b92222a 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.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.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; @@ -16,29 +17,48 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSe import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.securities.component.ListingBuilder; +import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; import java.math.BigDecimal; import java.time.Instant; +import java.util.Map; +import java.util.Optional; @Service public class MoneyMarketSecurityService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg moneyMarketSecurityMap; + private final Imdg listingImdg; private final ImdgProvider imdgProvider; private final ImdgId idGenerator; + private final ValidationProvider validation; + private final IMessageResolver messageResolver; + private final ListingBuilder listingBuilder = new ListingBuilder(); @Autowired - public MoneyMarketSecurityService(Consumer kafkaQueue, Producer kafkaProducer, - ImdgProvider imdgProvider) { + public MoneyMarketSecurityService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + ValidationProvider validation, + IMessageResolver messageResolver) { super(kafkaQueue, kafkaProducer); + this.validation = validation; this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.imdgProvider = imdgProvider; this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.messageResolver = messageResolver; } @Override @@ -59,23 +79,32 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial @Override public void afterPropertiesSet() { callback(MoneyMarketSecurityNewRequest.class) - .setConsumer(this::newMoneyMarket) + .setFunction(this::newMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put); callback(MoneyMarketSecurityUpdateRequest.class) - .setConsumer(this::updateMoneyMarket) + .setFunction(this::updateMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::deleteMoneyMarket) + .setFunction(this::deleteMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put); imdgProvider.waitAvailable(); init(); } - private void newMoneyMarket(BaseRequest userRequest) { -// Imdg requestInfoImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); -// RequestInfo reqInfo = requestInfoImdg.getSingleObjectByID(userRequest.getId()); + private RequestInfoUpdate newMoneyMarket(BaseRequest userRequest) { ImdgTransaction transaction = imdgProvider.newTransaction(); MoneyMarketSecurityNewRequest req = userRequest.getRequestPayload(); + Optional validationError = validation.mmsNewValidator() + .apply(req) + .tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process MoneyMarketSecurityNewRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } log.debug("MoneyMarketSecurityNewRequest received"); MoneyMarketSecurity mms = new MoneyMarketSecurity(); mms.setId(idGenerator.nextId()); @@ -92,10 +121,11 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial try { transaction.beginTransaction(); Imdg moneyMarketSecurityMap = transaction.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); - Imdg reqInfoMap = transaction.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); //одним скопом выполняем реквест moneyMarketSecurityMap.insert(mms); -// RequestInfo.update(reqInfo, Status.Success, "success"); + Listing listing = listingBuilder.byNewMms(mms, req); + listingMap.insert(listing); //и сохраняем обновленный // reqInfoMap.insert(reqInfo); transaction.commitTransaction(); @@ -105,13 +135,25 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial // requestInfoImdg.insert(reqInfo); } log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), mms.getId()); + return null; // default success } - private void updateMoneyMarket(BaseRequest userRequest) { + private RequestInfoUpdate updateMoneyMarket(BaseRequest userRequest) { MoneyMarketSecurityUpdateRequest req = userRequest.getRequestPayload(); log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId()); - MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId()); - mms.setUpdated(Instant.now()); + IValidator validator = validation.mmsUpdateValidator().apply(req); + Optional validationError = validator.tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process MoneyMarketSecurityUpdateRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); + Instant updateTime = Instant.now(); + mms.setUpdated(updateTime); mms.setStartDate(req.getStartDate()); mms.setEndDate(req.getEndDate()); mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null); @@ -119,12 +161,43 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setInstrumentType(req.getInstrumentType()); mms.setFullName(req.getFullName()); moneyMarketSecurityMap.update(mms); + Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); + if (listing == null) { + log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); + return null; + } + listing.setLotSize(BigDecimal.valueOf(req.getLotSize())); + listing.setUpdated(updateTime); + listingImdg.update(listing); + return null; } - private void deleteMoneyMarket(BaseRequest userRequest) { + private RequestInfoUpdate deleteMoneyMarket(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); - MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId()); - moneyMarketSecurityMap.delete(mms); + IValidator validator = validation.mmsDeleteValidator().apply(req); + Optional validationError = validator.tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process CommonDeleteRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); + mms.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); + Instant.now(); + mms.setUpdated(Instant.now()); + moneyMarketSecurityMap.update(mms); + Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); + if (listing == null) { + log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); + return null; + } + listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); + listing.setUpdated(Instant.now()); + listingImdg.update(listing); + return null; } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java new file mode 100644 index 000000000..1f6ca6675 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java @@ -0,0 +1,66 @@ +package ru.spcex.clearing.securities.validation; + +import org.springframework.stereotype.Component; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.clearing.securities.validation.rule.EndDtAfterStartDt; +import ru.spcex.clearing.securities.validation.rule.MmsNewValidationRule; +import ru.spcex.clearing.securities.validation.rule.MmsUpdateValidationRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.rule.PresentById; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.function.Function; + +@Component +public class ValidationProvider { + private final Imdg mmsMap; + + + public ValidationProvider(ImdgProvider imdgProvider) { + this.mmsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class); + } + + public Function mmsNewValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + EndDtAfterStartDt.instance(MoneyMarketSecurityNewRequest.class), + MmsNewValidationRule.SecuritySymbolUniq + ); + }; + } + + public Function mmsUpdateValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + EndDtAfterStartDt.instance(MoneyMarketSecurityUpdateRequest.class), + new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true), + MmsUpdateValidationRule.StatusIsActive + ); + }; + } + + public Function mmsDeleteValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true) + ); + }; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java new file mode 100644 index 000000000..c565f5f83 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class EndDtAfterStartDt implements IValidationRule> { + + public EndDtAfterStartDt() {} + + public static EndDtAfterStartDt instance(Class clazz) { + return new EndDtAfterStartDt<>(); + } + + @Override + public Optional validate(ImdgValidationContext context) { + T validatedObject = context.getValidatedObject(); + if (validatedObject.getEndDate().isBefore(validatedObject.getStartDate())) { + return of(SecuritiesError.WrongFieldValue, "endDate"); + } + return empty(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java new file mode 100644 index 000000000..550491385 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Map; +import java.util.Optional; + +public enum MmsNewValidationRule implements IValidationRule> { + SecuritySymbolUniq() { + @Override + public Optional validate(ImdgValidationContext context) { + MoneyMarketSecurityNewRequest action = context.getValidatedObject(); + Imdg mmsImdg = context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + MoneyMarketSecurity mms = mmsImdg.getSingleObjectByFieldValues(Map.of( + "securitySymbol", action.getSecuritySymbol(), + "workflowStatus", Status.Active.getKey())); + if (mms != null) { + return of(SecuritiesError.InstrumentAlreadyExists); + } else { + return empty(); + } + } + }; + + @Override + public String ruleName() { + return "MmsNewValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java new file mode 100644 index 000000000..2bf92e6c4 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public enum MmsUpdateValidationRule implements IValidationRule> { + StatusIsActive() { + @Override + public Optional validate(ImdgValidationContext context) { + MoneyMarketSecurity mms = context.getStoredObject(Stored.PresentById); + //проверка только если PresentById найдет объект и сохранит его + if (mms != null && !Status.Active.getKey().equals(mms.getWorkflowStatus())) { + return of(SecuritiesError.InstrumentNotActive); + } else { + return empty(); + } + } + }; + + @Override + public String ruleName() { + return "MmsNewValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java index e35e6b816..971c65732 100644 --- a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java @@ -29,7 +29,9 @@ import ru.spcex.clearing.securities.config.HazelcastInstanceTestConfiguration; import ru.spcex.clearing.securities.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService; import ru.spcex.clearing.securities.utils.MatcherFactory; +import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import java.math.BigDecimal; import java.time.LocalDate; @@ -84,7 +86,8 @@ public class MoneyMarketSecurityServiceDisabled { private void startService() throws InterruptedException { MoneyMarketSecurityService keyRateService = - new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService); + new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService, + new ValidationProvider(hazelcastService), new SimpleMessageResolver()); keyRateService.afterPropertiesSet(); } diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java new file mode 100644 index 000000000..411e55415 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +import java.time.LocalDate; + +public interface WithEndDt { + LocalDate getEndDate(); +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java new file mode 100644 index 000000000..d9a9cbe82 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java @@ -0,0 +1,5 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface WithSecuritySymbol { + String getSecuritySymbol(); +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java new file mode 100644 index 000000000..990e36b68 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +import java.time.LocalDate; + +public interface WithStartDt { + LocalDate getStartDate(); +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java new file mode 100644 index 000000000..79d820bb0 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Market implements IEnumKey { + mkrs("MKRS"); + + private final String key; + + Market(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index b1e431044..ac3b60fa3 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -164,6 +164,7 @@ public class ImdgHazelcast implements Imdg { this.hzInstance = hzInstance; } + @Override public String getMapName() { return mapName; } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java index ca765d5b5..2784cc2dd 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java @@ -6,6 +6,10 @@ import java.util.Collection; import java.util.Map; public interface Imdg { + default String getMapName() { + throw new UnsupportedOperationException("not implemented name"); + } + default void insert(T paramT) { throw new UnsupportedOperationException("not implemented insert"); } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java index 3d853cff4..2e7242a0f 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java @@ -29,6 +29,9 @@ public class ImdgValidationContext implements IValidatorContext { return validatedObject; } + /** + * !!!не использовать один Enum в разных местах + */ public void storeObject(Enum storedObject, Object anyObject) { storedObjects.put(storedObject, anyObject); } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java new file mode 100644 index 000000000..c9f6ff542 --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java @@ -0,0 +1,11 @@ +package ru.spcex.platform.imdg.validation; + +/** + * !!!не использовать один Enum в разных местах - по энуму на один класс IValidationRule. + */ +public enum Stored { + /** + * если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById) + */ + PresentById +} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java new file mode 100644 index 000000000..a69cab7b9 --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java @@ -0,0 +1,43 @@ +package ru.spcex.platform.imdg.validation.rule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumId; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class PresentById implements IValidationRule> { + private final String mapName; + private final IEnumId errorEnum; + private boolean storeEnabled = false; + + public PresentById(String mapName, IEnumId errorEnum) { + this.mapName = mapName; + this.errorEnum = errorEnum; + } + public PresentById(String mapName, IEnumId errorEnum, Boolean storeEnabled) { + this.mapName = mapName; + this.errorEnum = errorEnum; + this.storeEnabled = storeEnabled; + } + + + @Override + public Optional validate(ImdgValidationContext context) { + WithId actionById = context.getValidatedObject(); + Imdg targetMap = context.obtainMap(mapName, SpcexObjectBase.class); + SpcexObjectBase obj = targetMap.getSingleObjectByID(actionById.getId()); + if (obj == null) { + return of(errorEnum, actionById.getId()); + } else { + if (storeEnabled) { + context.storeObject(Stored.PresentById, obj); + } + return empty(); + } + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java index 979f8b28e..0527de865 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java @@ -5,10 +5,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; import java.time.LocalDate; -public class MoneyMarketSecurityNewRequest { +public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { @JsonProperty @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java index 220e52c8a..6af0bbbd6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java @@ -6,10 +6,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; import java.time.LocalDate; -public class MoneyMarketSecurityUpdateRequest { +public class MoneyMarketSecurityUpdateRequest implements WithStartDt, WithEndDt { @JsonProperty public Long id; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java index d83b8e9c1..24e8a1562 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java @@ -3,20 +3,40 @@ package ru.spcex.clearing.platform.messaging.service; public class RequestInfoUpdate { private Long id; private Status status; + private String message; + + public RequestInfoUpdate() {} + + public RequestInfoUpdate(Long id, Status status, Long errorId, String message) { + this.id = id; + this.status = status; + this.message = message; + } public Long getId() { return id; } - public void setId(Long id) { + public RequestInfoUpdate setId(Long id) { this.id = id; + return this; } public Status getStatus() { return status; } - public void setStatus(Status status) { + public RequestInfoUpdate setStatus(Status status) { this.status = status; + return this; + } + + public String getMessage() { + return message; + } + + public RequestInfoUpdate setMessage(String message) { + this.message = message; + return this; } } diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java new file mode 100644 index 000000000..38d9a81fc --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java @@ -0,0 +1,11 @@ +package ru.spcex.platform.utils.enumeration; + +import java.util.Arrays; + +public class SimpleMessageResolver implements IMessageResolver { + @Override + public String resolve(EnumMessage errorMessage) { + if (errorMessage == null) return "null"; + return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs())); + } +} From b4c3388e06c5bea5bd51895541c988c883e00e87 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 12:09:52 +0300 Subject: [PATCH 2/9] dbf-importer log fix --- .../dbf/importer/services/DBFImporterService.java | 10 +++++++--- .../dbf-importer/src/main/resources/logback.xml | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java index a2f4e64b6..358604067 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/services/DBFImporterService.java @@ -42,18 +42,22 @@ public class DBFImporterService { } public void run(ETable specificTable) { - log.info("adding import task {}", specificTable != null ? specificTable.name() : ""); + if (specificTable == null) { + log.trace("adding import task"); + } else { + log.info("adding import task {}", specificTable); + } executorService.execute(() -> { Map> newFiles = null; try { - log.info("checking new files... {}", specificTable != null ? specificTable.name() : ""); + log.trace("checking new files... {}", specificTable != null ? specificTable.name() : ""); newFiles = getFiles(specificTable); if (newFiles.size() > 0 && log.isDebugEnabled()) { log.debug("following files will be processed {}", forLogging(newFiles)); } else if (newFiles.size() > 0) { log.info("following files will be processed {}", forLoggingSizeOnly(newFiles)); } else { - log.info("no files were found"); + log.trace("no files were found"); } for (Map.Entry> newFilesEntry : newFiles.entrySet()) { ETable currTable = newFilesEntry.getKey(); diff --git a/clearing-parent/dbf-importer/src/main/resources/logback.xml b/clearing-parent/dbf-importer/src/main/resources/logback.xml index 0d5d9d875..fa546aee5 100644 --- a/clearing-parent/dbf-importer/src/main/resources/logback.xml +++ b/clearing-parent/dbf-importer/src/main/resources/logback.xml @@ -3,7 +3,7 @@ UTF-8 - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n From dd117b09b17519a9510ad57c0e5d8820fab859da Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 12:33:38 +0300 Subject: [PATCH 3/9] balance-service fix --- .../spcex/clearing/balance/config/SdfExecutorsConfig.java | 8 +++++++- .../importer/logic/stages/DbfImportKafkaMessenger.java | 8 +++++--- .../main/java/ru/spcex/platform/enumeration/SdfTable.java | 4 ++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java index b36d68aa9..9cf397465 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/SdfExecutorsConfig.java @@ -4,6 +4,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.clearing.balance.service.AbstractExecutor; import ru.spcex.clearing.balance.service.Sdf01Executor; +import ru.spcex.clearing.balance.service.Sdf09Executor; +import ru.spcex.clearing.balance.service.Sdf16Executor; import ru.spcex.platform.classes.base.interfaces.WithAccount; import ru.spcex.platform.enumeration.SdfTable; @@ -14,9 +16,13 @@ import java.util.Map; public class SdfExecutorsConfig { @Bean("sdfExecutors") - public Map> executorsMap(Sdf01Executor sdf01Executor) { + public Map> executorsMap(Sdf01Executor sdf01Executor, + Sdf09Executor sdf09Executor, + Sdf16Executor sdf16Executor) { Map> executors = new HashMap<>(); executors.put(SdfTable.SDF_01, sdf01Executor); + executors.put(SdfTable.SDF_09, sdf09Executor); + executors.put(SdfTable.SDF_16, sdf16Executor); return executors; } } diff --git a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/DbfImportKafkaMessenger.java b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/DbfImportKafkaMessenger.java index 2706c2476..fffcfcab0 100644 --- a/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/DbfImportKafkaMessenger.java +++ b/clearing-parent/dbf-importer/src/main/java/ru/spcex/clearing/dbf/importer/logic/stages/DbfImportKafkaMessenger.java @@ -26,7 +26,9 @@ public class DbfImportKafkaMessenger implements InitializingBean { @Override public void afterPropertiesSet() { - messengers.put(ETable.DF_01, this::messageDf01); + messengers.put(ETable.DF_01, groupId -> messageBalance(groupId, SdfTable.SDF_01)); + messengers.put(ETable.DF_09, groupId -> messageBalance(groupId, SdfTable.SDF_09)); + messengers.put(ETable.DF_16, groupId -> messageBalance(groupId, SdfTable.SDF_16)); messengers.put(ETable.DF_04, this::messageDf04); } @@ -41,10 +43,10 @@ public class DbfImportKafkaMessenger implements InitializingBean { } } - private void messageDf01(Long groupId) { + private void messageBalance(Long groupId, SdfTable table) { StatementRequest statementRequest = new StatementRequest(); statementRequest.setGroupId(groupId); - statementRequest.setTable(SdfTable.SDF_01); + statementRequest.setTable(table); kafka.get().sendRequestToQueue(Consts.STATEMENT_PROCESS, statementRequest); } diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java index 8cb3a01d2..988f55a0c 100644 --- a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/SdfTable.java @@ -3,13 +3,13 @@ package ru.spcex.platform.enumeration; import ru.spcex.platform.utils.enumeration.IEnumKey; public enum SdfTable implements IEnumKey { - SDF_01("SDF_01"); + SDF_01("SDF_01"), SDF_09("SDF_09"), SDF_16("SDF_16"); SdfTable(String key) { this.key = key; } - private String key; + private final String key; @Override public String getKey() { From dfbc350ed23eb031dbd266df47acc507cf65f7e7 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 12:41:01 +0300 Subject: [PATCH 4/9] scheduler-service build fix --- pom.xml | 1 + z-distr/pom.xml | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/pom.xml b/pom.xml index 3f2009995..3474338bf 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ ${folder_root_clearing}/clearing-parent/company-service ${folder_root_clearing}/clearing-parent/reports-service ${folder_root_clearing}/clearing-parent/utility-service + ${folder_root_clearing}/clearing-parent/scheduler-service 3.12.4 1.7.33 diff --git a/z-distr/pom.xml b/z-distr/pom.xml index 92a874b5a..0a1d961e8 100644 --- a/z-distr/pom.xml +++ b/z-distr/pom.xml @@ -248,6 +248,25 @@ + + copy-scheduler-service-bin + prepare-package + + copy + + + + + ${folder_root_scheduler-service}/target/scheduler-service.jar + ${folder.clearing.distr.modules}/scheduler-service/scheduler-service.jar + + + ${folder_root_scheduler-service}/src/main/resources/application.properties + ${folder.clearing.distr.modules}/scheduler-service/application.properties + + + + copy-reports-service-bin prepare-package From b6c25744d2e90fb0317456c82f2f0b09ae26df1c Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 13:03:07 +0300 Subject: [PATCH 5/9] scheduler-service logs fix --- .../scheduler-service/src/main/resources/logback.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clearing-parent/scheduler-service/src/main/resources/logback.xml b/clearing-parent/scheduler-service/src/main/resources/logback.xml index a7a54b222..57cf31d6a 100644 --- a/clearing-parent/scheduler-service/src/main/resources/logback.xml +++ b/clearing-parent/scheduler-service/src/main/resources/logback.xml @@ -8,7 +8,7 @@ - ./logs/utility-service.log + ./logs/scheduler-service.log %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n @@ -16,7 +16,7 @@ - ./logs/utility-service.%i.log + ./logs/scheduler-service.%i.log 1 10 From 292675e92b6d608f793ae7d123c24e2df9a1908d Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 15:45:15 +0300 Subject: [PATCH 6/9] backend-api LocalTime meta parsing fix --- .../ru/spcex/clearing/backendapi/meta/GetResponseFactory.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java index 11299df70..86f3cb2c1 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.time.Instant; +import java.time.LocalTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; @@ -17,6 +18,7 @@ import java.util.stream.Collectors; public class GetResponseFactory { private final Logger log = LoggerFactory.getLogger(getClass()); private final MetaServer meta; + private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss"); @Autowired public GetResponseFactory(MetaServer meta) { @@ -71,6 +73,8 @@ public class GetResponseFactory { data = sdf.format(value); } else if (value instanceof Instant) { data = dateTimeFormatter.format((Instant) value); + } else if (value instanceof LocalTime) { + data = timeFormatter.format((LocalTime) value); } else { data = value; } From bbc10ca13b9f1eab3994bd5f4e74f28ce0733805 Mon Sep 17 00:00:00 2001 From: ialbert Date: Wed, 21 Dec 2022 16:46:19 +0300 Subject: [PATCH 7/9] balance-service fix --- .../clearing/balance/config/ValidationConfig.java | 1 + .../balance/service/StatementService.java | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java index 161f536ca..baf8ebc54 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/config/ValidationConfig.java @@ -71,6 +71,7 @@ public class ValidationConfig { Consumer addImdg = (s) -> context.addImdg(s, getImdg(s)); addImdg.accept(IMDGDistributedNames.Map_Account); addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); return new ValidatorImpl<>(context, Sdf16ValidationRule.CompanyPresent, ExistClrnAccountValidationRule.AccountPresent, diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java index f74047b3f..1cc0e0575 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/StatementService.java @@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.sdf.SDf01; +import ru.clearing.classes.statics.data.sdf.SDf09; +import ru.clearing.classes.statics.data.sdf.SDf16; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -23,6 +25,7 @@ import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import java.util.Collection; +import java.util.EnumMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -33,7 +36,7 @@ public class StatementService extends QueueConsumer implements InitializingBean private final ImdgProvider imdgProvider; private final KafkaSender kafkaReqProducer; - private final Imdg sdf01Imdg; + private final Map> sdfImdgs; private final Map> executorsMap; @Autowired @@ -43,9 +46,12 @@ public class StatementService extends QueueConsumer implements InitializingBean @Qualifier("sdfExecutors") Map> executorsMap) { super(kafkaQueue); this.imdgProvider = imdgProvider; - this.sdf01Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class); + this.sdfImdgs = new EnumMap<>(SdfTable.class); this.kafkaReqProducer = kafkaReqProducer; this.executorsMap = executorsMap; + this.sdfImdgs.put(SdfTable.SDF_01, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class)); + this.sdfImdgs.put(SdfTable.SDF_09, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf09, SDf09.class)); + this.sdfImdgs.put(SdfTable.SDF_16, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf16, SDf16.class)); } @Override @@ -61,13 +67,14 @@ public class StatementService extends QueueConsumer implements InitializingBean Collection sdfGroup; SdfTable table = statementRequest.getTable(); //map = getMapByTable(table) + Imdg sdfImdg = sdfImdgs.get(table); if (statementRequest.getAccountCreationResults().size() == 0) { - sdfGroup = sdf01Imdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId())); + sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId())); } else { sdfGroup = statementRequest.getAccountCreationResults() .stream() .filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02 - .map(part -> sdf01Imdg.getSingleObjectByID(part.getSdfId())) + .map(part -> sdfImdg.getSingleObjectByID(part.getSdfId())) .collect(Collectors.toList()); } // sdf01Group = sdf01Group From 148bd3a95a61388183939bc0fe35598ed490f996 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 22 Dec 2022 12:55:51 +0300 Subject: [PATCH 8/9] dbf-exporter Sdf17 fix --- .../spcex/clearing/balance/service/Sdf16Executor.java | 11 +++++------ .../ru/clearing/classes/statics/data/sdf/SDf17.java | 6 +++--- .../services/converters/S_DF17_Converter.java | 2 +- .../ru/spcex/clearing/imdg/object/SDf17MapStore.java | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java index a91db0fb6..62bb4b64d 100644 --- a/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java +++ b/clearing-parent/balance-service/src/main/java/ru/spcex/clearing/balance/service/Sdf16Executor.java @@ -24,7 +24,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; import ru.spcex.platform.utils.validation.IValidator; -import java.math.BigDecimal; import java.time.Instant; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -201,15 +200,15 @@ public class Sdf16Executor extends AbstractExecutor { successSdf.setGenerationId(generationIdForGroup); successSdf.setGenerationTime(Instant.now()); successSdf.setInSDf16Id(sdf.getId()); - successSdf.setResult(BigDecimal.ZERO); + successSdf.setResult(0); return successSdf; } - private BigDecimal obtainResultNum(EnumMessage error){ + private Integer obtainResultNum(EnumMessage error){ if (BalanceError.AccountNotPresent.equalsById(error.getSubject().getId())) - return BigDecimal.ONE; + return 1; if (BalanceError.BalanceNotEnough.equalsById(error.getSubject().getId())) - return BigDecimal.ONE; - return BigDecimal.valueOf(9); + return 1; + return 9; } } diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java index cc19fb3f5..fd3ee5f18 100644 --- a/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/statics/data/sdf/SDf17.java @@ -23,7 +23,7 @@ public class SDf17 extends SpcexObjectBase implements WithAccount { private BigDecimal BIC; private String SPEC; private BigDecimal number; - private BigDecimal result; + private Integer result; private Instant generationTime; private Long generationId; private Long inSDf16Id; @@ -93,11 +93,11 @@ public class SDf17 extends SpcexObjectBase implements WithAccount { this.number = value; } - public BigDecimal getResult() { + public Integer getResult() { return result; } - public void setResult(BigDecimal value) { + public void setResult(Integer value) { this.result = value; } diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java index 206f8d84a..efbb3e5af 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java @@ -36,7 +36,7 @@ public class S_DF17_Converter extends DFConverter { dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("RESULT", DBFDataType.CHARACTER, 3)); + dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 1)); return dbfFields.toArray(DBFField[]::new); } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java index ad1f57bea..8f3b60e9a 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/SDf17MapStore.java @@ -47,7 +47,7 @@ public class SDf17MapStore extends TemplateMapStore { object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class)); object.setSPEC(resultSet.getObject("_S_P_E_C", String.class)); object.setNumber(resultSet.getObject("NUMBER", BigDecimal.class)); - object.setResult(resultSet.getObject("RESULT", BigDecimal.class)); + object.setResult(resultSet.getObject("RESULT", Integer.class)); object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME")); object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class)); object.setInSDf16Id(resultSet.getObject("IN_S_DF16_ID", Long.class)); From 5b89f57456474f6018d6311d420fcd803f898447 Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 22 Dec 2022 12:57:04 +0300 Subject: [PATCH 9/9] dbf-exporter Sdf17 fix --- .../dbf/exporter/services/converters/S_DF17_Converter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java index efbb3e5af..5a43a2255 100644 --- a/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java +++ b/clearing-parent/dbf-exporter/src/main/java/ru/spcex/clearing/dbf/exporter/services/converters/S_DF17_Converter.java @@ -34,7 +34,7 @@ public class S_DF17_Converter extends DFConverter { dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1)); dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18)); - dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.NUMERIC, 32, 18)); + dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 254)); dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18)); dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 1)); return dbfFields.toArray(DBFField[]::new);