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 4eaef3bb0..155e44c33 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 @@ -50,7 +50,8 @@ public class RelationValidationConfig { IMDGDistributedNames.Map_ClearingCategoryDictionary, ClearingCategoryDictionary.class, CompanyErrors.RequiredFieldEmpty, - CompanyErrors.WrongFieldValue), + CompanyErrors.WrongFieldValue, + false), DictionaryPresentRule.instance("serviceStatus", RelationNewRequest::getServiceStatus, IMDGDistributedNames.Map_ServiceStatusDictionary, 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 dd4b8f2b4..ddaccb5fd 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 @@ -20,14 +20,18 @@ 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.validation.common.ValidationHelper; +import ru.spcex.platform.enumeration.ClearingCategory; 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.validation.IValidator; +import java.util.Objects; import java.util.function.Function; +import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; + @Service public class ClearingMemberCategoryService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -127,9 +131,29 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init log.debug("ClearingMemberCategoryUpdateRequest received"); ClearingMemberCategory clearingMemberCategory = clearingMemberCategoryMap.getSingleObjectByID(req.getId()); + // if (Objects.equals(clearingMemberCategory.getClearingMemberCategory(), req.getClearingMemberCategory())) + String oldClearingMemberCategory = clearingMemberCategory.getClearingMemberCategory(); clearingMemberCategory.setClearingMemberCategory(req.getClearingMemberCategory()); + synchronized (companyService) { + ImdgTransaction transaction = imdgProvider.newTransaction(); + transaction.beginTransaction(); + boolean txOk = false; + try { + //todo сложный кейс с возможным изменением релейшена или пересозданием. Скоро ТЗ доделают. + //companyService.relationService.updateExistRelation(transaction,clearingMemberCategory.getCompanyId(), oldClearingMemberCategory, + // clearingMemberCategory.getClearingMemberCategory()); + companyService.relationService.createNewRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); + Imdg txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + txClearingMemberCategoryMap.insert(clearingMemberCategory); + txOk = true; + } finally { + if (txOk) + transaction.commitTransaction(); + else + transaction.rollbackTransaction(); + } + } - clearingMemberCategoryMap.update(clearingMemberCategory); log.debug("successfully processed, id {}", clearingMemberCategory.getId()); return null; } @@ -145,7 +169,25 @@ public class ClearingMemberCategoryService extends QueueConsumer implements Init log.debug("CommonDeleteRequest received id = {}", req.getId()); ClearingMemberCategory clearingMemberCategory = clearingMemberCategoryMap.getSingleObjectByID(req.getId()); - clearingMemberCategoryMap.delete(clearingMemberCategory); + + synchronized (companyService) { + ImdgTransaction transaction = imdgProvider.newTransaction(); + transaction.beginTransaction(); + boolean txOk = false; + try { + companyService.relationService.cancelRelation(transaction, clearingMemberCategory.getCompanyId(), clearingMemberCategory); + Imdg txClearingMemberCategoryMap = transaction.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + txClearingMemberCategoryMap.delete(clearingMemberCategory); + txOk = true; + } finally { + if (txOk) + transaction.commitTransaction(); + else + transaction.rollbackTransaction(); + } + } + + log.debug("clearingMemberCategory.id={} deleted.", clearingMemberCategory.getId()); return null; } 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 24f42e0f9..6ec94ef56 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 @@ -154,6 +154,7 @@ public class RelationService extends QueueConsumer implements InitializingBean { relation.setId(idSequence.nextId()); relation.setCreated(Instant.now()); relation.setUpdated(relation.getCreated()); + log.debug("New relation.id={}", relation.getId()); } else { log.info("Found exist relation id={}, it will be update.", existRelation.getId()); relation = existRelation; @@ -199,13 +200,17 @@ public class RelationService extends QueueConsumer implements InitializingBean { ) { svc = ru.spcex.platform.enumeration.Service.FOND.getKey(); } else { - log.warn("Unexpected relation Relation={}", clearingMemberCategory); + log.warn("Unexpected relation clearingMemberCategory={}", clearingMemberCategory); return null; } Relation existRelation = relationMap.getSingleObjectByFieldValues(Map.of( "consumerId", consumerId, "service", svc )); + if (existRelation == null) + log.trace("Relation with consumerId={} and service={} not exist.", consumerId, svc); + else + log.trace("Exist relation.id={}", existRelation.getId()); return existRelation; } @@ -285,7 +290,6 @@ public class RelationService extends QueueConsumer implements InitializingBean { protected void createNewRelation(ImdgTransaction transaction, Long companyId, ClearingMemberCategory clearingMemberCategory) { Objects.requireNonNull(companyId, "companyId"); Imdg relationMap = transaction.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); - Relation relation = new Relation(); Company company = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class).getSingleObjectByFieldValues(Map.of("id", companyId)); WorkflowStatus workflowStatus = getEnumByKey(WorkflowStatus.class, company.getWorkflowStatus()); @@ -309,14 +313,59 @@ public class RelationService extends QueueConsumer implements InitializingBean { } } - relation.setCreated(Instant.now()); - relation.setUpdated(relation.getCreated()); + Relation relation = searchRelation(clearingMemberCategory.getClearingMemberCategory(), companyId); + if (relation == null) { + relation = new Relation(); + relation.setId(idSequence.nextId()); + relation.setCreated(Instant.now()); + relation.setUpdated(relation.getCreated()); + log.debug("Create new relation.id={}", relation.getId()); + } else { + relation.setUpdated(Instant.now()); + log.debug("Update exist relation.id={}", relation.getId()); + } relation.setConsumerId(companyId); relation.setSupplierId(SPVB_ID); // 1 СПВБ relation.setServiceStatus(Objects.requireNonNull(workflowStatus).getKey()); relation.setService(serviceStatus); relation.setServiceProduct(ServiceProduct.ZERO.getKey()); - log.debug("New Relation[{}] created.", relation.getId()); + log.debug("New Relation[{}] created by clearingMemberCategory[{}].", relation.getId(), clearingMemberCategory.getId()); + relationMap.insert(relation); + } + + protected void cancelRelation(ImdgTransaction transaction, Long companyId, ClearingMemberCategory clearingMemberCategory) { + Objects.requireNonNull(companyId, "companyId"); + Imdg relationMap = transaction.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + String serviceStatus = null; + if (clearingMemberCategory == null) { + log.warn("clearingMemberCategory not set for companyId={}", companyId); + } else { + ClearingCategory clearingCategory = getEnumByKey(ClearingCategory.class, clearingMemberCategory.getClearingMemberCategory()); + switch (Objects.requireNonNull(clearingCategory)) { + case B: + case I: + case V: + serviceStatus = MKR.getKey(); + break; + case C: + case F: + serviceStatus = FOND.getKey(); + break; + default: + throw new IllegalStateException("Illegal state of clearingCategory"); + } + } + + Relation relation = searchRelation(clearingMemberCategory.getClearingMemberCategory(), companyId); + if (relation == null) { + log.debug("Relation for clearingMemberCategory.id={} {} not found", clearingMemberCategory.getId(), clearingMemberCategory.getClearingMemberCategory()); + return; + } else { + relation.setUpdated(Instant.now()); + log.debug("Update exist relation.id={}", relation.getId()); + } + relation.setServiceStatus(Closed.getKey()); + log.debug("Relation[{}] updated (closed) by clearingMemberCategory[{}].", relation.getId(), clearingMemberCategory.getId()); relationMap.insert(relation); }