From 5cffd474639b432b99ce6893fdd929bf9f0244f8 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Fri, 9 Jun 2023 13:44:10 +0300 Subject: [PATCH] =?UTF-8?q?company-service=20http://jira.mfd.msk:8088/brow?= =?UTF-8?q?se/CLS-347=20MultiCompanyService=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../company/service/MultiCompanyService.java | 155 +++++++++++++-- .../service/ProfileDocumentService.java | 2 +- .../service/MultiCompanyServiceTest.java | 184 ++++++++++++++++++ .../clearing/test/TestObjectCreator.java | 14 ++ 4 files changed, 336 insertions(+), 19 deletions(-) create mode 100644 clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java index 360fa37f4..0511f22f9 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/MultiCompanyService.java @@ -10,7 +10,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.profile.ProfileDocument; import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; @@ -21,7 +24,6 @@ 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; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.error.ValidationException; @@ -29,6 +31,7 @@ import ru.spcex.platform.utils.log.ExceptionUtils; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.Map; /** @@ -55,6 +58,8 @@ public class MultiCompanyService final ImdgProvider imdgProvider; final Imdg companyIMap; final Imdg companySymbolsImdg; + final Imdg profileDocumentImdg; + final Imdg contactImdg; @Autowired public MultiCompanyService(Consumer kafkaQueue, Producer kafkaProducer, @@ -88,6 +93,8 @@ public class MultiCompanyService companyIMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + contactImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Contact, Contact.class); } @Override @@ -106,35 +113,62 @@ public class MultiCompanyService if (requestInfoUpdate != null) return requestInfoUpdate; } - /* - todo: - 1) добавить апдейт кейсы - 2) сделать транзакции. - - */ Long companyId = null; - boolean txOk = false; + boolean txOk = false; // todo IMDG transaction synchronized (companyService) { try { companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany()); log.debug("For request {} (uuid {}) company {}.", baseRequest.getId(), req.getUuid(), companyId == null ? "not found" : ("found, id=" + companyId)); RequestInfoUpdate replyI; - Company company = companyService.createOrUpdateCompany(wrapRequest(baseRequest, req.getCompany()), companyId); + Company company = companyService.createOrUpdateCompany(wrapRequest(baseRequest, req.getCompany(), null), companyId); companyId = company.getId(); log.debug("The companyId={}", companyId); fillCompanyId(req, companyId); - //todo update case: - replyI = companyInfoService.companyInfoUpdate(wrapRequest(baseRequest, req.getCompanyInfo())); + if (req.getCompanyInfo() != null) { + log.trace("For company {} do update CompanyInfo", companyId); + replyI = companyInfoService.companyInfoUpdate(wrapRequest(baseRequest, req.getCompanyInfo(), null)); + validateReply(companyId, "CompanyInfo", replyI); + } for (ProfileDocumentNewRequest partRequest : req.getProfileDocuments()) { - replyI = profileDocumentService.profileDocumentNew(wrapRequest(baseRequest, partRequest)); + ProfileDocument existDocument = findCompanyDocument(partRequest); + if (existDocument == null) { + log.trace("For company[{}] do new profileDocument", companyId); + replyI = profileDocumentService.profileDocumentNew(wrapRequest(baseRequest, partRequest, ActionType.NEW)); + validateReply(companyId, "profileDocumentNew", replyI); + } else { + log.trace("For company[{}] do update profileDocument[{}]", companyId, existDocument.getId()); + ProfileDocumentUpdateRequest partUpdateRequest = createUpdateRequest(existDocument, partRequest); + replyI = profileDocumentService.profileDocumentUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE)); + validateReply(companyId, "profileDocumentUpdate", replyI); + } } for (CompanySymbolNewRequest partRequest : req.getCompanySymbols()) { - replyI = companySymbolService.companySymbolNew(wrapRequest(baseRequest, partRequest)); + CompanySymbols existSymbol = findCompanySymbols(partRequest); + if (existSymbol == null) { + log.trace("For company[{}] do new companySymbol", companyId); + replyI = companySymbolService.companySymbolNew(wrapRequest(baseRequest, partRequest, ActionType.NEW)); + validateReply(companyId, "companySymbolNew", replyI); + } else { + log.trace("For company[{}] do update companySymbol[{}]", companyId, existSymbol.getId()); + CompanySymbolUpdateRequest partUpdateRequest = createUpdateRequest(existSymbol, partRequest); + replyI = companySymbolService.companySymbolUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE)); + validateReply(companyId, "companySymbolUpdate", replyI); + } } for (ContactNewRequest partRequest : req.getContacts()) { - replyI = contactService.contactNew(wrapRequest(baseRequest, partRequest)); + Contact existContact = findContact(partRequest); + if (existContact == null) { + log.trace("For company[{}] do new contact", companyId); + replyI = contactService.contactNew(wrapRequest(baseRequest, partRequest, ActionType.NEW)); + validateReply(companyId, "contactNew", replyI); + } else { + log.trace("For company[{}] do update contact[{}]", companyId, existContact.getId()); + ContactUpdateRequest partUpdateRequest = createUpdateRequest(existContact, partRequest); + replyI = contactService.contactUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE)); + validateReply(companyId, "contactUpdate", replyI); + } } txOk = true; } catch (ValidationException vex) { @@ -151,6 +185,83 @@ public class MultiCompanyService return null; } + void validateReply(Long companyId, String process, RequestInfoUpdate replyI) { + if (replyI != null && replyI.getMessage() != null) { + log.warn("Error process {} for companyId={}: {}", process, companyId, replyI.getMessage()); + } + } + + ProfileDocument findCompanyDocument(ProfileDocumentNewRequest partRequest) { + Map> query = new HashMap<>(); + query.put("companyId", partRequest.getCompanyId()); + query.put("documentType", partRequest.getDocumentType()); + query.put("issueDate", partRequest.getIssueDate()); // может быть null + Collection allDoc = profileDocumentImdg.getCollectionObjectsByFieldValues(query); + if (allDoc.isEmpty()) + return null; + if (allDoc.size() > 1) + log.warn("Fount {} ProfileDocument by: {}", allDoc.size(), query); + return allDoc.iterator().next(); + } + + CompanySymbols findCompanySymbols(CompanySymbolNewRequest partRequest) { + Map> query = new HashMap<>(); + query.put("companyId", partRequest.getCompanyId()); + query.put("companySymbol", partRequest.getCompanySymbol()); + Collection allCS = companySymbolsImdg.getCollectionObjectsByFieldValues(query); + if (allCS.isEmpty()) + return null; + if (allCS.size() > 1) + log.warn("Fount {} CompanySymbols by: {}", allCS.size(), query); + return allCS.iterator().next(); + } + + Contact findContact(ContactNewRequest partRequest) { + Map> query = new HashMap<>(); + query.put("companyId", partRequest.getCompanyId()); + query.put("contactType", partRequest.getContactType()); + Collection allCS = contactImdg.getCollectionObjectsByFieldValues(query); + if (allCS.isEmpty()) + return null; + if (allCS.size() > 1) + log.warn("Fount {} Contact by: {}", allCS.size(), query); + return allCS.iterator().next(); + } + + ProfileDocumentUpdateRequest createUpdateRequest(ProfileDocument existDocument, ProfileDocumentNewRequest partRequest) { + ProfileDocumentUpdateRequest r = new ProfileDocumentUpdateRequest(); + r.setId(existDocument.getId()); + r.setCompanyId(partRequest.getCompanyId()); + r.setDocumentType(partRequest.getDocumentType()); + r.setIssueDate(partRequest.getIssueDate()); + r.setIssuePlace(partRequest.getIssuePlace()); + r.setIssuer(partRequest.getIssuer()); + r.setIssuerCode(partRequest.getIssuerCode()); + r.setName(partRequest.getName()); + r.setNumber(partRequest.getNumber()); + r.setPlace(partRequest.getPlace()); + r.setValidFromDate(partRequest.getValidFromDate()); + r.setValidToDate(partRequest.getValidToDate()); + r.setLink(partRequest.getLink()); + return r; + } + + CompanySymbolUpdateRequest createUpdateRequest(CompanySymbols existSymbol, CompanySymbolNewRequest partRequest) { + CompanySymbolUpdateRequest r = new CompanySymbolUpdateRequest(); + r.setId(existSymbol.getId()); + r.setCompanyId(partRequest.getCompanyId()); + r.setCompanySymbol(partRequest.getCompanySymbol()); + r.setCompanySymbolValue(partRequest.getCompanySymbolValue()); + return r; + } + + ContactUpdateRequest createUpdateRequest(Contact existContact, ContactNewRequest partRequest) { + ContactUpdateRequest r = new ContactUpdateRequest(); + r.setId(existContact.getId()); + r.setContactType(partRequest.getContactType()); + r.setContactValue(partRequest.getContactValue()); + return r; + } Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) { CompanySymbols companySymbol = null; @@ -190,10 +301,14 @@ public class MultiCompanyService return null; } - private BaseRequest wrapRequest(BaseRequest template, T payload) { + private BaseRequest wrapRequest(BaseRequest template, T payload, ActionType action) { BaseRequest r = new BaseRequest<>(); r.setId(template.getId()); - r.setActionType(template.getActionType()); // todo? + if (action == null) { + r.setActionType(template.getActionType()); + } else { + r.setActionType(action); + } r.setUserId(template.getUserId()); r.setCorrelationId(template.getCorrelationId()); r.setRequestPayload(payload); @@ -201,8 +316,12 @@ public class MultiCompanyService } void fillCompanyId(MultiCompanyRequest req, Long companyId) { - req.getCompany().setId(companyId); - req.getCompanyInfo().setId(companyId); + if (req.getCompany() != null) { + req.getCompany().setId(companyId); + } + if (req.getCompanyInfo() != null) { + req.getCompanyInfo().setId(companyId); + } if (req.getCompanySymbols() == null) req.setCompanySymbols(new ArrayList<>()); if (req.getClientCodes() == null) req.setClientCodes(new ArrayList<>()); if (req.getProfileDocuments() == null) req.setProfileDocuments(new ArrayList<>()); diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java index af4c24586..8a548c097 100644 --- a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java @@ -168,7 +168,7 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin } - private RequestInfoUpdate profileDocumentUpdate(BaseRequest profileDocumentUpdateRequestBaseRequest) { + protected RequestInfoUpdate profileDocumentUpdate(BaseRequest profileDocumentUpdateRequestBaseRequest) { log.trace("Start processing ProfileDocumentUpdateRequest!"); RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(profileDocumentUpdateRequestBaseRequest); diff --git a/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java new file mode 100644 index 000000000..9535bc82c --- /dev/null +++ b/clearing-parent/company-service/src/test/java/ru/spcex/clearing/company/service/MultiCompanyServiceTest.java @@ -0,0 +1,184 @@ +package ru.spcex.clearing.company.service; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.company.CompanySymbols; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.clearing.platform.dictionary.CompanySymbolDictionary; +import ru.clearing.platform.dictionary.WorkflowStatusDictionary; +import ru.spcex.clearing.company.config.BeanConfiguration; +import ru.spcex.clearing.company.config.validation.*; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.company.*; +import ru.spcex.clearing.test.config.ImdgTestConfig; +import ru.spcex.clearing.test.config.KafkaTestConfig; +import ru.spcex.platform.enumeration.CompanySymbol; +import ru.spcex.platform.enumeration.ContactTypes; +import ru.spcex.platform.enumeration.DocumentTypes; +import ru.spcex.platform.enumeration.WorkflowStatus; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import javax.annotation.PostConstruct; + +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + MultiCompanyService.class, + + CompanyService.class, + CompanyValidationConfig.class, + ValidationConfig.class, + CompanySymbolService.class, + AccountNotificationHelper.class, + RelationService.class, RelationValidationConfig.class, + + CompanySymbolService.class, + CompanySymbolValidationConfig.class, + CompanyInfoService.class, + ProfileDocumentService.class, + ProfileDocumentValidationConfig.class, + ContactService.class, + ContactValidationConfig.class, + + KafkaTestConfig.class, + ImdgTestConfig.class, + BeanConfiguration.class}) +class MultiCompanyServiceTest { + final Long COMPANY_ID = 123L; + + @Autowired + protected MultiCompanyService multiCompanyService; + + @Autowired + @Qualifier("hazelcastServiceTest") + private ImdgProvider hazelcastServiceTest; + + @PostConstruct + private void init() { + waitAvailableImdgProviderAndAddAdminWithDefaultId(); + Imdg companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class); + Imdg companySymbolsImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + + Company company = new Company(); + company.setId(COMPANY_ID); + company.setWorkflowStatus(WorkflowStatus.Active.getKey()); + company.setFullName("Test company prime"); + companyImdg.insert(company); + + + Imdg companySymbolDictionaryImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class); + { + CompanySymbolDictionary cSymbol = new CompanySymbolDictionary(); + cSymbol.setId(11L); + cSymbol.setCode(CompanySymbol.CLRC.getKey()); + cSymbol.setName(CompanySymbol.CLRC.getKey()); + cSymbol.setShortname(" CLRC key"); + companySymbolDictionaryImdg.insert(cSymbol); + CompanySymbolDictionary cioSymbol = new CompanySymbolDictionary(); + cioSymbol.setId(22L); + cioSymbol.setCode(CompanySymbol.CIO.getKey()); + cioSymbol.setName(CompanySymbol.CIO.getKey()); + companySymbolDictionaryImdg.insert(cioSymbol); + } + + Imdg contactImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Contact, Contact.class); + Contact contact = new Contact(); + contact.setId(100L); + contact.setCompanyId(company.getId()); + contact.setContactType(ContactTypes.adrs.getKey()); + contact.setContactValue("UAR, st.Uarus, anystreet st., house 1"); + contactImdg.insert(contact); + + CompanySymbols companySymbol = new CompanySymbols(); + companySymbol.setId(222L); + companySymbol.setCompanyId(company.getId()); + companySymbol.setCompanySymbol(CompanySymbol.CLRC.getKey()); + companySymbol.setCompanySymbolValue("CL-VALUE"); + companySymbolsImdg.insert(companySymbol); + + Imdg profileDocumentImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + ProfileDocument doc = new ProfileDocument(); + doc.setId(10002L); + doc.setCompanyId(COMPANY_ID); + doc.setDocumentType(DocumentTypes.form.getKey()); + doc.setIssueDate(LocalDate.now()); // тест может показать ложное срабатывание в 00:00:00.001 + profileDocumentImdg.insert(doc); + } + + @Test + void findCompanyDocument() { + ProfileDocumentNewRequest req = new ProfileDocumentNewRequest(); + req.setCompanyId(COMPANY_ID); + req.setDocumentType(DocumentTypes.form.getKey()); + req.setIssueDate(LocalDate.now()); + ProfileDocument doc = multiCompanyService.findCompanyDocument(req); + assertNotNull(doc); + } + + @Test + void findCompanySymbols() { + CompanySymbolNewRequest req = new CompanySymbolNewRequest(); + req.setCompanyId(COMPANY_ID); + req.setCompanySymbol(CompanySymbol.CLRC.getKey()); + req.setCompanySymbolValue("CL-VALUE-2"); + CompanySymbols symbol = multiCompanyService.findCompanySymbols(req); + assertNotNull(symbol); + assertEquals("CL-VALUE", symbol.getCompanySymbolValue()); + } + + @Test + void findContact() { + ContactNewRequest req = new ContactNewRequest(); + req.setCompanyId(COMPANY_ID); + req.setContactType(ContactTypes.adrs.getKey()); + req.setContactValue("UAR, st.Uarus, anystreet st., house 2"); + Contact contact = multiCompanyService.findContact(req); + assertNotNull(contact); + assertNotEquals(req.getContactValue(), contact.getContactValue()); + } + + @Test + void getCompanyIdForCompanySymbols() { + CompanyNewRequest req = new CompanyNewRequest(); + req.setCompanySymbol(CompanySymbol.CLRC.getKey()); + req.setCompanySymbolValue("CL-VALUE"); + Long theId = multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req); + assertEquals(COMPANY_ID, theId); + } + + @Test + void fillCompanyId() { + { + MultiCompanyRequest testReq = new MultiCompanyRequest(); + testReq.setCompany(new CompanyNewRequest()); + testReq.setProfileDocuments(null); + testReq.setCompanySymbols(null); + testReq.setContacts(null); + testReq.setClientCodes(null); + multiCompanyService.fillCompanyId(testReq, COMPANY_ID); + assertEquals(COMPANY_ID, testReq.getCompany().getId()); + assertNotNull(testReq.getProfileDocuments()); + assertNotNull(testReq.getCompanySymbols()); + assertNotNull(testReq.getContacts()); + assertNotNull(testReq.getClientCodes()); + } + { + MultiCompanyRequest testReq = new MultiCompanyRequest(); + testReq.setCompany(new CompanyNewRequest()); + testReq.setCompanyInfo(new CompanyInfoUpdateRequest()); + multiCompanyService.fillCompanyId(testReq, COMPANY_ID); + assertEquals(COMPANY_ID, testReq.getCompany().getId()); + } + } +} \ No newline at end of file diff --git a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/TestObjectCreator.java b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/TestObjectCreator.java index 84468145f..1cb6d557f 100644 --- a/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/TestObjectCreator.java +++ b/clearing-parent/test-clearing/src/main/java/ru/spcex/clearing/test/TestObjectCreator.java @@ -38,4 +38,18 @@ public class TestObjectCreator { userRoleSession.setStatus(WorkflowStatus.Active.getKey()); userRoleSessionImdg.insert(userRoleSession); } + +// public void fillWorkflowStatusDictionary() { +// Imdg workflowStatusDictionaryImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, WorkflowStatusDictionary.class); +// WorkflowStatusDictionary ws1 = new WorkflowStatusDictionary(); +// ws1.setId(1L); +// ws1.setCode(WorkflowStatus.Active.getKey()); +// ws1.setName("Active"); +// workflowStatusDictionaryImdg.insert(ws1); +// WorkflowStatusDictionary ws2 = new WorkflowStatusDictionary(); +// ws2.setId(2L); +// ws2.setCode(WorkflowStatus.Blocked.getKey()); +// ws2.setName("Blocked"); +// workflowStatusDictionaryImdg.insert(ws2); +// } }