From 404ca8dcd815b00b72da3d246fbb92c82f1e9d84 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 16 Mar 2026 18:04:05 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-927 --- .../validation/AccountValidationConfig.java | 2 +- .../common/rules/DictionaryPresentRule.java | 14 ++++++------ ...learingMemberCategoryValidationConfig.java | 4 ++-- .../validation/RelationValidationConfig.java | 3 ++- .../ProviderMemberCategoryValidationRule.java | 5 ++++- .../ClearingMemberCategoryService.java | 3 ++- .../company/service/RelationService.java | 22 +++++++++---------- .../validation/ValidationProvider.java | 5 +++-- 8 files changed, 32 insertions(+), 26 deletions(-) diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java index 2598d0054..1ae0d235b 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/AccountValidationConfig.java @@ -100,7 +100,7 @@ public class AccountValidationConfig { AccountError.DictionaryNotFound, accountType -> { if (IEnumKey.contains(accountType.getCode(), AccountType.Corr, AccountType.Info)) return null; - return AccountError.WrongFieldValue; + return new EnumMessage(AccountError.WrongFieldValue, "accountType"); }).withMessageDecorator((causeEmpty, errorCode, fieldName, fieldValue) -> { if (errorCode == AccountError.WrongFieldValue) return DictionaryPresentRule.FIELD_NOT_FOUND_DECORATOR_1.decorator(causeEmpty, errorCode, fieldName, fieldValue); diff --git a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java index e67250089..36f75f0c9 100644 --- a/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java +++ b/clearing-parent/clearing-validation/src/main/java/ru/spcex/clearing/validation/common/rules/DictionaryPresentRule.java @@ -32,10 +32,10 @@ public class DictionaryPresentRule implements I public final IErrorEnumId errorEmptyRequiredValue; public final IErrorEnumId errorWrongDictionaryValue; public final boolean required; - public final Function[] additionalChecks; + public final Function[] additionalChecks; protected IMessageDecorator decorator; - public DictionaryPresentRule(String fieldName, Function getter, String dictionaryName, Class dictionaryClass, IErrorEnumId errorEmptyRequiredValue, IErrorEnumId errorWrongDictionaryValue, boolean required, Function[] additionalChecks) { + public DictionaryPresentRule(String fieldName, Function getter, String dictionaryName, Class dictionaryClass, IErrorEnumId errorEmptyRequiredValue, IErrorEnumId errorWrongDictionaryValue, boolean required, Function[] additionalChecks) { this.fieldName = fieldName; this.getter = getter; this.dictionaryName = dictionaryName; @@ -67,7 +67,7 @@ public class DictionaryPresentRule implements I IErrorEnumId errorEmptyRequiredValue, IErrorEnumId errorWrongDictionaryValue, boolean required, - Function... additionalChecks) { + Function... additionalChecks) { Objects.requireNonNull(errorWrongDictionaryValue, "errorWrongDictionaryValue"); if (required) Objects.requireNonNull(errorEmptyRequiredValue, "errorEmptyRequiredValue"); @@ -99,7 +99,7 @@ public class DictionaryPresentRule implements I Class dictionaryClass, IErrorEnumId errorEmptyRequiredValue, IErrorEnumId errorWrongDictionaryValue, - Function... additionalChecks) { + Function... additionalChecks) { Objects.requireNonNull(errorWrongDictionaryValue, "errorWrongDictionaryValue"); Objects.requireNonNull(errorEmptyRequiredValue, "errorEmptyRequiredValue"); return new DictionaryPresentRule<>(fieldName, @@ -131,10 +131,10 @@ public class DictionaryPresentRule implements I if (dictionaryFromMap == null) { // never return decorator.of(false, errorWrongDictionaryValue, dictionaryClass.getSimpleName(), enumCode); } - for (Function additionalCheck : additionalChecks) { - IErrorEnumId validationError = additionalCheck.apply(dictionaryFromMap); + for (Function additionalCheck : additionalChecks) { + EnumMessage validationError = additionalCheck.apply(dictionaryFromMap); if (validationError != null) - return of(validationError, fieldName); + return Optional.of(validationError); } return empty(); } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java index a691aa2eb..a33b0e71b 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/ClearingMemberCategoryValidationConfig.java @@ -58,7 +58,7 @@ public class ClearingMemberCategoryValidationConfig { CompanyErrors.DictionaryNotFound, category -> { ClearingCategory enumVal = IEnumKey.getEnumByKey(ClearingCategory.class, category.getCode()); - return IEnumKey.contains(enumVal, T, K) ? CompanyErrors.CategoryIsNotSupported : null; + return IEnumKey.contains(enumVal, T, K) ? new EnumMessage(CompanyErrors.CategoryIsNotSupported, category.getCode()) : null; }), ProviderMemberCategoryValidationRule.NEW ); @@ -101,7 +101,7 @@ public class ClearingMemberCategoryValidationConfig { false, category -> { ClearingCategory enumVal = IEnumKey.getEnumByKey(ClearingCategory.class, category.getCode()); - return IEnumKey.contains(enumVal, T, K) ? CompanyErrors.CategoryIsNotSupported : null; + return IEnumKey.contains(enumVal, T, K) ? new EnumMessage(CompanyErrors.CategoryIsNotSupported, category.getCode()) : null; }), ProviderMemberCategoryValidationRule.UPDATE ); diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/RelationValidationConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/RelationValidationConfig.java index 10947c988..6b3dc83e1 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/RelationValidationConfig.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/RelationValidationConfig.java @@ -19,6 +19,7 @@ import static ru.spcex.platform.enumeration.ClearingCategory.K; import static ru.spcex.platform.enumeration.ClearingCategory.T; 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.enumeration.IEnumKey; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -58,7 +59,7 @@ public class RelationValidationConfig { false, category -> { ClearingCategory enumVal = IEnumKey.getEnumByKey(ClearingCategory.class, category.getCode()); - return IEnumKey.contains(enumVal, T, K) ? CompanyErrors.CategoryIsNotSupported : null; + return IEnumKey.contains(enumVal, T, K) ? new EnumMessage(CompanyErrors.CategoryIsNotSupported, category.getCode()) : null; }), DictionaryPresentRule.instance("serviceStatus", RelationNewRequest::getServiceStatus, diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/rules/ProviderMemberCategoryValidationRule.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/rules/ProviderMemberCategoryValidationRule.java index d082ae231..276c4c12a 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/rules/ProviderMemberCategoryValidationRule.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/validation/rules/ProviderMemberCategoryValidationRule.java @@ -73,7 +73,10 @@ public enum ProviderMemberCategoryValidationRule implements IValidationRule categories = categoryImdg.getCollectionIdsByPredicate(predicateBuilder.and( - predicateBuilder.equals("companyId", clearingMemberCategory.getCompanyId()) + predicateBuilder.equals("companyId", clearingMemberCategory.getCompanyId()), + predicateBuilder.not( + predicateBuilder.equals("id", clearingMemberCategory.getId()) + ) )); if (!categories.isEmpty()) { return Optional.of(new EnumMessage( diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java index 85d105096..64e48a381 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ClearingMemberCategoryService.java @@ -144,6 +144,7 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init //todo сложный кейс с возможным изменением релейшена или пересозданием. Скоро ТЗ доделают. //companyService.relationService.updateExistRelation(transaction,clearingMemberCategory.getCompanyId(), oldClearingMemberCategory, // clearingMemberCategory.getClearingMemberCategory()); + companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), oldClearingMemberCategory, clearingMemberCategory.getId()); companyService.relationService.createNewRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); Imdg txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); txClearingMemberCategoryMap.insert(clearingMemberCategory); @@ -182,7 +183,7 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init if (clearingMemberCategory.getCompanyId() == null) { // never, только тестовые данные log.warn("Deleted clearingMemberCategory[{}] has not companyId", clearingMemberCategory.getId()); } else { - companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); + companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory.getClearingMemberCategory(), clearingMemberCategory.getId()); } txOk = true; } finally { diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/RelationService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/RelationService.java index 0445220d0..1a1481366 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/RelationService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/RelationService.java @@ -598,8 +598,8 @@ public class RelationService extends QueueConsumer implements InitializingBean { /** * Приходит от ClearingMemberCategory */ - protected void cancelRelation(ImdgTransaction transaction, Long companyId, ClearingMemberCategory clearingMemberCategory) { - log.debug("Cancelling relations for companyId={} and clearingMemberCategory {}", companyId, clearingMemberCategory == null ? null : clearingMemberCategory.getClearingMemberCategory()); + protected void cancelRelation(ImdgTransaction transaction, Long companyId, String clearingMemberCategory, Long categoryId) { + log.debug("Cancelling relations for companyId={} and clearingMemberCategory {}", companyId, clearingMemberCategory == null ? null : clearingMemberCategory); Objects.requireNonNull(companyId, "companyId"); Imdg relationMap = transaction.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); // String serviceStatus = null; @@ -610,33 +610,33 @@ public class RelationService extends QueueConsumer implements InitializingBean { // serviceStatus = serviceForCMC(clearingCategory).getKey(); // } - Collection companyCMC = selectCompanyClearingMemberCategory(null, companyId, clearingMemberCategory.getId()); - if (companyCMC.contains(clearingMemberCategory.getClearingMemberCategory())) { + Collection companyCMC = selectCompanyClearingMemberCategory(null, companyId, categoryId); + if (companyCMC.contains(clearingMemberCategory)) { // never - log.warn("ClearingMemberCategory \"{}\" already exist in set for company {}.", clearingMemberCategory.getClearingMemberCategory(), companyId); + log.warn("ClearingMemberCategory \"{}\" already exist in set for company {}.", clearingMemberCategory, companyId); } boolean companyCMCisBIV = companyCMC.contains(ClearingCategory.B.getKey()) || companyCMC.contains(ClearingCategory.I.getKey()) - || companyCMC.contains(ClearingCategory.V.getKey()); + || companyCMC.contains(ClearingCategory.V.getKey()) || companyCMC.contains(ClearingCategory.P.getKey()); boolean companyCMCisCF = companyCMC.contains(ClearingCategory.C.getKey()) || companyCMC.contains(ClearingCategory.F.getKey()); - Relation relation = searchRelation(transaction, clearingMemberCategory.getClearingMemberCategory(), companyId); + Relation relation = searchRelation(transaction, clearingMemberCategory, companyId); if (relation == null) { - log.debug("Relation for clearingMemberCategory.id={} {} not found", clearingMemberCategory.getId(), clearingMemberCategory.getClearingMemberCategory()); + log.debug("Relation for clearingMemberCategory.id={} {} not found", categoryId, clearingMemberCategory); } else { if (companyCMCisBIV && MKR.equalsByKey(relation.getService())) { // relation не изменяем - log.debug("Relation {} {} lost for ClearingMemberCategory \"{}\".", relation.getId(), relation.getService(), clearingMemberCategory.getClearingMemberCategory()); + log.debug("Relation {} {} lost for ClearingMemberCategory \"{}\".", relation.getId(), relation.getService(), clearingMemberCategory); } else if (companyCMCisCF && FOND.equalsByKey(relation.getService())) { // relation не изменяем - log.debug("Relation {} {} lost for ClearingMemberCategory \"{}\".", relation.getId(), relation.getService(), clearingMemberCategory.getClearingMemberCategory()); + log.debug("Relation {} {} lost for ClearingMemberCategory \"{}\".", relation.getId(), relation.getService(), clearingMemberCategory); } else { // удалить. log.debug("Block exist relation.id={}", relation.getId()); relation.setUpdated(Instant.now()); relation.setServiceStatus(Closed.getKey()); relationMap.update(relation); - log.debug("Relation[{}] updated (closed) by clearingMemberCategory[{}].", relation.getId(), clearingMemberCategory.getId()); + log.debug("Relation[{}] updated (closed) by clearingMemberCategory[{}].", relation.getId(), categoryId); } } } 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 index 7e745f3b7..0f25feb57 100644 --- 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 @@ -62,6 +62,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.imdg.validation.rule.PresentById; +import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; import ru.spcex.platform.utils.validation.ValidatorImpl; @@ -539,7 +540,7 @@ public class ValidationProvider { InstrumentTypeDictionary.class, SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound, - instrument -> !InstrumentType.DGCT.getKey().equalsIgnoreCase(instrument.getCode()) ? SecuritiesError.WrongFieldValue : null + instrument -> !InstrumentType.DGCT.getKey().equalsIgnoreCase(instrument.getCode()) ? new EnumMessage(SecuritiesError.WrongFieldValue, "instrumentType") : null ), DictionaryPresentRule.instance( "workflowStatus", @@ -597,7 +598,7 @@ public class ValidationProvider { InstrumentTypeDictionary.class, SecuritiesError.RequiredFieldIsEmpty, SecuritiesError.DictionaryNotFound, - instrument -> !InstrumentType.DGCT.getKey().equalsIgnoreCase(instrument.getCode()) ? SecuritiesError.WrongFieldValue : null + instrument -> !InstrumentType.DGCT.getKey().equalsIgnoreCase(instrument.getCode()) ? new EnumMessage(SecuritiesError.WrongFieldValue, "instrumentType") : null ), DictionaryPresentRule.instance( "workflowStatus",