From 20ffcb6c8cc855e68e19393d5076818ed334244d Mon Sep 17 00:00:00 2001 From: aalehin Date: Thu, 25 May 2023 13:50:41 +0300 Subject: [PATCH] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-259=20---?= =?UTF-8?q?=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D0=BA=D1=82=D0=B0=D1=85=20=D0=9F=D0=BE=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=20=D1=80=D0=B5=D0=BA=D0=B2?= =?UTF-8?q?=D0=B8=D0=B7=D0=B8=D1=82=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cud/company/CompanySymbolNewAction.java | 8 +- .../request/cud/company/ListingNewAction.java | 1 - .../CompanySymbolValidationConfig.java | 52 +++++++++--- .../company/service/CompanyService.java | 32 ++++---- .../company/service/CompanySymbolService.java | 79 +++++++++++++++---- ...ySymbolOfSymbolNewRequestNotExistRule.java | 13 +-- .../cud/company/CompanySymbolNewRequest.java | 37 +++++++++ 7 files changed, 166 insertions(+), 56 deletions(-) create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java index 0ed4dcd1a..2ec0b8681 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/company/CompanySymbolNewAction.java @@ -4,9 +4,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModelProperty; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; -public class CompanySymbolNewAction implements IAction { +public class CompanySymbolNewAction implements IAction { @ApiModelProperty(value = "Идентификатор Компании", example = "1234") @JsonProperty private Long companyId; @@ -18,8 +18,8 @@ public class CompanySymbolNewAction implements IAction companySymbolNewRequestValidator(Map> imdgForValidation) { - return companySymbolUpdateRequest -> { - ImdgValidationContext context = new ImdgValidationContext<>(); - context.setValidatedObject(companySymbolUpdateRequest); + public Function companySymbolNewRequestValidator(Map> imdgForValidation) { + return companySymbolNewRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(companySymbolNewRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); addImdg.accept(IMDGDistributedNames.Map_CompanySymbolDictionary); addImdg.accept(IMDGDistributedNames.Map_Company); return new ValidatorImpl<>(context, - FieldRequiredRule.instance("companyId", CompanySymbolUpdateRequest::getCompanyId, CompanyErrors.RequiredFieldEmpty), + FieldRequiredRule.instance("companyId", CompanySymbolNewRequest::getCompanyId, CompanyErrors.RequiredFieldEmpty), IdPresentRule.instance("companyId", CompanySymbolUpdateRequest::getCompanyId, IMDGDistributedNames.Map_Company, @@ -52,7 +47,7 @@ public class CompanySymbolValidationConfig { // FieldRequiredRule.instance("companySymbol", CompanySymbolUpdateRequest::getCompanySymbol, CompanyErrors.RequiredFieldEmpty), // FieldRequiredRule.instance("companySymbolValue", CompanySymbolUpdateRequest::getCompanySymbolValue, CompanyErrors.RequiredFieldEmpty), DictionaryPresentRule.instance("companySymbol", - CompanySymbolUpdateRequest::getCompanySymbol, + CompanySymbolNewRequest::getCompanySymbol, IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class, CompanyErrors.RequiredFieldEmpty, @@ -104,4 +99,35 @@ public class CompanySymbolValidationConfig { ); }; } + + + @Bean("companySymbolDeleteRequestValidator") + public Function companySymbolDeleteRequestValidator( + Map> imdgForValidation + ) { + return companySymbolDeleteRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(companySymbolDeleteRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Company); + addImdg.accept(IMDGDistributedNames.Map_DocumentTypeDictionary); + addImdg.accept(IMDGDistributedNames.Map_CompanySymbols); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + CommonDeleteRequest::getId, + IMDGDistributedNames.Map_CompanySymbols, + CompanySymbols.class, + CompanyErrors.RequiredFieldEmpty, + CompanyErrors.RecordNotFound, + companySymbol -> { + Imdg companyImdg = context.obtainMap(IMDGDistributedNames.Map_Company, Company.class); + Company company = companyImdg.getSingleObjectByID(companySymbol.getCompanyId()); + if (company == null) { + return CompanyErrors.CompanyNotFound; + } + return null; + }) + ); + }; + } } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java index 5ee1b2778..72a2fc37d 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanyService.java @@ -11,7 +11,6 @@ import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.spcex.clearing.company.error.CompanyErrors; -import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; @@ -20,6 +19,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.CompanySymbol; import ru.spcex.platform.enumeration.UserRole; @@ -46,15 +46,13 @@ public class CompanyService extends QueueConsumer implements InitializingBean { private final ImdgId idSequence; private final Imdg companyIMap; protected UserRoleVerification userRoleVerification; - - private ValidationHelper validationHelper; - private Function companyNewRequestValidator; - private Function companyUpdateRequestValidator; - private Function companyDeleteRequestValidator; - protected CompanySymbolService companySymbolService; protected AccountNotificationHelper accountNotification; protected RelationService relationService; + private final ValidationHelper validationHelper; + private final Function companyNewRequestValidator; + private final Function companyUpdateRequestValidator; + private final Function companyDeleteRequestValidator; @Autowired public CompanyService(Consumer kafkaQueue, Producer kafkaProducer, @@ -134,7 +132,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { try { if (req.getCompanySymbol() != null) { CompanySymbols newSymbol = companySymbolService.createCompanySymbol(transaction, company.getId(), req.getCompanySymbol(), req.getCompanySymbolValue()); - updateCompanyBySymbol(company, newSymbol); + updateCompanyBySymbol(company, newSymbol, false); } company.setWorkflowStatus(req.getWorkflowStatus()); @@ -215,20 +213,26 @@ public class CompanyService extends QueueConsumer implements InitializingBean { return null; } - protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol) { + protected void updateCompanyBySymbol(Company company, CompanySymbols companySymbol, boolean shouldBeDeleted) { assert company.getId().equals(companySymbol.getCompanyId()); + String companySymbolValue = companySymbol.getCompanySymbolValue(); + String setUpValue = shouldBeDeletedOrSet(companySymbolValue, shouldBeDeleted); if (CompanySymbol.TRDC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setTradingCode(companySymbol.getCompanySymbolValue()); + company.setTradingCode(setUpValue); } if (CompanySymbol.CLRC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setClearingCode(companySymbol.getCompanySymbolValue()); + company.setClearingCode(setUpValue); } if (CompanySymbol.RGRC.equalsByKey(companySymbol.getCompanySymbol())) { - company.setRegistrationCode(companySymbol.getCompanySymbolValue()); + company.setRegistrationCode(setUpValue); } } - public synchronized void updateCompanyBySymbol(ImdgTransaction transaction, CompanySymbols companySymbol) throws ClearingBaseException { + private String shouldBeDeletedOrSet(String companySymbol, boolean shouldBeDeleted) { + return shouldBeDeleted ? "" : companySymbol; + } + + public synchronized void updateCompanyBySymbol(ImdgTransaction transaction, CompanySymbols companySymbol, boolean shouldBeDeleted) throws ClearingBaseException { if (companySymbol.getCompanyId() == null) { throw new IllegalArgumentException("Required companySymbol.companyId"); } @@ -241,7 +245,7 @@ public class CompanyService extends QueueConsumer implements InitializingBean { if (company == null) { throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyNotFound, companySymbol.getCompanyId())); } - updateCompanyBySymbol(company, companySymbol); + updateCompanyBySymbol(company, companySymbol, shouldBeDeleted); company.setUpdated(Instant.now()); companyMap.update(company); log.debug("Company {} updated by change CompanySymbols {} ({})", diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java index cf534c0ea..41addee87 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/CompanySymbolService.java @@ -10,20 +10,24 @@ 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.company.CompanySymbols; -import ru.spcex.clearing.util.services.RequestHelper; +import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.UserRole; 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.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.error.ClearingBaseException; import ru.spcex.platform.utils.validation.IValidator; @@ -35,13 +39,13 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB private final Logger log = LoggerFactory.getLogger(getClass()); private final ImdgProvider imdgProvider; private final ImdgId idSequence; - protected CompanyService companyService; - private final RequestHelper requestHelper; + protected CompanyService companyService; protected ValidationHelper validationHelper; protected UserRoleVerification userRoleVerification; - protected Function companySymbolNewRequestValidator; + protected Function companySymbolNewRequestValidator; protected Function companySymbolUpdateRequestValidator; + protected Function companySymbolDeleteRequestValidator; @Autowired public CompanySymbolService(Consumer kafkaQueue, Producer kafkaProducer, @@ -50,7 +54,9 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB ValidationHelper validationHelper, UserRoleVerification userRoleVerification, @Qualifier("companySymbolNewRequestValidator") - Function companySymbolNewRequestValidator, + Function companySymbolNewRequestValidator, + @Qualifier("companySymbolDeleteRequestValidator") + Function companySymbolDeleteRequestValidator, @Qualifier("companySymbolUpdateRequestValidator") Function companySymbolUpdateRequestValidator ) { @@ -64,16 +70,20 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB userRoleVerification.setRoleForVerification(UserRole.Admin); this.companySymbolNewRequestValidator = companySymbolNewRequestValidator; this.companySymbolUpdateRequestValidator = companySymbolUpdateRequestValidator; + this.companySymbolDeleteRequestValidator = companySymbolDeleteRequestValidator; } @Override public void afterPropertiesSet() { - callback(CompanySymbolUpdateRequest.class) + callback(CompanySymbolNewRequest.class) .setFunction(this::companySymbolNew) .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_NEW, callbacks::put); callback(CompanySymbolUpdateRequest.class) .setFunction(this::companySymbolUpdate) .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_UPDATE, callbacks::put); + callback(CommonDeleteRequest.class) + .setFunction(this::companySymbolDelete) + .forDestination(Consts.DESTINATION_COMPANY_SYMBOL_DELETE, callbacks::put); init(); } @@ -82,8 +92,8 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB } - public RequestInfoUpdate companySymbolNew(BaseRequest symbolRequest) { - CompanySymbolUpdateRequest req = symbolRequest.getRequestPayload(); + public RequestInfoUpdate companySymbolNew(BaseRequest symbolRequest) { + CompanySymbolNewRequest req = symbolRequest.getRequestPayload(); log.debug("CompanySymbolNewRequest received, id={}", symbolRequest.getId()); { // validate RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(symbolRequest); @@ -107,7 +117,7 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); companySymbolsTMap.update(companySymbols); try { - companyService.updateCompanyBySymbol(transaction, companySymbols); + companyService.updateCompanyBySymbol(transaction, companySymbols, false); } catch (ClearingBaseException e) { return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); } @@ -141,15 +151,18 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB try { Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); companySymbols = companySymbolsTMap.getSingleObjectByID(req.getId()); -// companySymbols.setCompanySymbol(req.getCompanySymbol()); по ТЗ не должен менятся при обновлении + if (companySymbols == null) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyInfoNotFound, req.getId())); + } + if (!companySymbols.getCompanySymbol().equalsIgnoreCase(req.getCompanySymbolValue())) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.EditCompanySymbols, req.getId())); + } companySymbols.setCompanySymbolValue(req.getCompanySymbolValue()); companySymbolsTMap.update(companySymbols); - try { - companyService.updateCompanyBySymbol(transaction, companySymbols); - } catch (ClearingBaseException e) { - return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); - } + companyService.updateCompanyBySymbol(transaction, companySymbols, false); txOk = true; + } catch (ClearingBaseException e) { + return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); } finally { if (txOk) transaction.commitTransaction(); @@ -161,6 +174,42 @@ public class CompanySymbolService extends QueueConsumer implements InitializingB return null; } + public RequestInfoUpdate companySymbolDelete(BaseRequest symbolRequest) { + CommonDeleteRequest req = symbolRequest.getRequestPayload(); + log.debug("CommonDeleteRequest for CompanySymbol received, id={}", symbolRequest.getId()); + + { // validate + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(symbolRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + + requestInfoUpdate = validationHelper.validateTillFirstError(symbolRequest, companySymbolDeleteRequestValidator); + if (requestInfoUpdate != null) return requestInfoUpdate; + } + CompanySymbols companySymbols; + ImdgTransaction transaction = imdgProvider.newTransaction(); + transaction.beginTransaction(); + boolean txOk = false; + try { + Imdg companySymbolsTMap = transaction.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + companySymbols = companySymbolsTMap.getSingleObjectByID(req.getId()); + if (companySymbols == null) { + throw new ClearingBaseException(new EnumMessage(CompanyErrors.CompanyInfoNotFound, req.getId())); + } + companySymbolsTMap.delete(companySymbols); + companyService.updateCompanyBySymbol(transaction, companySymbols, true); + txOk = true; + } catch (ClearingBaseException e) { + return requestHelper.makeErrorResponse(symbolRequest, e.getEnumMsg()); + } finally { + if (txOk) + transaction.commitTransaction(); + else + transaction.rollbackTransaction(); + } + + log.debug("successfully processed, id {}", companySymbols.getId()); + return null; + } public CompanySymbols createCompanySymbol(ImdgTransaction transaction, Long companyId, String companySymbol, String companySymbolValue) { Objects.requireNonNull(companyId); diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java index 1e15c4986..f8dba7678 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/validation/CompanySymbolOfSymbolNewRequestNotExistRule.java @@ -3,17 +3,12 @@ package ru.spcex.clearing.company.validation; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.spcex.clearing.company.error.CompanyErrors; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanyNewRequest; -import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolUpdateRequest; -import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.clearing.platform.messaging.domain.cud.company.CompanySymbolNewRequest; import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; -import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; -import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -21,10 +16,10 @@ import java.util.Optional; /** * Проверка наличия CompanySymbols с переданными в запросе companySymbol и companyId */ -public class CompanySymbolOfSymbolNewRequestNotExistRule implements IValidationRule> { +public class CompanySymbolOfSymbolNewRequestNotExistRule implements IValidationRule> { @Override - public Optional validate(ImdgValidationContext context) { - CompanySymbolUpdateRequest request = context.getValidatedObject(); + public Optional validate(ImdgValidationContext context) { + CompanySymbolNewRequest request = context.getValidatedObject(); Imdg companySymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java new file mode 100644 index 000000000..610fd1f6a --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/company/CompanySymbolNewRequest.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.company; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class CompanySymbolNewRequest { + @JsonProperty + public Long companyId; + + @JsonProperty + private String companySymbol; + + @JsonProperty + private String companySymbolValue; + + public Long getCompanyId() { + return companyId; + } + + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + public String getCompanySymbol() { + return companySymbol; + } + + public void setCompanySymbol(String companySymbol) { + this.companySymbol = companySymbol; + } + + public String getCompanySymbolValue() { + return companySymbolValue; + } + public void setCompanySymbolValue(String companySymbolValue) { + this.companySymbolValue = companySymbolValue; + } +}